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

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

本文关键字:字符串 转换 编译 出错 TEXT 函数 DLL LoadLibrary      更新时间:2023-10-16

我正在学习编写和使用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 *。 如果定义了UNICODE,则LoadLibrary("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 中使用字符/字符串文本时,应始终使用TEXT()宏。 否则,只需根据需要直接使用AWAPI,具体取决于您正在使用的文本数据类型。