Здравствуйте, Walth, Вы писали:
W>Всем доброго времени суток!
W>Кто нибудь подскажет как правильно импортировать функцию
W>function clErrorMsg(ErrNo: integer): shortstring; stdcall;
W>в VC++
W> я делаю так
W> typedef char* (CALLBACK *PFN_clErrorMsg)(int ErrNo);
W> PFN_clErrorMsg pfnclErrorMsg;
W> Что неправильно? Как я подозреваю что-то не так с возвращаемым значением.
W> Только ума не приложу как shortstring принять в C.
Всё неправильно. Тип shortstring не предназначен для работы через границу DLL. Собственно, он и в Delphi-то остался только для совместимости со старым Turbo Pascal’евским кодом.
Функция, экспортируемая из DLL и возвращающая в результате строку, должна принимать на вход указатель на буфер и размер его. Как-нибудь так:
procedure clErrorMsg(ErrNo: INT; buf: PCHAR; bufSize: DWORD); stdcall; export;
typedef void (__stdcall *pfErrorMsg)(INT errNo, PCHAR buf, DWORD bufSize);
Далее следует немного ссылок, пользуясь которыми, можно сделать изврат, который будет работать на одной конкретной версии компилятора Delphi.
Delphi 7 Help, ключевые слова "functions, returning results":
For a string, dynamic array, method pointer, or variant result, the effects are the same as if the function result were declared as an additional var parameter following the declared parameters. In other words, the caller passes an additional 32-bit pointer that points to a variable in which to return the function result.
Delphi 7 Help, ключевые слова "short strings:ShortString":
A ShortString is 0 to 255 characters long. While the length of a ShortString can change dynamically, its memory is a statically allocated 256 bytes; the first byte stores the length of the string, and the remaining 255 bytes are available for characters.