loadlibrary释疑


在利用loadlibrary显示装载某动态库的时候例如:

HINSTANCE hDll = LoadLibrary("./abc.dll");
 
结果编译器报错说不能将char[]转换为LPCWSTR,    
查阅msdn函数原型为

HMODULE WINAPI LoadLibrary(
  __in          LPCTSTR lpFileName
);
将代码改为:

HINSTANCE hDll = LoadLibrary(LPCWSTR("./abc.dll"));
编译通过但是会发现hdll为空,装载不成功。但如果改为

HINSTANCE hDll = LoadLibrary(TEXT("./abc.dll"));
结果hDll不为零,加载成功。为什么?

这是因为使用了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

##
为宏定义中使用的拼接符

对于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,结果我就将代码改为:
HINSTANCE hDll = LoadLibrary(LPCWSTR("./abc.dll"));
则导致运行错误,原因是LPCWSTR("")是强制类型转换,而非宏替换。结果hDll显示为零,表明加载不成功。

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

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

注: TEXT相当于MFC中的_T()

vs6下面很多地方使用字符串时直接双引号就行,vs08下面很多地反使用的就是Unicode所以想需要加上_T()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值