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()
loadlibrary释疑相关推荐
- android loadlibrary 更改libPath 路径,指定路径加载.so
http://www.jianshu.com/p/f751be55d1fb 字数549 阅读177 评论0 喜欢0 需求很简单 ,就是加载指定文件夹下的.so. 原因:android在程序运行的状态下 ...
- 使用CFree调用Win32 LoadLibrary 简单示例
CFree 5.0 汉化版:新建一个简单窗口程序: 此工具带有Win32 api的智能提示: Win32 API的LoadLibrary函数,功能是载入模块:下面示例载入icmp.dll:此dll位于 ...
- 释疑のCONTEXTS
本篇主要探索关键字"CONTEXTS". 如下实例程序: REPORT demo_context_message_4. DATA: percentage TYPE i. CONT ...
- 网络编程释疑之:TCP连接拔掉网线后会发生什么
背景:前些天团队在进行终端设备和服务器端长连接业务的测试时,发现了这么一个情况:在拔掉设备端的网线后,再插上网线,有时可以继续正常的进行长接连请求,而且用的还是拔掉网线之前的那个长连接.但是有时却不能 ...
- python使用ctypes模块下的windll.LoadLibrary报OSError: [WinError 193] % 不是有效的 Win32 应用程序...
原因:python是64位的python,而windll.LoadLibrary只能由32位的python使用 参考: 64位Python调用32位DLL方法(一) 解决方法:使用32位的python ...
- java中类图概念,程序员眼中的UML(4)--类图释疑之一,Attribute和Property之区别
程序员眼中的UML(4) --类图释疑之一,Attribute和Property之区别 上一篇中提出了很多问题,其中最令人费解的可能就是Attribute和Property之区别了吧.我在网络上寻找良 ...
- 读jQuery源码释疑笔记
本释疑笔记是针对自己在看源码的过程中遇到的一些问题的解答,对大众可能不具有参考性,不过可以看看有没有你也不懂得地方,相互学习,相互进步. 1.each的用法 之前对each的用法一直迷迷糊糊,这次终 ...
- SPField的几种name的释疑
编写SharePoint Object Model代码时, 经常要用到SPField. 这个SPField有不少名字, 让人很容易混淆. Display Name Internal Name Name ...
- GetProcAddress() LoadLibrary() DLL
GetProcAddress函数检索指定的动态链接库(DLL)中的输出库函数地址. 函数原型: FARPROC GetProcAddress( HMODULE hModule, // DLL模块句柄 ...
- java loadlibrary_java – System.loadLibrary不起作用.链中的第二个lib的UnsatisfiedLinkError...
我有通过JNI使用cpp共享库libclient.so的 java程序Client.class. libclient.so构建为共享并使用cpp共享库libhttp.so. libclient.so和 ...
最新文章
- [转]几种最短路径算法的比较
- edp 基于node.js和npm的前端开发平台
- 公钥和私钥怎么生成_科普 | Eth2 验证者如何生成和保护取款密钥
- 检测1的个数_冲床电永磁夹紧系统(PMCS),实现1分钟的快速换模~
- C语言 >> 右移位运算符的原理和一些概念
- 20172313 2018-2019-1 《程序设计与数据结构》第六周学习总结
- bls java_JAVA泛型与类型安全
- 基于CarMaker的C-NCAP主动安全系统试验仿真(四)
- 【MATLAB】通信信号调制通用函数 — 带通滤波器
- URL 和 URI 区别
- 用友通总账问题维护精粹
- 【阿卡乐谱】【日常分享】超级强大的简谱-《茉莉花》
- 蜂鸣片,蜂鸣器的原理以及驱动电路的个人理解
- 无限维乘积空间(彼此独立)的测度(完)
- windows 进程通信(使用DDE)
- 手机连不上wifi,一直显示正在获取ip地址
- win7恢复计算机图标不见了怎么办,win7桌面图标找不到的五种恢复方法
- H+框架 通过按钮新增选项卡功能
- 【Updating】二〇二一流水账
- arduino与hcsr04_Arduino 驱动 HC-SR04 超声波测距模块