LPTSTR
- это просто указатель на сырые данные символа. Эквивалент Delphi равен PAnsiChar
или PWideChar
, в зависимости от того, была ли DLL скомпилирована для Ansi или Unicode. LPTSTR
всегда Ansi в Delphi 2007 и ранее (включая Delphi 7) и всегда Unicode в Delphi 2009 и более поздних версиях, поэтому вам, возможно, придется это учитывать. Если DLL была скомпилирована для Unicode, вам нужно будет ue PWideChar
вместо LPTSTR
. Таким образом, лучше использовать PAnsiChar
и PWideChar
вместо LPTSTR
во избежание несоответствий между различными средами (если DLL не экспортирует отдельные версии функции для обоих типов, как это делает большинство функций Win32 API).
Кроме того, в зависимости от фактического вызова, используемого DLL, функция может использовать cdecl
или stdcall
. В отсутствие явного соглашения о вызове большинство компиляторов C/C++ используют cdecl
, но они могут так же легко использовать stdcall
и просто не документировать его. Поэтому вам нужно выяснить, потому что он делает разницу BIG, потому что cdecl
и stdcall
имеют разную семантику для управления стеками и прохождения параметров.
Таким образом, с тем, что правильная декларация функция будет либо:
function GetErrorString(lErrorNumber: Integer): PAnsiChar; cdecl; external 'filename.dll';
Или:
function GetErrorString(lErrorNumber: Integer): PWideChar; cdecl; external 'filename.dll';
Или:
function GetErrorString(lErrorNumber: Integer): PAnsiChar; stdcall; external 'filename.dll';
Или:
function GetErrorString(lErrorNumber: Integer): PWideChar; stdcall; external 'filename.dll';
Вам нужно будет провести некоторое исследование, чтобы выяснить, использует ли DLL Ansi или Unicode, использует ли он cdecl
или stdcall
, если в документации не указано конкретно эта информация.