从DLL导出函数,LoadLibrary()需要使用TEXT强制转换的字符串进行编译,而不会出现错误

问题描述 投票:0回答:1

我正在学习编写和使用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()调用?

c++ dll dllexport
1个回答
0
投票

LoadLibrary()是预处理程序宏。根据是否定义了LoadLibraryW(),它分别映射到LoadLibraryA()UNICODELoadLibraryW()接受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")

© www.soinside.com 2019 - 2024. All rights reserved.