Import funkcji z tablicą łańuchów w standardzie C

0

Mam bibliotekę DLL WinApi api_scilab.dll. Jest w niej eksportowana funkcja postaci:

SciErr createNamedMatrixOfString(void* _pvCtx, char* _pstName, int _iRows, int _iCols, char** _pstStrings);

Chciałem importować tą funkcję. Napisałem tak:

 [DllImport(API_SCILAB_DLL, CharSet = CharSet.Ansi]
public static extern api_Err createNamedMatrixOfString([In]IntPtr pvApiCtx, [In] String _pstName,[In] int _iRows, [In] int _iCols,[In] String[] _pstStrings);

Zbudowałem aplikację testową. Tablica łańcuchów zawierała polskie znaki dialektyczne. Nie zostały wyświetlone poprawnie. :-(
Gdy łańcuchy zawierały znaki alfabetu łacińskiego - wszystko OK.
Kombinowałem z innymi wartościami atrybutu CharSet. Bezskutecznie. Próbowałem też

 [DllImport(API_SCILAB_DLL, CharSet = CharSet.Ansi, ExactSpelling = true)]
public static extern api_Err createNamedMatrixOfString([In]IntPtr pvApiCtx, [In] String _pstName,[In] int _iRows, [In] int _iCols,[In] String[] _pstStrings);

Utworzyłem bibliotekę:

[DllImport(API_SCILAB_DLL, CharSet = CharSet.Ansi, ExactSpelling = true)]
public static extern api_Err createNamedMatrixOfString([In]IntPtr pvApiCtx, [In] String _pstName,[In] int _iRows, [In] int _iCols,[In] String[] _pstStrings);
public static int UtworzMacierzLancuchow(string nazwa_macierzy, int liczbaWierszy, int liczbaKolumn, string[] tablicaLan)
        {
            System.IntPtr wskaznik = new System.IntPtr();
            api_Err wynik = sci.createNamedMatrixOfString(wskaznik, nazwa_macierzy, liczbaWierszy, liczbaKolumn, tablicaLan);
            return wynik.iErr;
        }

oraz aplikację testową z ustawioną referencją do tej biblioteki:

static void Main(string[] args)
        {
            Console.WindowWidth = 120;
            Console.Title = "Test Scilab-a";
            Console.BackgroundColor = ConsoleColor.Green;
            Console.ForegroundColor = ConsoleColor.DarkBlue;
            Console.Clear();
            Console.WriteLine("Test scilab-a");
            int wynik = sci.StartScilab(null, null, null);
            if (wynik == 1)
                Console.WriteLine("Załadowano silnik Scilab-a");
            string[] tablica = new string[] { "Żółta", "Przyjaźń", "Krótką gęś", "zgniła nić" };
            string[] t = new string[] { "bez", "znak", "dialektycznych", "jest ok?" };
            Console.WriteLine("Utworzono przykładową tablicę łańcuchów");
            Console.WriteLine("Element macierzy 0: " + tablica[0]);
            Console.WriteLine("Element macierzy 1: " + tablica[1]);
            Console.WriteLine("Element macierzy 2: " + tablica[2]);
            Console.WriteLine("Element macierzy 3: " + tablica[3]);
            Console.WriteLine("Próba utworzenia macierzy łańcuchów w środowisku Scilab - UtworzMacierzLancuchow");
            wynik = sci.UtworzMacierzLancuchow("I1", 2, 2, tablica);
            Console.WriteLine("wynik metody: " + wynik.ToString());
            Console.WriteLine("Próba wyświetlenia zmiennej - disp(I2)");
            wynik = sci.SendScilabJob("disp(I1)");
            Console.WriteLine("wynik metody: " + wynik.ToString() + " Wartość 0 -OK");
            Console.WriteLine();
..........

Tablica łańuchów nie jest wyświetlana poprawnie. Co robię nie tak?

0

Znaki przekazywane sa jako unicode, czy jestes pewien, ze biblioteka wlasnie takich oczekuje?

0

Nie, znaki tu nie są przekazywane jako unicode, zwłaszcza że jest jawnie ustawiany charset ansi. Zresztą zrobiłem mały test z przekazywaniem stringa z C# do dll-ki w Pascalu, gdzie DLL jawnie i na pewno oczekuje 8-bitowego c-stringa. Polskie litery przechodzą bez problemu, i to niezależnie czy plik źródłowy C# jest zapisany w cp1250 czy w UTF-8. Wstrzymałem się z odpowiedzią, gdyż to nic nie wniosło do problemu - poza tym że "powinno działać".
Problem jest prawdopodobnie po stronie scilaba.

0

Próbowałem wyświetlać zawartość macierzy łańcuchów i zapisać do binarnego pliku - skutek ten sam. Jest to biblioteka C++ zatem oczekuje 8-bitowego łańcucha. Chyba faktycznie problem leży po stronie Scilab-a.

0

Faktycznie, nie zauwazylem tego ANSI.

1 użytkowników online, w tym zalogowanych: 0, gości: 1