Хотелось бы уточнить следующее, например, api функция CreateFile декларирована как:
В Inno, если с точностью перевести, выглядит так:
Прошу обратить внимание, что в первом параметре функции должен использоваться именно указатель PChar/PAnsiChar, по декларации никак не String.
Значит, ANSI версия компилятора может использовать только A версию api функций.
В Unicode можно использовать и A и W, но при использовании указателя Unicode версия Inno не понимает PChar и не имеет поддержки PWideChar, только PAnsiChar, которую понимает и ANSI версия компиля соответственно.
Предположим, что указатель в первом параметре функции, мы можем заменить строкой String или совместимой AnsiString: lpFileName: AnsiString;
Тогда возникает вопрос о целесообразности использования строк string и ansistring для Unicode версии компиля с использованием W api. Ведь Unicode версия недокументорованно поддерживает WideString, и тогда по логике мы должны использовать ее для W версии api:
Неясным остается момент, что корректнее использовать в W api как строку: String или WideString? Может в каких-то определенных случаях есть разница?
C++:
HANDLE WINAPI CreateFile(
_In_ LPCTSTR lpFileName,
_In_ DWORD dwDesiredAccess,
_In_ DWORD dwShareMode,
_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
_In_ DWORD dwCreationDisposition,
_In_ DWORD dwFlagsAndAttributes,
_In_opt_ HANDLE hTemplateFile
);
Код:
function CreateFile(lpFileName: PAnsiChar; dwDesiredAccess: DWORD; dwShareMode: DWORD; lpSecurityAttributes: DWORD; dwCreationDisposition: DWORD; dwFlagsAndAttributes: DWORD; hTemplateFile: THandle): THandle;
external 'CreateFileA@kernel32.dll stdcall';
Значит, ANSI версия компилятора может использовать только A версию api функций.
В Unicode можно использовать и A и W, но при использовании указателя Unicode версия Inno не понимает PChar и не имеет поддержки PWideChar, только PAnsiChar, которую понимает и ANSI версия компиля соответственно.
Предположим, что указатель в первом параметре функции, мы можем заменить строкой String или совместимой AnsiString: lpFileName: AnsiString;
Тогда возникает вопрос о целесообразности использования строк string и ansistring для Unicode версии компиля с использованием W api. Ведь Unicode версия недокументорованно поддерживает WideString, и тогда по логике мы должны использовать ее для W версии api:
Код:
function CreateFile(lpFileName: WideString; dwDesiredAccess: DWORD; dwShareMode: DWORD; lpSecurityAttributes: DWORD; dwCreationDisposition: DWORD; dwFlagsAndAttributes: DWORD; hTemplateFile: THandle): THandle;
external 'CreateFileW@kernel32.dll stdcall';
Последнее редактирование: