回 帖 发 新 帖 刷新版面

主题:关于loadlibrary的问题

各位高手大哥:
    小弟目前正在学习动态库编程,在利用loadlibrary显示装载某动态库的时候例如:
HINSTANCE hDll = LoadLibrary("./abc.dll");
 结果编译器报错说不能将char[]转换为LPCWSTR,结果我就将代码改为:
HINSTANCE hDll = LoadLibrary(LPCWSTR("./abc.dll"));
结果hDll显示为零,表明加载不成功。
但如果改为 HINSTANCE hDll = LoadLibrary(TEXT("./abc.dll"));
结果hDll不为零,加载成功。
     想问下各位高手,这到底是怎么回事呢?小弟菜鸟,希望高手能够指点迷津,谢谢。

回复列表 (共3个回复)

沙发

试一下HINSTANCE hDll = LoadLibrary(_T("./abc.dll"));

Visual C++里边定义字符串的时候,用_T来保证兼容性,VC支持ascii和unicode两种字符类型,用_T可以保证从ascii编码类型转换到unicode编码类型的时候,程序不需要修改。

板凳

你的程序使用了UNICODE字符集,这样,LoadLibrary实际是使用LoadLibraryW而非LoadLibraryA
而相应的,该函数所需要的参数应该为宽字符串(即UNICODE字符串)而非窄字符串(多字节字符串)。

C/C++代码中,直接使用""(双引号)包含方式定义的字符串为窄字节串,使用''(单引号)包含方式定义的字符为窄字符(单字节字符或多字节字符). 而在上述字符串方式中附加L前缀则可以变窄字符(串)为宽字符(串).  比如:
"a" 窄字符串
'a' 窄字符
L"a" 宽字符串
L'a' 宽字符

windows头文件中提供了TEXT宏可以视UNICODE宏是否定义来自动切换由其定义的字符串,其定义大体如下:
#ifdef UNICODE
#define TEXT(s) L##s
#else
#define TEXT(s) s
#endif

##为宏定义中使用的拼接符,相关说明可参见MSDN等文档。

对于LoadLibrary() 这种带有字符串参数的Windows API函数,其影射原型也依赖于UNICODE宏,大体如下:


WINBASEAPI
__out
HMODULE
WINAPI
LoadLibraryA(
    __in LPCSTR lpLibFileName
    );
WINBASEAPI
__out
HMODULE
WINAPI
LoadLibraryW(
    __in LPCWSTR lpLibFileName
    );
#ifdef UNICODE
#define LoadLibrary  LoadLibraryW
#else
#define LoadLibrary  LoadLibraryA
#endif // !UNICODE

LoadLibraryA使用LPCSTR 作为参数类型,它即为窄字符串(A代表ANSI)
LoadLibraryW使用LPCWSTR 作为参数类型,它即为宽字符串(W代表WIDEN)

因此,不按上述方式使用API,一则导致编译错误,如下:

1 .HINSTANCE hDll = LoadLibrary("./abc.dll");
 结果编译器报错说不能将char[]转换为LPCWSTR,结果我就将代码改为:

二则导致运行错误,原因是LPCWSTR("")是强制类型转换,而非宏替换。如下
2.
HINSTANCE hDll = LoadLibrary(LPCWSTR("./abc.dll"));
结果hDll显示为零,表明加载不成功。

下面的方式才是正确的:
HINSTANCE hDll = LoadLibrary(TEXT("./abc.dll"));

另外,根据上述分析:下面的2种方式同样也是正确的:
HINSTANCE hDll = LoadLibraryA("./abc.dll");
HINSTANCE hDll = LoadLibraryW(L"./abc.dll");


如果上述问题作为一道程序员笔试题,其用意正是考查应聘者对于Unicode编码和ANSI编码的基本概念。
而楼主恰恰给自己考了一把试,看来没过关啊!


以你现在对此问题的了解,想必我的解释中出现了许多你第一次听说或尽管听说但掌握不深的概念名词或术语,比如UNICODE,ANSI,宏,强制类型转换,字符集和编码,Windows API及其使用方式 ....
我不可能一次给你全部解释清楚。  所以有不懂的去查查相关资料或问问身边的同学、同事、老师们吧。

呵呵!






3 楼

感谢楼上大哥的详细解答,另外,我还想问一下,在上面的强制类型转换和宏替换会有什么区别,据我所知,LPCWSTR实际上就是short int* ,所以我想问一下,将一个常量字符串指针转化为short int*具体会发生什么呢?如能帮助,万分感谢。

我来回复

您尚未登录,请登录后再回复。点此登录或注册