宽字符问题

AHXYS 2009-04-14 05:23:37
在Visual Studio中新建一个C++项目时,已经定义了_UNICODE(就像已经定义了UNICODE一样),那么调用API时,WINDOWS会自动根据头文件寻找其宽字符版本.
现在开发环境变成EC+CDT+WINGW,发现即使自己定义了UNICODE,WINDOWS也不会自动扩展该API的宽字符版本.虽然用非宽字符版本可以通过编译,不过运行时会报错.
请教各位此问题解决办法
PS. 我是新手,如果问题问得太菜鸟请不要嘲笑,不耻下问才能进步,谢谢大家~~~~~
...全文
64 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
AHXYS 2009-04-15
  • 打赏
  • 举报
回复
感谢2楼,3楼的回复.
TO fairchild811: 直接显示调用宽字符版本的办法不行,我已经试过了,抱歉.
而且,就算可以这样解决问题,我觉得也并不是好办法,决定调用哪个版本函数的决定权应该在WINDOWS
这样才能保证程序在16位,32位或者64位平台上具有可移植性.请问还由没有其他方法.

TO fox000002: 代码不是我自己写的,是我COPY<<windows程序设计>>上的代码,我姑且贴出来请你看看,不过坦白说我觉得是环境配置的问题的可能性多一点.

#define UNICODE
#define _UNICODE
#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow) {
static TCHAR szAppName[] = TEXT ("HelloWin");
HWND hwnd;
MSG msg;
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
//wndclass.hbrBackground= (HBRUSH) GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName= szAppName;
if (!RegisterClass (&wndclass)) {
MessageBox(NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR);
return 0;
}
hwnd = CreateWindow( szAppName, // window class name
TEXT ("The Hello Program"), // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT,// initial x position
CW_USEDEFAULT,// initial y position
CW_USEDEFAULT,// initial x size
CW_USEDEFAULT,// initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL); // creation parameters
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
while (GetMessage (&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch (message) {
case WM_CREATE:
//PlaySound (TEXT("hellowin.wav"), NULL, SND_FILENAME| SND_ASYNC);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect);
DrawText(hdc, TEXT("Hello, Windows xp!"), -1, &rect, DT_SINGLELINE| DT_CENTER
| DT_VCENTER);
EndPaint(hwnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);

}

问题就处在红色那段代码,正常如果注册一个窗口成功的话是不会提示"This program requires Windows NT"的
头两行的#define是我自己加的.去掉也不能解决问题.

写MAKEFILE编译: 主要部分如下
One.exe : Chapter_Two/One/HELLOWIN.C
gcc -o Chapter_Two/One/One.exe Chapter_Two/One/HELLOWIN.C

我再声明一遍,这个程序是没有错误的.就是说它可以正常编译并生成.exe文件运行.问题在于,并非我想要的结果.
比如WNDCLASS, 系统自动调用了WNDCLASSA这个函数,正常情况如果定义了UNICODE,系统应该调用WNDCLASSW这个版本.
谢谢~~~~~

fairchild811 2009-04-14
  • 打赏
  • 举报
回复
显式调用宽字符版的
fox000002 2009-04-14
  • 打赏
  • 举报
回复
lz 可以给一个示例代码

然后给出错误信息

6,849

社区成员

发帖
与我相关
我的任务
社区描述
Windows 2016/2012/2008/2003/2000/NT
社区管理员
  • Windows Server社区
  • qishine
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧