Deklarowanie typów w metodach extern z obcych dll'ek

0

Witam.
Mam dll'kę napisaną chyba w Borland C a w niej funkcję opisaną w dokumentacji następująco:

EXTERN_API int WINAPI ReadMessage(int Com ,int nBlock,int Encrypt,int* DBCardno,int* DBCardtype,int* DBPassLevel,
char* CardPass,char* DBSystemcode,char* DBAddress, char* SDateTime);

W jaki sposób mam ją zadeklarować (chodzi mi o typ char*) aby metoda ta zwracała w parametrach typu char* dane?
typ int* deklaruję jako "out int" i metoda zwraca prawidłowo dane. Natomiast typ char* próbowałem deklarować jako "[MarshalAs(UnmanagedType.LPStr)] StringBuilder" i zwraca mi jakieś głupoty, tak jakby źle był zdefiniowany typ.

Z góry dzięki za pomoc.

0

Czy te wskaźniki int* i char* to są parametry wejściowe czy wyjściowe? (jeśli tylko wejściowe, to dlaczego nie mają const...)
Zakładam że char* to są C-stringi, ale czy int* wskazują na jednego inta czy na tablicę?

0

Wszystkie int* i char* są parametrami wyjściowymi. int* działają prawidłowowo (zwracają odpowiednie dane) natomiast parametry typu char* zwracają niepełne dane lub nie zwracają nic. A mają zwracać stringi.

0

najlepiej pokaż przykład użycia funkcji w C. jak duży bufor powinien być podawany do tych charów?

będzie to coś tego typu:

int ReadMessage(int Com, int nBlock, int Encrypt, out int DBCardno, out int DBCardtype, out int DBPassLevel, [out] StringBuilder CardPass, [out] StringBuilder DBSystemcode, [out] StringBuilder DBAddress, [out] StringBuilder SDateTime);
var pass = new StringBuilder(255); // podajemy rozmiar bufora
/* tak samo pozostałe */
int result = ReadMessage(123, 123, 123, out cardno, out cardtype, out level, pass, code, address, datetime);
0

Niestety nie pomogło.
Gdy użyję deklaracji zwrotu (out) przy parametrach typu StringBuilder wywala mi błąd "Attempted to read or write protected memory. This is often an indication that other memory is corrupt.". Natomiast gdy ich nie użyję to mam zwracane te same dane co poprzednio, czyli łańcuch pusty lub niepełne dane.

0

I jeszcze dodam, że niestety nie mam kodu źródłowego tej metody. Dlatego nie wiem też do końca jak ona działa. Mam tylko dokumentację z której niewiele wynika.

0

Znalazłem rozwiązanie problemu. Okazało się, że metoda nie zwraca wartości w dwóch ostatnich parametrach. Po prostu nie są one obsłużone poprawnie. Zamykam temat.

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