从 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()
,具体取决于是否定义了 UNICODE
。 LoadLibraryW()
将 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 都具有相似的 A
和 W
版本,以及相应的 UNICODE
感知预处理器宏。因此,在这些 API 中使用 character/string 文字时,您应该始终使用 TEXT()
宏。否则,只需根据需要直接使用 A
和 W
API,具体取决于您使用的文本数据类型。
我正在学习编写和使用 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()
,具体取决于是否定义了 UNICODE
。 LoadLibraryW()
将 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 都具有相似的 A
和 W
版本,以及相应的 UNICODE
感知预处理器宏。因此,在这些 API 中使用 character/string 文字时,您应该始终使用 TEXT()
宏。否则,只需根据需要直接使用 A
和 W
API,具体取决于您使用的文本数据类型。