Cai*_*ira 3 windows delphi winapi
在Delphi中查看Windows.pas,我发现LoadLibrary (A) or (W)加载特定模块有几个签名.它们之间有什么区别,我是否可以信任为所有类型的Windows平台调用LoadLibrary?
Jer*_*dge 11
Windows API提供ANSI字符串(A)或Unicode字符串(W).在整体上,Windows API都可用.但是,根据Delphi的版本,Delphi默认为其中一个或另一个.许多其他Windows语言也这样做.该语言使用ANSI或Unicode字符串作为默认值.
在2009年之前的Delphi版本中,使用了ANSI API调用,后缀为A.那是Delphi主要使用ANSI字符串的时候.从Delphi 2009及更高版本开始,Unicode已得到强制执行.这也使默认的API调用Unicode,后缀为W.Delphi一直支持Unicode,但截至2009年,它已被强制执行,优于ANSI.在那些旧版本中,功能如LoadLibrary映射到ANSI版本LoadLibraryA.
您所指的特定API调用LoadLibrary可用作LoadLibraryA或者LoadLibraryW.Windows.h还提供了一个通用LoadLibrary函数,它在内部使用首选的Unicode版本.在A和W差异为开发人员提供向后兼容性的选项,与许多微软的产品.如果语言主要是ANSI字符串,则可以显式使用Unicode.或者,如果语言主要是Unicode,则可以显式使用ANSI.
简而言之,Windows本身在某一点上默认从ANSI字符串切换到Unicode字符串.但仍提供向后兼容性.后来的Delphi版本已被更改为使用任何首选默认值 - 在这种情况下,它们是Unicode.
总结一下:
您可以在此处以及此处了解有关Microsoft的Unicode介绍的更多信息.
为什么在Delphi XE2 LoadLibrary和LoadLibraryW中它们在Windows中是相同的api?
为了与Win32 API和各种教程/示例兼容,以及与Ansi和Unicode版本的Delphi兼容.
Win32 API仅将LoadLibraryA()(Ansi)和LoadLibraryW()(Unicode)定义为实际函数(从kernel32.dll导出). LoadLibrary()它根本不是一个函数,它是一个预处理器宏(在winbase.h其中定义)映射到LoadLibraryA()或者LoadLibraryW(),根据项目是否配置为针对Ansi或Unicode环境进行编译:
#ifdef UNICODE
#define LoadLibrary LoadLibraryW
#else
#define LoadLibrary LoadLibraryA
#endif
Run Code Online (Sandbox Code Playgroud)
当C/C++应用程序使用TCHAR基于字符串的字符串来调用泛型LoadLibrary()"函数"时,可以通过简单地更改项目设置而不是更改源代码来编译和链接任何一个环境,例如:
HMODULE hLib = LoadLibrary(TEXT("filename"));
// calls either LoadLibraryA("filename") or LoadLibraryW(L"filename")
// depending on whether UNICODE is defined while compiling...
Run Code Online (Sandbox Code Playgroud)
另一方面,Delphi不支持.h文件,因此无法利用Microsoft现有的所有函数声明.必须在Pascal中重新声明所有库函数和数据类型(因此存在WindowsWin32 API 的单元和其他相关单元).
在这种情况下LoadLibrary(),Delphi的所有版本都分别声明LoadLibraryA()和使用和参数LoadLibraryW()导入的实际函数:kernel32.dllPAnsiCharPWideChar
function LoadLibraryA(const lpFileName: PAnsiChar): HMODULE; stdcall; external kernel32 name 'LoadLibraryA';
function LoadLibraryW(const lpFileName: PWideChar): HMODULE; stdcall; external kernel32 name 'LoadLibraryW';
Run Code Online (Sandbox Code Playgroud)
Delphi不支持预处理器宏,因此它声明LoadLibrary()为导入任何DLL函数与Delphi的泛型PChar类型匹配的函数.所以,在2007年德尔福和更早的地方PChar是PAnsiChar,LoadLibrary()被宣布为进口LoadLibraryA(),并在2009年德尔福,后来那里PChar被PWideChar,LoadLibrary()被宣布为进口LoadLibraryW()替代:
// Delphi 2007 and earlier...
function LoadLibrary(const lpFileName: PChar): HMODULE; stdcall; external kernel32 name 'LoadLibraryA';
Run Code Online (Sandbox Code Playgroud)
// Delphi 2009 and later...
function LoadLibrary(const lpFileName: PChar): HMODULE; stdcall; external kernel32 name 'LoadLibraryW';
Run Code Online (Sandbox Code Playgroud)
当Delphi应用程序使用a 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...
Run Code Online (Sandbox Code Playgroud)
这些因素适用于任何 TCHAR基于API的API,而不仅仅是LoadLibrary()具体的.当给定的Win32 API支持A和W版本时,MSDN会根据其通用TCHAR版本对其进行记录.请记住,Win32 API早于Unicode,并且TCHAR是Microsoft在Windows NT中首次引入时将开发人员从Ansi API迁移到Unicode API的解决方案,同时仍允许开发人员支持早期的Windows版本.为了向后兼容旧版应用程序,现代Windows版本仍然支持那些现有的Ansi API,尽管不赞成使用Unicode API.引入的新API往往只能向Unicode发展.
| 归档时间: |
|
| 查看次数: |
1944 次 |
| 最近记录: |