// 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用户消息宏详解** 在Windows编程中,`WM_COMMAND`消息是窗口处理程序接收的一个关键消息,它表示用户与窗口控件交互的结果。这个消息宏被广泛用于响应菜单项的选择、控件的单击以及其他用户界面事件。...
WM_Command SendMessage常量,用于流行的应用程序通过从EXE和DLL文件中提取菜单资源,您通常可以发现常量,以通过语言自己自动化这些功能。 .rc文件是文本,类似于以下内容(来自“进程监视器”): CONTEXT_...
在默认情况下,Button控件只响应如WM_LBUTTONDOWN(鼠标左键按下)和WM_COMMAND(按钮点击)等消息,但不直接处理WM_LBUTTONUP。然而,开发者可以通过自定义代码来扩展控件的功能,使其能够对WM_LBUTTONUP做出反应。...
- `Msg`:要发送的消息类型,通常是一个WM_常量,如WM_KEYDOWN或WM_COMMAND。 - `wParam`:与消息相关的附加信息,根据消息类型的不同,它可以代表按键代码或者命令ID。 - `lParam`:另一个与消息相关的参数,如...
`ON_COMMAND` 宏主要用于处理标准的 Windows 命令消息 (`WM_COMMAND`)。当用户通过菜单项或工具栏按钮等界面元素触发事件时,系统会发送 `WM_COMMAND` 消息到相应的窗口。该消息包含了触发事件的控件标识符以及其他...
- **WM_SYSCOMMAND (0x112)**: 此消息与WM_COMMAND类似,但用于系统菜单命令,例如最大化或最小化窗口。 ##### 定时器消息 - **WM_TIMER (0x113)**: 当设置了定时器时,定时器到期后系统会发送此消息。 ##### 滚动...
与常规的消息如`WM_COMMAND`不同,`WM_NOTIFY`提供了更丰富的信息结构和更灵活的通信方式,使其成为处理复杂控件事件的理想选择。 #### WM_NOTIFY的触发场景 `WM_NOTIFY`通常在以下几种情况下被触发: 1. **控件...
WM_COMMAND 消息处理宏有五种,分别是COMMAND_HANDLER_EX、COMMAND_ID_HANDLER_EX、COMMAND_CODE_HANDLER_EX、COMMAND_RANGE_HANDLER_EX和COMMAND_RANGE_CODE_HANDLER_EX。这些宏可以用来处理来自控件的通知消息。 ...
为了测试句柄操作,这个程序可能会模拟用户交互,发送如`WM_PAINT`、`WM_COMMAND`等常见消息,以观察窗口或控件的行为。 总结来说,C#中的句柄操作主要涉及与Windows API的交互,包括查找和管理句柄,以及使用API...
1. **WM_COMMAND**:当菜单项、按钮或控件发送命令时,此消息被发送。可以处理控件的通知代码,比如按钮点击。 2. **WM_TIMER**:定时器触发时发送,常用于实现间隔执行某任务。 3. **WM_MOUSEMOVE**:鼠标移动时...
// Dialog.cpp : 定义应用程序的入口点。... case WM_COMMAND: //基本控件消息处理 break; case WM_CLOSE: EndDialog(hDlg, LOWORD(wParam)); return TRUE; break; } return FALSE; }
本篇文章将深入探讨消息钩子的实现及其在拦截`WM_COMMAND`消息中的应用。 首先,我们需要理解什么是`WM_COMMAND`消息。`WM_COMMAND`是Windows消息的一种,它在用户与菜单、快捷键、控件交互时产生,传递控制ID和...
`ON_UPDATE_COMMAND_UI`和`ON_UPDATE_COMMAND_UI_RANGE`宏用于处理这类消息。 总之,C++中的MFC消息处理机制是通过宏和消息映射机制来实现的,它使得开发者能够方便地处理Windows环境下的各种用户交互和系统事件,...
- `ON_COMMAND_EX(ID, pfn)`:用于处理多个对象共享同一命令ID的情况,返回值改为`BOOL`,以决定是否继续处理。 - `ON_COMMAND_RANGE(nID, nLastID, pfn)`:处理连续ID范围内的命令,通过函数参数确定具体被点击的...
Case msghinstance.WM_KEYDOWN, msghinstance.WM_KEYUP, msghinstance.WM_SYSCOMMAND, msghinstance.WM_COMMAND, _ msghinstance.WM_ACTIVATEAPP, msghinstance.WM_NCACTIVATE, msghinstance.WM_QUERYOPEN msgproc =...
在这个名为"Hook程序-无焦点的CommandButton控件.zip_COMMAND_hook"的压缩包中,我们可以推测它包含了一个示例,展示了如何在没有焦点的情况下处理CommandButton控件的点击事件。这种技术通常在开发用户界面时很有用...
同时,ON_UPDATE_COMMAND_UI宏则用于更新界面状态,确保菜单项的可用性与当前程序状态一致。 在消息映射过程中,ON_COMMAND宏定义了一个处理WM_COMMAND消息的函数,例如: ```cpp ON_COMMAND(IDC_OPEN_FILE, ...
菜单消息:WM_INITMENU、WM_MENUSELECT、WM_INITMENUPOPUP、WM_COMMAND - `WM_INITMENU`:初始化菜单消息,`wParam`指向菜单句柄,`lParam`通常为0。 - `WM_MENUSELECT`:选择菜单项消息,`wParam`包含了所选菜单...
按钮子窗口的WM_COMMAND消息 当按钮被点击时触发此消息。 - `wParam`:低位是子窗口ID,高位是通知码。 - `lParam`:子窗口句柄。 #### 10. 焦点消息 (WM_KILLFOCUS 和 WM_SETFOCUS) 这些消息处理焦点的变化。 -...
6. **WM_COMMAND消息**:当用户与按钮交互时发送,例如点击按钮。通过处理这个消息,我们可以响应用户的操作。 7. **DrawState函数**:用于在窗口上绘制状态化的图标或文本,例如,根据按钮的状态(如按下、悬浮等...