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?