问题出现

  编译平台:VS2013     Windows

出现地方:在使用LoadLibrary( )函数动态链接DLL文件时出现的一个问题

    Eg.   在使用 UNICODE字符的工程中,

       HINSTANCE hIcmp = LoadLibrary( "ICMP.DLL" ); 

            报错:error C2664: “HMODULE LoadLibraryW(LPCWSTR)”:

       无法将参数 1 从“const char [9]”转换为“LPCWSTR”

分析原因

  当前工程只支持Unicode字符,不支持多字节,此时如果代码中出现多字节字符串, 就会报错。LoadLibrary 函数有两个版本,一个LoadLibraryW 针对Unicode版的,一个是LoadLibraryA 针对Multi-Byte(多字节)版的,它们通过不同的宏定义区分开,根据定义的宏会使用不同的函数版本。当使用UNICODE字符,就等于预设了_UNICODE、UNICODE宏,所以编译时就会使用LoadLibraryW。

注:Unicode字符和宽字符可以看作等同

解决方法

1,网上贴了很多,什么修改项目属性->配置属性-->常规--->字符集---->使用多字节符字符集。这种方法对于一些小工程可能适用,但是对于一些大的项目,特别是多人协作完成的项目来说,改变了字符集,其他工程也会报错。 ——不建议采取

2,在需要变为宽字节的字符串前边,加上 L 或者 _T( ) ;

  Eg.      HINSTANCE hIcmp = LoadLibrary( L"ICMP.DLL" );

  或者    HINSTANCE hIcmp = LoadLibrary( _T( "ICMP.DLL" ) );

  注: _T( )还需要加上头文件 < tchar.h >

3,  如果想在使用UNICODE字符的工程中使用多字节字符,也可以通过宏自定义设置

理解 L 和 _T( )

  查看tchar.h头文件的定义,可以发现_TEXT()和_T()功能是一样的,而且都是一个预定义的宏。

1 #define _T(x)       __T(x)
2 #define _TEXT(x) __T(x)

  我们再看看__T(x)的定义,发现它有两个:

1 #ifdef  _UNICODE
2 // ... 省略其它代码
3 #define __T(x) L ## x
4 // ... 省略其它代码
5 #else /* ndef _UNICODE */
6 // ... 省略其它代码
7 #define __T(x) x
8 // ... 省略其它代码
9 #endif /* _UNICODE */

  可以看出,_T( ) 是一个适配的宏,当工程采用Unicode字符时 _T()就是 L,会将多字节的字符串转化为Unicode字符,而工程采用多字节字符集时,就会当作一般的字符串处理,不做转换。

参考链接:https://www.cnblogs.com/codingmengmeng/p/6707909.html

  

C++ Error C2664:无法将参数 1 从“const char [9]”转换为“LPCWSTR”解决方案的更多相关文章

  1. 【转载】C++编译出现 error C2664: 不能将参数 2 从“const char [5]”转换为“LPCTSTR”解决办法。

    编译程序的时候出现这样的错误,原因是在新建MFC项目的时候,设置字符集Unicode的属性. 解决方法一: 在VC2010的解决方案管理器窗口内,右击你的项目“项目”,然后选“属性”(最后一项),再点 ...

  2. VS2010 error C2664: “CWnd::MessageBoxW”: 不能将参数 1 从“const char [3]”转换为“LPCTSTR”

    VS2010 (VC2010)建立工程时默认的字符集是Unicode,所以在代码中使用MessageBox时需要输入Unicode,用TEXT()这个宏输入参数,否则会报错:   代码:Message ...

  3. error: C2664: “zajiao::zajiao(const zajiao &)”: 无法将参数 1 从“const char [12]”转换为“char *”

    原本打算在QT用一个字符串"ABCDEF12345"作为类zajiao的构造函数的参数,用来创建类zajiao的对象zajiao1. zajiao zajiao1("AB ...

  4. error C2664: “CWnd::MessageBoxW”: 不能将参数 1 从“const char [17]”转换为“LPCTSTR”

    vs2008提示 error C2664: “CWnd::MessageBoxW”: 不能将参数 1 从“const char [17]”转换为“LPCTSTR” 在外面用vs2005编写mfc程序的 ...

  5. error C2664: “ATL::CStringT<BaseType,StringTraits>::Remove”: 不能将参数 1 从“const char [2]”转换为“char”

    转自VC错误:http://www.vcerror.com/?p=1395 问题描述: 代码: CString str("asdfafda"); str.Remove(" ...

  6. 不能将参数1从“const char []”转换为“LPCTSTR

    今天在使用vs2008+MFC时候,使用editControl的replacesel(“”)发生报错.如下::不能将参数1从“const char []”转换为“LPCTSTR” 其解决方案就是, 在 ...

  7. error C2664: “LoadLibraryW”: 不能将参数 1 从“const char *”转换为“LPCWSTR”

    在使用VS2010编写运行时动态链接dll文件时出现的一个问题,问题解决得益于此文章: http://blog.sina.com.cn/s/blog_6a2236590100xbgl.html 通过调 ...

  8. error C2664: “UINT GetDriveTypeW(LPCWSTR)”: 无法将参数 1 从“char [5]”转换为“LPCWSTR”

    解决方法:右击项目选择属性--->配置属性--->常规,将字符集改为“使用多字节字符符集”,应用确定即可. 来自为知笔记(Wiz)

  9. error C2664

    error C2664: “int CWnd::MessageBoxW(LPCTSTR,LPCTSTR,UINT)”: 无法将参数 1 从“const char [19]”转换为“LPCTSTR” n ...

随机推荐

  1. Unity中建立文本保存数据

    public void CreateYunYD() { GameToolsManager.Instance.effectType = EFFECTTYPE.YunYD; CreateYunOrWu(& ...

  2. php 配置xdebug

    https://blog.csdn.net/Alan8865/article/details/81331252

  3. Python学习—数据库篇之练习题

    Mysql测试题 一.表关系 请创建如下表,并创建相关约束 二.操作表 0.在成绩表中同时显示出对应的课程名和学生名 1.自行创建测试数据 2.查询“生物”课程比“物理”课程成绩高的所有学生的学号: ...

  4. Linux下Samba的安装和使用

    一. samba的安装: sudo apt-get insall samba sudo apt-get install smbfs 二. 创建共享目录: mkdir /home/phinecos/sh ...

  5. Cocos2dx开发之设计模式

    cocos2dx的几种常见设计模式 一 单例模式 Cocos2dx中的单例有:CCDirector,CCTextureCache,CCSpriteFrameCache,CCScriptEngineMa ...

  6. CentOS7+CDH5.14.0安装全流程记录,图文详解全程实测-6CM安装前环境检查

    检查环境 在正式开始安装CDH之前最好先检查一下能不能相互免密ssh,以及防火墙是否关闭,集群中的时间是否统一,java版本是否是oracle的版本,主节点mysql是否安装正确等. ssh测试 例如 ...

  7. find用法详解

    一.find的用法 find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [express ...

  8. swift 关于FDFullscreenPopGesture的右滑返回

    关于导航栏右滑返回的工具库 FDFullscreenPopGesture 是 OC 版本,用了 runtime 等各种骚操作 关于 swift ,我在 UINavigationController 的 ...

  9. 警惕32位程序在MethodImplOptions.Synchronized在x64机器上的同步缺陷[z]

    https://www.cnblogs.com/junchu25/archive/2012/08/10/2631422.html 上周四产品上线一切运行正常,做了一点小改动后周四晚上发布,周五大量用户 ...

  10. 7.Redis主线程阻塞原因

    7.Redis主线程阻塞原因7.1 发现阻塞7.2 内在原因7.2.1 API或数据结构使用不合理7.2.2 CPU饱和7.2.3 持久化阻塞7.3 外在原因7.3.1 CPU竞争7.3.2 内存交换 ...