从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 中使用字符/字符串文本时,应始终使用TEXT()
宏。 否则,只需根据需要直接使用A
和W
API,具体取决于您正在使用的文本数据类型。
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 当字符串存储在变量中时,如何将字符串转换为wchar_t
- 如何将这个std::字符串转换为std::基本字符串
- 如何正确将字符串转换为标准::时间::system_clock::time_point?
- 如何在C++中将十六进制字符串转换为文本数据
- 需要帮助在 c++ 中将字符串转换为字符 ----错误 "const char *" 类型的值不能用于初始化 "char" 类型的实体
- 如何从字符串转换为双精度*
- C++:如何将 unix 时间的字符串转换为 *tm?(使用时间错误:"cannot convert 'String' to 'tm*' ")
- 如何在C++中将 Python 字符串转换为其转义版本?
- 如何在 C++11 中将标准::字符串转换为标准::u32字符串?
- 如何将整数字符串转换为整数的二维向量?
- 使用 "stringstream " 将字符串转换为整数
- 将字符串转换为浮点数或整数,而无需使用内置函数(如 atoi 或 atof)
- 将文件复制到自定义位置,存在字符串转换问题
- 将ANSI C字符串转换为UNICODE
- 如何将节点 V8 字符串转换为 C++ 字符串
- 在C++中将字符串转换为双精度,而无需科学记数法
- 使用从文件(stod、strtod、atof)中提取的数据C++从字符串转换为双精度.csv
- 如何在C++中将字符串转换为双精度?
- 将字符串转换为无符号字符数组/字节数组