在Delphi中查看Windows.pas文件时,我发现有几个签名,如LoadLibrary (A) or (W)
用于加载特定模块。它们之间有什么区别,我能相信始终调用LoadLibrary来适用于所有类型的Windows平台吗?
在Delphi中查看Windows.pas文件时,我发现有几个签名,如LoadLibrary (A) or (W)
用于加载特定模块。它们之间有什么区别,我能相信始终调用LoadLibrary来适用于所有类型的Windows平台吗?
A
) 或 Unicode 字符串 (W
)。在内部,Windows API 两种字符串都可用。然而,Delphi 默认使用其中一种,这取决于 Delphi 版本。许多其他 Windows 语言也是如此。该语言将 ANSI 或 Unicode 字符串用作默认值。A
后缀的 ANSI API 调用,因为当时 Delphi 主要使用 ANSI 字符串。从 Delphi 2009 开始,Unicode 已被强制执行。这也使默认的 API 调用变为 Unicode,使用 W
作为后缀。在 Delphi 中一直支持 Unicode,但自 2009 年以来,它已被强制执行为默认值,优先于 ANSI。在那些旧版本中,诸如 LoadLibrary
的函数映射到 ANSI 版本的 LoadLibraryA
。 LoadLibrary
可作为 LoadLibraryA
或 LoadLibraryW
使用。 Windows.h
还提供了一个通用的 LoadLibrary
函数,它在内部使用首选的Unicode版本。 A
和 W
之间的区别为开发人员提供了向后兼容的选项,与Microsoft的许多产品一样。如果语言主要是ANSI字符串,则可以明确使用Unicode。或者,如果语言主要是Unicode,则可以明确使用ANSI。
长话短说,在某个时候,Windows本身从ANSI字符串切换到Unicode字符串作为默认设置。但仍提供向后兼容性。稍后的Delphi版本已更改为使用首选默认设置-在这种情况下,它们是Unicode。
总结一下:
您可以在这里了解更多有关微软介绍Unicode的信息,以及此处。
Winapi.Windows
时,我没有看到我实际期望的映射 - 它是直接的... 当查看 WinAPI 文档时,它解释说有一个通用版本可用:https://msdn.microsoft.com/en-us/library/windows/desktop/dd374089(v=vs.85).aspx - Jerry Dodge#define UNICODE
便可以将通用函数变为W函数,否则它们将为A函数。Delphi不支持这种条件编译,因此映射基于Delphi版本设置。如果在Windows.pas中找不到通用的 LoadLibrary
,请检查一些其他单位。 - Rob KennedyWinapi.Windows
中 Pascal 告诉我的内容。所以这一切都与 Delphi 在后台导入 Windows API 的方式有关。 - Jerry Dodge#ifdef UNICODE
#define LoadLibrary LoadLibraryW
#else
#define LoadLibrary LoadLibraryA
#endif
TCHAR
的字符串调用通用的LoadLibrary()
“函数”时,只需更改项目设置而不是更改源代码,即可为任一环境编译和链接该应用程序。例如:HMODULE hLib = LoadLibrary(TEXT("filename"));
// calls either LoadLibraryA("filename") or LoadLibraryW(L"filename")
// depending on whether UNICODE is defined while compiling...
function LoadLibraryA(const lpFileName: PAnsiChar): HMODULE; stdcall; external kernel32 name 'LoadLibraryA';
function LoadLibraryW(const lpFileName: PWideChar): HMODULE; stdcall; external kernel32 name 'LoadLibraryW';
Delphi不支持预处理宏,因此将LoadLibrary()
声明为导入与Delphi的通用PChar
类型匹配的任何DLL函数的函数。 因此,在Delphi 2007及之前,其中PChar
是PAnsiChar
,LoadLibrary()
被声明为导入LoadLibraryA()
,并且在Delphi 2009及以后,其中PChar
是PWideChar
,LoadLibrary()
被声明为导入LoadLibraryW()
。
// Delphi 2007 and earlier...
function LoadLibrary(const lpFileName: PChar): HMODULE; stdcall; external kernel32 name 'LoadLibraryA';
// Delphi 2009 and later...
function LoadLibrary(const lpFileName: PChar): HMODULE; stdcall; external kernel32 name 'LoadLibraryW';
PChar
来调用通用的LoadLibrary()
函数时,它可以在多个版本的Delphi中编译而无需更改源代码。hLib := LoadLibrary(PChar(filename));
// calls either LoadLibraryA(PAnsiChar(filename) or LoadLibraryW(PWideChar(filename))
// depending on whether Delphi natively uses Ansi or Unicode strings...
这些因素适用于任何TCHAR
基于API,不仅限于特定的LoadLibrary()
。当给定的Win32 API支持A
和W
版本时,MSDN会以其通用的TCHAR
版本来记录它。请记住,Win32 API早于Unicode,而TCHAR
是Microsoft在Windows NT首次引入Unicode API时迁移开发人员从Ansi API到Unicode API的解决方案,同时仍允许开发人员支持较早的Windows版本。为了向后兼容传统应用程序,现代Windows版本中仍支持现有的Ansi API,尽管已被放弃,推荐使用Unicode API。新引入的API倾向于只支持Unicode。
TCHAR
是 C++ 运行时的一部分,而不是 Win32。 - David Heffernan_TCHAR
。TCHAR
是 Win32 的等效物。 - Remy LebeauTCHAR
由MSVC运行时库在tchar.h
头文件中定义。但是,MS通过在winnt.h
中再次定义它来混淆问题。唉。我认为TCHAR
是MSVC库。我本应该什么也不说。对不起。 - David Heffernan