// so that future invocations of the application will see it
// without the user having to reboot the system
WritePrivateProfileStringW( NULL, NULL, NULL, L"appname.ini" );
查了一下msdn中WritePrivateProfileStringW的原型如下:
LPCWSTR lpAppName,
LPCWSTR lpKeyName,
LPCWSTR lpString,
LPCWSTR lpFileName )
其中的每个参数的类型都为LPCWSTR,实际中获得的文件名都为CString,问题产生。
问题分析:
LPCWSTR 是Unicode字符串指针,初始化时串有多大,申请空间就有多大,以后存贮若超过则出现无法预料的结果,这是它与CString的不同之处。而CString是一个串类,内存空间类会自动管理。LPCWSTR 初始化如下:
由于LPCWSTR必须指向Unicode的字符串,问题的关键变成了Anis字符与Unicode字符之间的转换,不同编码间的转换,通过查找资料可知,可以ATL中转换宏可以用如下方法实现:
CString str=_T("TestStr");
USES_CONVERSION;
LPWSTR pwStr=new wchar_t[str.GetLength()+1];
wcscpy(pwStr,T2W((LPCTSTR)str));
CString str=_T("TestStr");
USES_CONVERSION;
LPWCSTR pwcStr = A2CW((LPCSTR)str);
MFC中CString和LPSTR是可以通用,其中A2CW表示(LPCSTR) -> (LPCWSTR),USER_CONVERSION表示用来定义一些中间变量,在使用ATL的转换宏之前必须定义该语句。
顺便也提一下,如果将LPCWSTR转换成CString,那就更加容易,在msdn中的CString类说明中提到了可以直接用LPCWSTR来构造CString,所以可以进行如下的转换代码:
CString str(pcwStr);
问题总结:
在头文件<atlconv.h>中定义了ATL提供的所有转换宏,如:
A2W (LPCSTR) -> (LPWSTR)
W2CA (LPCWSTR) -> (LPCSTR)
W2A (LPCWSTR) -> (LPSTR)
所有的宏如下表所示:
A2BSTR | OLE2A | T2A | W2A |
A2COLE | OLE2BSTR | T2BSTR | W2BSTR |
A2CT | OLE2CA | T2CA | W2CA |
A2CW | OLE2CT | T2COLE | W2COLE |
A2OLE | OLE2CW | T2CW | W2CT |
A2T | OLE2T | T2OLE | W2OLE |
A2W | OLE2W | T2W | W2T |
上表中的宏函数,非常的有规律,每个字母都有确切的含义如下:
2 | to 的发音和 2 一样,所以借用来表示“转换为、转换到”的含义。 |
A | ANSI 字符串,也就是 MBCS。 |
W、OLE | 宽字符串,也就是 UNICODE。 |
T | 中间类型T。如果定义了 _UNICODE,则T表示W;如果定义了 _MBCS,则T表示A |
C | const 的缩写 |
利用这些宏,可以快速的进行各种字符间的转换。使用前必须包含头文件,并且申明USER_CONVERSION;使用 ATL 转换宏,由于不用释放临时空间,所以使用起来非常方便。但是考虑到栈空间的尺寸(VC 默认2M),使用时要注意几点:
1、只适合于进行短字符串的转换;
2、不要试图在一个次数比较多的循环体内进行转换;
3、不要试图对字符型文件内容进行转换,因为文件尺寸一般情况下是比较大的;
4、对情况 2 和 3,要使用 MultiByteToWideChar() 和 WideCharToMultiByte();
CString str=_T("TestStr");
USES_CONVERSION;
LPWCSTR pwcStr = A2CW((LPCSTR)str);
=>LPWCSTR pwcStr = A2CW((LPCSTR)str.GetBuffer());
相关推荐
WM_COMMAND user message macroWM_COMMAND用户消息宏(5KB)
WM_Command SendMessage常量,用于流行的应用程序通过从EXE和DLL文件中提取菜单资源,您通常可以发现常量,以通过语言自己自动化这些功能。 .rc文件是文本,类似于以下内容(来自“进程监视器”): CONTEXT_...
WM_COMMAND= $0111 //当用户选择一条菜单命令项或当某个控件发送一条消息给它的父窗口,一个快捷键被翻译 WM_SYSCOMMAND = $0112 //当用户选择窗口菜单的一条命令或当用户选择最大化或最小化时那个窗口会收到此消息...
// Dialog.cpp : 定义应用程序的入口点。... case WM_COMMAND: //基本控件消息处理 break; case WM_CLOSE: EndDialog(hDlg, LOWORD(wParam)); return TRUE; break; } return FALSE; }
Case msghinstance.WM_KEYDOWN, msghinstance.WM_KEYUP, msghinstance.WM_SYSCOMMAND, msghinstance.WM_COMMAND, _ msghinstance.WM_ACTIVATEAPP, msghinstance.WM_NCACTIVATE, msghinstance.WM_QUERYOPEN msgproc =...
如果用户自定义的类要求响应普通的Windows消息(也就是以WM_开头,除了WM_COMMAND以外的消息,这类消息在WM_USER以下的是系统消息,WM_USER以上的可以由用户自己定义),那就要求自定义的类必须从CWnd中派生。...
5、掌握WM_CREATE、WM_COMMAND、鼠标消息的处理方法 6、掌握菜单的使用(菜单消息处理) 7、掌握文件存储(设计存储结构、文件的保存与打开) 8、掌握对话框的使用和参数传递 9、掌握全局变量、外部静态变量、局部...
WM_MENUCOMMAND = 0x0126, WM_CTLCOLORMSGBOX = 0x0132, WM_CTLCOLOREDIT = 0x0133, WM_CTLCOLORLISTBOX = 0x0134, WM_CTLCOLORBTN = 0x0135, WM_CTLCOLORDLG = 0x0136, WM_CTLCOLORSCROLLBAR = 0x...
以WM_NOTIFY和WM_COMMAND消息形式发送的通知消息包含各种信息。WM_COMMAND消息的参数包含发送通知消息的控件ID,控件的窗口句柄和通知代码,WM_NOTIFY消息的参数还包含一个NMHDR数据结构的指针。
实现方式:SendMessage (hWnd, #WM_COMMAND....)。此源码谈不上技术含量,关键是那几个视图方式的常量。查找窗口句柄的方式有很多,本论坛也有很多相关源码了,如果查找句柄失败请自己修改一下吧。@易语言入门教程。
m_niconData.uCallbackMessage=WM_COMMAND; CString strTitle=_T("系统托盘程序测试"); _tcscpy_s(this->m_niconData.szTip,sizeof(this->m_niconData.szTip)-1,strTitle); //设置提示文本 Shell_NotifyIcon...
一个静态 TWAIN 助手类 CTwainHelper。...如果图像已准备好 (如用户确定扫描图像),窗口会收到 WM_COMMAND 消息,wParam 为 IDC_TwainHelper。此时应用程序可以调用 CTwainHelper::TransferImage() 获取图像到文件中。
.elseif eax == WM_COMMAND mov eax,wParam push hWnd pop hWinMain .if ax == IDOK invoke RtlZeroMemory,addr szServer,sizeof szServer invoke RtlZeroMemory,addr szUser,sizeof szUser ...
除WM_COMMAND之外,所有的以WM_开头的消息。从CWnd派生的类,都可以接受到这类消息。注意:标准消息并不需要我们指定处理函数名称,是默认的对应关系。 宏名称 对应消息 消息处理函数 ON_WM_CHAR WM_CHAR OnChar ON_...
例如你希望对菜单选择进行处理那么你可以定义对WM_COMMAND进行处理的代码,如果希望在窗口中进行图形输出就必须对WM_PAINT进行处理。 3、未处理的消息到那里去了:M$为窗口编写了默认的窗口过程,这个窗口过程将...
HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand); HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose); } return FALSE; } void CALLBACK Time(HWND hwnd,UINT message,UINT iTimerID,DWORD dwTime) { SYSTEMTIME i...
WM_COMMAND: begin if (HIWORD(wParam) = BN_CLICKED) then // 单击按钮 begin case LOWORD(wParam) of // 控件ID ControlID1: begin end; ControlID2: SendMessage(hForm, WM_CLOSE, 0, 0); end; end...
ON_WM_LBUTTONDBLCLK() ON_WM_LBUTTONDOWN() ON_WM_MOUSEMOVE() ON_WM_LBUTTONUP() //}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_...
注:REGCMD和REGMSG其实有一个冲突的地方,就是WM_COMMAND,这个要看WM_COMMAND放置的次序,REGMSG(WM_COMMAND)之前的 REGCMD的函数会执行,之后的REGCMD的函数则会被屏蔽,不会执行到,不管WM_COMMAND消息里是否...