当前位置: 首页 > news >正文

MFC常用技巧

MFC常用技巧

    • 1、句柄
      • MFC中如何获取窗口的句柄
    • 2、字符串
      • CString转char*
      • Unicode下char *转换为CString
    • 3、Visual C++ 64 位迁移的常见问题(数据类型、指针类型的长度问题)
    • 4、c++ - 将_beginthread返回的uintptr_t转换为HANDLE是否安全


1、句柄

MFC中如何获取窗口的句柄

http://www.ekangw.net/news/2022/0924/194873.html


2、字符串

CString转char*

1、Unicode下 CString转换为char *
方法1:使用函数 T2A、W2A

CString cstr = _T("test")
//声明标识
USES_CONVERSION;
//函数T2A和W2A均支持ATL和MFC中的字符
char * pFileName = T2A(cstr);   
//char * pFileName = W2A(cstr); //也可实现转换注意:有时候可能还需要添加引用#include <afxpriv.h>

方法2:使用API:WideCharToMultiByte进行转换

CString str = _T("test");//注意:以下n和len的值大小不同,n是按字符计算的,len是按字节计算的
int n = str.GetLength();//获取宽字节字符的大小,大小是按字节计算的int len = WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),NULL,0,NULL,NULL);//为多字节字符数组申请空间,数组大小为按字节计算的宽字节字节大小
char * pFileName = new char[len+1];   //以字节为单位//宽字节编码转换成多字节编码
WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),pFileName,len,NULL,NULL);
pFileName[len+1] = '/0';   //多字节字符以'/0'结束

Unicode下char *转换为CString

方法1:使用API:MultiByteToWideChar进行转换

char * pFileName = "test";//计算char *数组大小,以字节为单位,一个汉字占两个字节
int charLen = strlen(pFileName);//计算多字节字符的大小,按字符计算。
int len = MultiByteToWideChar(CP_ACP,0,pFileName,charLen,NULL,0);//为宽字节字符数组申请空间,数组大小为按字节计算的多字节字符大小
TCHAR *buf = new TCHAR[len + 1];//多字节编码转换成宽字节编码
MultiByteToWideChar(CP_ACP,0,pFileName,charLen,buf,len);buf[len] = '/0'; //添加字符串结尾,注意不是len+1//将TCHAR数组转换为CString
CString pWideChar;
pWideChar.Append(buf);//删除缓冲区
delete []buf;

方法二:使用函数 A2T、A2W

char * pFileName = "test";
USES_CONVERSION;
CString s = A2T(pFileName);
//CString s = A2W(pFileName);

方法三:使用_T宏,将字符串转换为宽字符

//书写代码使用TEXT("")或_T(""),文本在UNICODE和非UNICODE程序里都通用
AfxMessageBox(_T("test string"));  注意:直接转换在基于MBCS的工程可以,但在基于Unicode字符集的工程中直接转换是不可行的,CString会以Unicode的形式来保存数据,强制类型转换只会返回第一个字符。

3、Visual C++ 64 位迁移的常见问题(数据类型、指针类型的长度问题)

为了顺利实现两种平台的源代码级可移植性,程序员应按照以下规则来编写程序或者修改已有程序:

A、不能将指针转换成 int、uint、long、ulong、dword等字长固定为32位的类型 ,如果需要对指针做运算,应把指针转换为int-ptr或 uint-ptr,这两种类型在不同平台上才有正确的字长。另外,由于handle实质上是一个指针(void *),因此把handle转换成long或ulong等类型也是不正确的。

B、如果确定需要对指针进行截断,那么应使用ptrtolong()和ptrtoulong()两个函数(在basetsd.h中定义)来进行 ,它们可以屏蔽掉指针截断警告,不过截断的结果不能够再当指针使用了。

C、当某个api函数的 out参数能返回一个指针时,应小心谨慎处理参数 ,在win32中,可以把一个ulong变量的地址进行强制转换后传递给api函数,返回的指针就保存在 ulong变量中,但在win64中,返回的指针有64位,如果使用ulong变量的话就会破坏其他变量的内容,正确并且简单的方法是直接定义一个指针变 量,把指针变量的地址作为参数传递给api函数。

参考链接:https://blog.csdn.net/u011135902/article/details/50571955


4、c++ - 将_beginthread返回的uintptr_t转换为HANDLE是否安全

在x64构建中,uintptr_t定义为64位值:
typedef unsigned __int64 uintptr_t;
因此,在这种情况下将其强制转换为HANDLE是安全的

参考链接:https://www.lmlphp.com/user/163619/article/item/3254239

http://www.lryc.cn/news/1229.html

相关文章:

  • C++ —— 多态
  • java agent设计开发概要
  • node.js笔记-模块化(commonJS规范),包与npm(Node Package Manager)
  • Linux 磁盘坏块修复处理(错误:read error: Input/output error)
  • API 面试四连杀:接口如何设计?安全如何保证?签名如何实现?防重如何实现?
  • 操作系统题目收录(六)
  • 2023年十款开源测试开发工具推荐!
  • MySQL慢查询分析和性能优化
  • C++学习笔记(四)
  • 【4】深度学习之Pytorch——如何使用张量处理时间序列数据集(共享自行车数据集)
  • mulesoft MCIA 破釜沉舟备考 2023.02.10.01
  • 干货 | PCB拼板,那几条很讲究的规则!
  • 笔试题-2023-思远半导体-数字IC设计【纯净题目版】
  • canvas根据坐标点位画图形-canvas拖拽编辑单个图形形状
  • JavaEE 初阶 — 确认应答机制
  • 0207 事件
  • SpringBoot整合Swagger
  • 20230210英语学习
  • 【图像处理OpenCV(C++版)】——4.5 全局直方图均衡化
  • 2022年API安全研究报告
  • 【内网安全-横向移动】基于SMB协议-PsExec
  • whistle 一个神奇的前端调试工具(抓包\代理工具)
  • node.js下载和vite项目创建以及可能遇到的错误
  • 如何使用python画一个爱心
  • 1 Flutter UI Container和 Text 和图片组件
  • 【Hello Linux】 Linux基础命令(持续更新中)
  • 记录一下slf4j2打印一直不成功
  • 【安全知识】——对Linux密码文件的处理
  • 动手深度学习笔记(四十七)8.3. 语言模型和数据集
  • URL编码和Base64编码