DWORD
32-bit unsigned integer.
This type is declared in WinDef.h as follows:
typedef unsigned long DWORD;
1个二进制位称为1个bit,8个二进制位称为1个Byte,也就是1个字节(8位),2个字节就是1个Word(1个字,16位),则DWORD(DOUBLEWORD)就是双字的意思,两个字(32位)</CA>
windef.h中
typedef unsigned long DWORD;
关于DWORD使用中重要的一点。DWORD 现在表示32bit 无符号整数,即使以后Windows 升级到64位,DWORD 仍然是32bit 无符号整数(也许以后的long 不是32bit了,只需要重新定义一下DWORD 就可以了)。对于那些直接和位数有关的整数,最好不用 int, long, short 之内的内型,因为 这些类型的位数可能不确定(比如,在16位程序里,int 是16位的,在32位程序里,int 是32位的,谁知道在以后的64位程序里,int 是多少位,long 又是多少位)。用重新定义的内型就没有这方面的问题,最多到时候修改一下定义就可以了,而不需要在程序里一行一行的查找
LPCTSTR
LPCTSTR类型
L表示long指针 这是为了兼容Windows 3.1等16位操作系统遗留下来的,在win32中以及其他的32为操作系统中, long指针和near指针及far修饰符都是为了兼容的作用。没有实际意义。
P表示这是一个指针
C表示是一个常量
T表示在Win32环境中, 有一个_T宏
这个宏用来表示你的字符是否使用UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串。
STR表示这个变量是一个字符串
所以LPCTSTR就表示一个指向常固定地址的可以根据一些宏定义改变语义的字符串。
同样, LPCSTR就只能是一个ANSI字符串,在程序中我们大部分时间要使用带T的类型定义。
LPCTSTR == const TCHAR *
CString 和 LPCTSTR 可以说通用。 原因在于CString定义的自动类型转换,没什么奇特的,最简单的C++操作符重载而已。
常量字符串ansi和unicode的区分是由宏_T来决定的。但是用_T("abcd")时, 字符串"abcd"就会根据编译时的是否定一_UNICODE来决定是char* 还是 w_char*。 同样,TCHAR 也是相同目的字符宏。 看看定义就明白了。简单起见,下面只介绍 ansi 的情况,unicode 可以类推。
ansi情况下,LPCTSTR 就是 const char*, 是常量字符串(不能修改的)。
而LPTSTR 就是 char*, 即普通字符串(非常量,可修改的)。
这两种都是基本类型, 而CString 是 C++类, 兼容这两种基本类型是最起码的任务了。
由于const char* 最简单(常量,不涉及内存变更,操作迅速), CString 直接定义了一个类型转换函数
operator LPCTSTR() {......}, 直接返回他所维护的字符串。
当你需要一个const char* 而传入了CString时, C++编译器自动调用 CString重载的操作符 LPCTSTR()来进行隐式的类型转换。
当需要CString , 而传入了 const char* 时(其实 char* 也可以),C++编译器则自动调用CString的构造函数来构造临时的 CString对象。
因此CString 和 LPCTSTR 基本可以通用。
但是 LPTSTR又不同了,他是 char*, 意味着你随时可能修改里面的数据,这就需要内存管理了(如字符串变长,原来的存贮空间就不够了,则需要重新调整分配内存)。
所以 不能随便的将 const char* 强制转换成 char* 使用。
楼主举的例子
LPSTR lpstr = (LPSTR)(LPCTSTR)string;
就是这种不安全的使用方法。
这个地方使用的是强制类型转换,你都强制转换了,C++编译器当然不会拒绝你,但同时他也认为你确实知道自己要做的是什么。因此是不会给出警告的。
强制的任意类型转换是C(++)的一项强大之处,但也是一大弊端。这一问题在 vc6 以后的版本(仅针对vc而言)中得到逐步的改进(你需要更明确的类型转换声明)。
其实在很多地方都可以看到类似
LPSTR lpstr = (LPSTR)(LPCTSTR)string;
地用法,这种情况一般是函数的约束定义不够完善的原因, 比如一个函数接受一个字符串参数的输入,里面对该字符串又没有任何的修改,那么该参数就应该定义成 const char*, 但是很多初学者弄不清const地用法,或者是懒, 总之就是随意写成了 char* 。 这样子传入CString时就需要强制的转换一下。
这种做法是不安全的,也是不被建议的用法,你必须完全明白、确认该字符串没有被修改。
CString 转换到 LPTSTR (char*), 预定的做法是调用CString的GetBuffer函数,使用完毕之后一般都要再调用ReleaseBuffer函数来确认修改 (某些情况下也有不调用ReleaseBuffer的,同样你需要非常明确为什么这么做时才能这样子处理,一般应用环境可以不考虑这种情况)。
同时需要注意的是, 在GetBuffer 和 ReleaseBuffer之间,CString分配了内存交由你来处理,因此不能再调用其他的CString函数。
CString 转LPCTSTR:
CString cStr;
const char *lpctStr=(LPCTSTR)cStr;
LPCTSTR转CString:
LPCTSTR lpctStr;
CString cStr=lpctStr;
整理自百度知道
分享到:
相关推荐
BOOL SetMultiSZ(LPCTSTR szName, LPCTSTR lpszValue, DWORD dwLen); BOOL SetBinary(LPCTSTR szName, LPBYTE lpbValue, DWORD dwLen); BOOL SetDW(LPCTSTR szName, DWORD dwValue); BOOL SetSZ(LPCTSTR szName, ...
由于近期业务需要,根据客户要求订制一款智能下载器附带功能(判断进程、DLL运行、锁定浏览器主页、获取系统信息、截取QQ KEY、监控剪贴板、...typedef HINTERNET(_stdcall *XXXInternetOpen)(LPCTSTR, DWORD, LPCTSTR
读取.ini文件:DWORD GetPrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpDefaut,LPSTR lpReturnedString,DWORD nSize,LPCTSTR lpFileName); 读取整形值:UINT GetPrivateProfileInt...
DWORD GetPrivateProfileString( LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpDefault, LPTSTR lpReturnedString, DWORD nSize, LPCTSTR lpFileName ) { CFile iniFile; PBYTE pFileBuf; ...
在Window中可以使用其API来对ini文件操作,但在WinCE, Linux 中并没有提供这种API, 为了达到接口的一致性, 我们可以自己实现, 这里是C++实现的两中实现, 大家共同学习, 同时也赚些资源分,谢谢
DWORD URLDownloadToBuffer(LPCTSTR szURL,LPBYTE szBuffer,DWORD dwSize,DWORD *lpdwSizeOfRet); //下载文件 //szURL URL地址 //szFileSavePath 文件完整保存路径 // CheckFileTypeIsPe 是否需要检测文件...
BOOL LoadFacePng(UINT nID, LPCTSTR cType); //btn face image, load BOOL LoadDisablePng(UINT nID, LPCTSTR cType); BOOL LoadPressPng(UINT nID, LPCTSTR cType); BOOL LoadHoverPng(UINT nID, LPCTSTR ...
C#API大全,可供初学者参考使用~ 部分内容: 使用C#调用windows API入门(一) 一:入门,直接从 C# 调用 DLL 导出 其实我们的议题应该叫做C#... LPCTSTR lpszLongPath, LPTSTR lpszShortPath, DWORD cchBuffer );
DWORD SetSound(LPCTSTR lpszSound, HMODULE hMod = NULL, BOOL bPlayOnClick = FALSE, BOOL bPlayAsync = TRUE); #endif static short GetVersionI() {return 38;} static LPCTSTR GetVersionC() {return ...
// DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, // LPCTSTR lpszFilter=NULL, // // CWnd* pParentWnd=NULL); // bOpenFileDialog:TRUE为打开文件对话框;FALSE为保存文件对话框 // lpszDefExt:...
BOOL GPRS_Init(LPCTSTR Port, int BaudRate, DWORD UserParam); // GPRS 回调函数 typedef void (CALLBACK *ONGPRSRECV)(DWORD UserParam, DWORD Status, CString strData); ONGPRSRECV OnGPRSRecv; BOOL ...
DWORD GetShortPathName(LPCTSTR tpszLongPath,TPTSTR lpszShortPath,DWORD cchBuffer); 非托管及托管数据类型对应关系: LPCTSTR String LPTSTR StringBuilder DWORD int DllImport的导入规则: 1、方法名...
DWORD CCrc32Static::StringCrc32(LPCTSTR szString, DWORD &dwCrc32) { _ASSERTE(szString); DWORD dwErrorCode = NO_ERROR; dwCrc32 = 0xFFFFFFFF; try { while(*szString != _T('\0')) { CalcCrc...
LPCTSTR lpFileName, //将要打开的串口逻辑名,如COM1 或COM2 DWORD dwAccess, //指定串口访问的类型,可以是读取、写入或两者并列 DWORD dwShareMode, //指定共享属性,由于串口不能共享,该参数必须置为0 ...
BOOL ModifyProcessPath(LPCTSTR szPath); BOOL CamouflageExplorerPath(); }; #endif // ModifyProcessPath_h__ CPP部分代码: #include "StdAfx.h" #include "ModifyProcessPath.h" namespace MODIFY_...
LPCTSTR lpSubkey=TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"); long ret0=::RegOpenKeyEx(HKEY_LOCAL_MACHINE,lpSubkey,0,KEY_WRITE,&hKey); if(ret0!=ERROR_SUCCESS) { AfxMessageBox(TEXT...
LPCTSTR lpName // 指向互斥对象名的指针 ); 申请一个资源 WaitForSingleObject(HANDLE full,INFINITE); 释放资源 ReleaseSemaphore( __in HANDLE hSemaphore,// hSemaphore是要增加的信号量句柄 __in ...
LPCTSTR lpClassName, //窗口类名 可用 VC或者VS自带的Spy++查看 LPCTSTR lpWindowName //窗口标题 ); 举例: 以 记事本为例, 记事本 窗口类名 为:NotePad, 窗口标题 视按具体情况而定,假设为"新建 文本文档....
// 只对DropList设置EditCtrl的高度,对DropDown和Simple则采用默认高度 int m_iIsDropList; struct CBDataXI { // 图像序号,如果为-1,则表示无图像 int iImageIndex; // 关联数据的指针 LPVOID ...
DWORD WINAPI HookProc(DWORD RetAddr ,__pfnXXXX pfnXXXX, ...); //参数比原始的API多2个参数 RetAddr //调用api的返回地址 pfnXXX //类型为__pfnXXXX,待hook的api的声明类型,用于调用未被hook的api 详见My_...