不知道大家用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");

最新文章

  1. mysql技巧之select count的比较
  2. linux apache 自动监护脚本
  3. Windows7 64位安装配置Apache2.4+PHP5.4+MySQL5.5+Xdebug
  4. sqort函数用法总结
  5. HTML5与CSS3基础教程第八版学习笔记11~15章
  6. Shell上传文件到ftp
  7. 网络流(最大流) CQOI 2015 BZOJ 3931 网络吞吐量
  8. 【微信公众号】WeixinJSBridge.call('closeWindow')无效
  9. org.apache.commons.lang3 的随机数生成
  10. vue常用手册
  11. MAC OS进阶必看——这10个技巧让你秒变MAC达人
  12. [转载]vb 时间戳与时间互转
  13. P层
  14. cpp函数回调
  15. web-font 个人学习小总结
  16. GIT操纵
  17. JDBC中的那些设计模式
  18. hihoCoder week2 Trie树
  19. spring注解预览
  20. JVM Scan

热门文章

  1. php出现“syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM”错误的一种情况,及解决方法
  2. Android的Handler与Activity线程同步
  3. (转)使用getevent监听Android输入设备文件
  4. Oracle查询出最最近一次的一条记录
  5. MySQL 多实例启动和关闭脚本
  6. C++实现数字媒体三维图像渲染
  7. NET
  8. iOS刷新第三方MJRefresh的基本使用
  9. android编程常见问题-No Launcher activity found!
  10. [转载]C++ CString与int 互转