从 DLL 导出函数,LoadLibrary() 需要用 TEXT 转换的字符串才能编译无误

Exporting functions from DLLs, LoadLibrary() needs the string cast with TEXT to compile without error

我正在学习编写和使用 DLL,这是我第一次尝试从我的 DLL 导出函数。它有效,但这条线给我带来了麻烦,我已经找到了有关 UNICODE 和 ANSI 的 TEXT 转换的内容,我认为我需要一些指导。据我所知,这个问题还没有在网站的其他地方被问过,所以如果有人发现我找不到的东西,我深表歉意。

HINSTANCE hInstLibrary = LoadLibrary("MyDLL.dll"); 

我的初始使用,来自关于显式链接的简短教程,给出了关于 LPCWSTR 类型的 E0167 和 C2664 错误

HINSTANCE hInstLibrary = LoadLibrary(TEXT("MyDLL.dll"));

将字符串转换为 TEXT 可以解决问题,但我不确定原因并想知道

HINSTANCE hInstLibrary = LoadLibraryA("MyDLL.dll");

我决定在工作示例中使用的行。 LoadLibraryA() 扩展 LoadLibrary 以接受 ANSI 而不是 Wide,这可能是我误解的根源。当我找到的大多数示例显示 LoadLibrary("NameOfDLL.dll")?

时,为什么这是必要的

为什么字符串不满足标准 LoadLibrary() 调用?

LoadLibrary() 是预处理器宏。它映射到 LoadLibraryW()LoadLibraryA(),具体取决于是否定义了 UNICODELoadLibraryW()const wchar_t* 字符串作为输入,而 LoadLibraryA()const char * 字符串作为输入。

字符串文字 "MyDLL.dll"const char[10],它 衰减 const char *。如果定义了 UNICODELoadLibrary("MyDLL.dll") 将无法编译,因为您不能在需要 const wchar_t * 的地方传递 const char *

TEXT() 也是一个预处理器宏。如果定义了 UNICODE,它会向指定的文字附加一个 L 前缀,使文字使用 wchar_t,否则不添加前缀,文字使用 char

因此,如果定义了UNICODE,则LoadLibrary(TEXT("MyDLL.dll"))被编译为LoadLibraryW(L"MyDLL.dll"),否则编译为LoadLibraryA("MyDLL.dll")

大多数处理文本数据的 Win32 API 都具有相似的 AW 版本,以及相应的 UNICODE 感知预处理器宏。因此,在这些 API 中使用 character/string 文字时,您应该始终使用 TEXT() 宏。否则,只需根据需要直接使用 AW API,具体取决于您使用的文本数据类型。