在利用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释疑相关推荐

  1. android loadlibrary 更改libPath 路径,指定路径加载.so

    http://www.jianshu.com/p/f751be55d1fb 字数549 阅读177 评论0 喜欢0 需求很简单 ,就是加载指定文件夹下的.so. 原因:android在程序运行的状态下 ...

  2. 使用CFree调用Win32 LoadLibrary 简单示例

    CFree 5.0 汉化版:新建一个简单窗口程序: 此工具带有Win32 api的智能提示: Win32 API的LoadLibrary函数,功能是载入模块:下面示例载入icmp.dll:此dll位于 ...

  3. 释疑のCONTEXTS

    本篇主要探索关键字"CONTEXTS". 如下实例程序: REPORT  demo_context_message_4. DATA: percentage TYPE i. CONT ...

  4. 网络编程释疑之:TCP连接拔掉网线后会发生什么

    背景:前些天团队在进行终端设备和服务器端长连接业务的测试时,发现了这么一个情况:在拔掉设备端的网线后,再插上网线,有时可以继续正常的进行长接连请求,而且用的还是拔掉网线之前的那个长连接.但是有时却不能 ...

  5. python使用ctypes模块下的windll.LoadLibrary报OSError: [WinError 193] % 不是有效的 Win32 应用程序...

    原因:python是64位的python,而windll.LoadLibrary只能由32位的python使用 参考: 64位Python调用32位DLL方法(一) 解决方法:使用32位的python ...

  6. java中类图概念,程序员眼中的UML(4)--类图释疑之一,Attribute和Property之区别

    程序员眼中的UML(4) --类图释疑之一,Attribute和Property之区别 上一篇中提出了很多问题,其中最令人费解的可能就是Attribute和Property之区别了吧.我在网络上寻找良 ...

  7. 读jQuery源码释疑笔记

    本释疑笔记是针对自己在看源码的过程中遇到的一些问题的解答,对大众可能不具有参考性,不过可以看看有没有你也不懂得地方,相互学习,相互进步.  1.each的用法 之前对each的用法一直迷迷糊糊,这次终 ...

  8. SPField的几种name的释疑

    编写SharePoint Object Model代码时, 经常要用到SPField. 这个SPField有不少名字, 让人很容易混淆. Display Name Internal Name Name ...

  9. GetProcAddress() LoadLibrary() DLL

    GetProcAddress函数检索指定的动态链接库(DLL)中的输出库函数地址. 函数原型: FARPROC GetProcAddress( HMODULE hModule, // DLL模块句柄 ...

  10. java loadlibrary_java – System.loadLibrary不起作用.链中的第二个lib的UnsatisfiedLinkError...

    我有通过JNI使用cpp共享库libclient.so的 java程序Client.class. libclient.so构建为共享并使用cpp共享库libhttp.so. libclient.so和 ...

最新文章

  1. [转]几种最短路径算法的比较
  2. edp 基于node.js和npm的前端开发平台
  3. 公钥和私钥怎么生成_科普 | Eth2 验证者如何生成和保护取款密钥
  4. 检测1的个数_冲床电永磁夹紧系统(PMCS),实现1分钟的快速换模~
  5. C语言 >> 右移位运算符的原理和一些概念
  6. 20172313 2018-2019-1 《程序设计与数据结构》第六周学习总结
  7. bls java_JAVA泛型与类型安全
  8. 基于CarMaker的C-NCAP主动安全系统试验仿真(四)
  9. 【MATLAB】通信信号调制通用函数 — 带通滤波器
  10. URL 和 URI 区别
  11. 用友通总账问题维护精粹
  12. 【阿卡乐谱】【日常分享】超级强大的简谱-《茉莉花》
  13. 蜂鸣片,蜂鸣器的原理以及驱动电路的个人理解
  14. 无限维乘积空间(彼此独立)的测度(完)
  15. windows 进程通信(使用DDE)
  16. 手机连不上wifi,一直显示正在获取ip地址
  17. win7恢复计算机图标不见了怎么办,win7桌面图标找不到的五种恢复方法
  18. H+框架 通过按钮新增选项卡功能
  19. 【Updating】二〇二一流水账
  20. arduino与hcsr04_Arduino 驱动 HC-SR04 超声波测距模块

热门文章

  1. 7.1 布朗运动定义及构造
  2. 中投 汇金 中金 中登
  3. 朴素贝叶斯之邮件分类
  4. 浅谈数据挖掘中的关联规则挖掘
  5. Ubuntu添加开机自动运行程序
  6. Linux系统各发行版镜像下载(借阅)
  7. 计算机组装与维护试题精选,《计算机组装与维护》精选试题及答案
  8. w7计算机 里工具栏没有了,win7电脑任务栏不见了怎么办
  9. ecshop 二次开发
  10. 在三维空间中表示平面和直线