不知道大家用QT做什么程序,但应该还是Windows程序居多吧,仍免不了与WINAPI打交道。这就要求数据类型要与Windows一致,而QT的数据类型却是自成一体的。这就需要转换。比如我用到了LogonUser函数,其原型是:
BOOL LogonUser(
_In_      LPTSTR lpszUsername,
_In_opt_  LPTSTR lpszDomain,
_In_opt_  LPTSTR lpszPassword,
_In_      DWORD dwLogonType,
_In_      DWORD dwLogonProvider,
_Out_     PHANDLE phToken
);
 
因为实际使用LogonUserW函数,所以要求LPCWSTR类型(前三个参数)。一开始我没当回事,这样写:
char* szLogin = new char[MAX_LENGTH]; memset(szLogin, 0, MAX_LENGTH);
QByteArray ba111 = strUser.toLocal8Bit(); // strUser是QString,外部传来的数据。
char* temp111 = ba111.data(); 
strcpy(szLogin, temp111);
然后强行转换char*到LPCWSTR:
HANDLE hh;
if (!LogonUser((LPCWSTR)szLogin, (LPCWSTR)szDomaine, (LPCWSTR)szPass, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &hh)) 
编译不报错,但是执行错误。我猜测是不是toLocal8Bit()函数使用错误,毕竟LPCWSTR要求的是宽字符,强行转换之后,这个char*内部仍是使用一个字节表示一个字母,我做强行转换,只是把编译器骗过去而已,编译器并没有帮我做任何事情。后来灵机一动,既然QT是内置Unicode编码的,那么QChar应该是16位的宽字符,于是查了QString函数以后,这样写:
const QChar* szLogin = strUser.unicode(); 
此时再转换就没有问题了:
if (!LogonUser((LPCWSTR)szLogin, (LPCWSTR)szDomaine, (LPCWSTR)szPass, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &hh)) 
------------------------------------------------------------------------------
另外这几个函数可能也有帮助,但目前不清楚怎么用:

std::string toStdString () const
std::wstring toStdWString () const
const ushort * utf16 () const

TCHAR理论上也是对的,但初始化之后,接下去不知道该怎么用了:

TCHAR* szLogin = new TCHAR[MAX_LENGTH]; memset(szLogin, 0, MAX_LENGTH);

如果只是转换常量的会超级简单,就不需要经过QString的手了:

LPCWSTR str = TEXT("Hello");

QString转换成LPCWSTR的更多相关文章

  1. 关于char[]转换成LPCWSTR的有关问题[转]

    一.问题的原因:VS2010默认采用宽字符UNICODE编码方式,定义了Unicode,因此相关的字符串必须为unicode字符串,而非ascii字符串. LPCWSTR中的W是宽字符的意思,是UNI ...

  2. char*或string转换成LPCWSTR

    VS2010默认是Unicode的,在VC 6.0中编译成功的项目在VS2010中常会出现类型错误. 经常出现的错误是:不能从const char *转换为LPCWSTR 如使用CreateDC(&q ...

  3. QString 转换成 wchar 的一个小陷阱

    QString::toWCharArray(wchar_t * array) 其中 wchar_t * array 除了要分配内存之外,必须用 wmemset 初始化. 环境是 Visual Stud ...

  4. Qt中的对象类型转换(Qstring 转换char*有三种方法)

    char * 与 const char *的转换 char *ch1="hello11"; const char *ch2="hello22"; ch2 = c ...

  5. JS 实现"可读"字符串转换成"二进制的01"字符串

    问题起源 看过一个漫画, 两位程序员在办公司交流, 可是说的语言却是010101类似的字符串.周围人很是惊异.计算机的世界,确实是由01组成的.今天突然想实现这个编码转换. 解决思路 学过C语言的都知 ...

  6. CString转换成int CString类相应函数

    CString 型转化成 int 型 把 CString 类型的数据转化成整数类型最简单的方法就是使用标准的字符串到整数转换例程. 虽然通常你怀疑使用_atoi()函数是一个好的选择,它也很少会是一个 ...

  7. VC2008中将CString转换成const char*的一种有效方法

    文章转载自http://blog.csdn.net/lanbing510/article/details/7425613 在Visual Studio 200X下,CString直接转换成const ...

  8. DataTable 转换成 Json的3种方法

    在web开发中,我们可能会有这样的需求,为了便于前台的JS的处理,我们需要将查询出的数据源格式比如:List<T>.DataTable转换为Json格式.特别在使用Extjs框架的时候,A ...

  9. 微信小程序中利用时间选择器和js无计算实现定时器(将字符串或秒数转换成倒计时)

    转载注明出处 改成了一个单独的js文件,并修改代码增加了通用性,点击这里查看 今天写小程序,有一个需求就是用户选择时间,然后我这边就要开始倒计时. 因为小程序的限制,所以直接选用时间选择器作为选择定时 ...

随机推荐

  1. jQuery实现分页

    转载地址 http://www.cnblogs.com/xiaoruoen/archive/2012/01/11/2318199.html ;( function($){ $.extend({ &qu ...

  2. 自己实现的库函数1(strlen,strcpy,strcmp,strcat)

    为了便于理解和使用库函数,先把自己实现的几个函数以及测试函数呈现如下. //求字符串长度的函数int my_strlen(const char* pStr){ assert(pStr != NULL) ...

  3. 使用Qpython3制作老版天翼飞TP路由器拨号脚本

    #幻境拨号python版 #by 1414641776 account='xxxxxx@96301' password='xxxxx' # 路由器脚本 def sendToRoute(account, ...

  4. java 常见异常(二)

    java.lang.ClassCastException: com.bjsxt.HomeWrok.oop.polymorphism.UP cannot be cast to com.bjsxt.Hom ...

  5. python之setattr,getattr,hasattr

    可以使用setattr(), getattr(), hasattr()动态对实例进行操作. 相当于Java中的反射机制, 或者更确切地, 像JavaScript中属性操作. 具体属性: __dict_ ...

  6. 线性判别分析(LDA), 主成分分析(PCA)及其推导【转】

    前言: 如果学习分类算法,最好从线性的入手,线性分类器最简单的就是LDA,它可以看做是简化版的SVM,如果想理解SVM这种分类器,那理解LDA就是很有必要的了. 谈到LDA,就不得不谈谈PCA,PCA ...

  7. Java 8 VM GC Tunning Guide Charter 6

    第六章 并行GC The Parallel Collector The parallel collector (also referred to here as the throughput coll ...

  8. 关于JS的一些代码效果图

    关于JS的一些代码效果图 1.几乎所有DOM元素都有innerText.innerHTML属性(注意大小写),分别是元素标签内内容的文本表示形式和HTML源代码,这两个属性是可读可写的. 需要注意的是 ...

  9. android studio 突然出现Gradle project sync failed 错误

    出现: 之前还是好好的,突然就出现Gradle project sync failed  错误,网上原因可能是工具的问题. 解决办法: 重新打开android studio就好了.不知道大家还有其他的 ...

  10. adb shell 出现 error :

    首先,确保 adb 服务有起来    adb kill-server adb start-server其次,确保 adb devices 可以找到设备