我正在学习编写和使用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 char *
的地方传递const wchar_t *
。
TEXT()
也是预处理器宏。如果定义了UNICODE
,则会在指定的文字后附加L
前缀,从而使文字使用wchar_t
,否则不添加前缀,而文字使用char
。
因此,如果定义了UNICODE
,则LoadLibrary(TEXT("MyDLL.dll"))
被编译为LoadLibraryW(L"MyDLL.dll")
,否则它被编译为LoadLibraryA("MyDLL.dll")
。