被一个简单的windows程序卡死了,帮帮忙!!!//// C04SWA.CPP// Simple Windows Application Template// Copyright (c) Chris H. Pappas and William H. Murray, 1992//#include <windows.h>LONG FAR PASCAL WndProc(HWND,UINT,WPARAM,LPARAM);char szProgName[]="ProgName";// Remove next line for Microsoft C++ compile//#pragma argsusedint PASCAL WinMain(HINSTANCE hInst,HINSTANCE hPreInst, LPSTR lpszCmdLine,int nCmdShow){ HWND hWnd; MSG lpMsg; WNDCLASS wcApp; if (!hPreInst) { wcApp.lpszClassName=szProgName; wcApp.hInstance =hInst; wcApp.lpfnWndProc =WndProc; wcApp.hCursor =LoadCursor(NULL,IDC_ARROW); wcApp.hIcon =NULL; wcApp.lpszMenuName =NULL; wcApp.hbrBackground=GetStockObject(WHITE_BRUSH); wcApp.style =CS_HREDRAW|CS_VREDRAW; wcApp.cbClsExtra =0; wcApp.cbWndExtra =0; if (!RegisterClass (&wcApp)) return FALSE; } hWnd=CreateWindow(szProgName,"Simple Windows Application", WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,(HWND)NULL,(HMENU)NULL, (HANDLE)hInst,(LPSTR)NULL); ShowWindow(hWnd,nCmdShow); UpdateWindow(hWnd); while (GetMessage(&lpMsg,NULL,NULL,NULL)) { TranslateMessage(&lpMsg); DispatchMessage(&lpMsg); } return(lpMsg.wParam);}LONG FAR PASCAL WndProc(HWND hWnd,UINT messg, WPARAM wParam,LPARAM lParam){ PAINTSTRUCT ps; HDC hdc; switch (messg) { case WM_PAINT: hdc=BeginPaint(hWnd,&ps);//--------- your routines below ---------//--------- your routines above --------- ValidateRect(hWnd,NULL); EndPaint(hWnd,&ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return(DefWindowProc(hWnd,messg,wParam,lParam)); } return(0L);}代码如上。载vc++6.0环境下编译总是出现如下错误:H:/VC++/Windows 3.1/C04SWA.CPP(29) : error C2440: '=' : cannot convert from 'void *' to 'struct HBRUSH__ *' Conversion from 'void*' to pointer to non-'void' requires an explicit castH:/VC++/Windows 3.1/C04SWA.CPP(40) : error C2664: 'CreateWindowExA' : cannot convert parameter 11 from 'void *' to 'struct HINSTANCE__ *' Conversion from 'void*' to pointer to non-'void' requires an explicit cast第一个错误似乎可以经过强制转化解决(也不知对不对,汗!),第二个错误怎么也搞不定,我都要崩溃了。本来是为了学好VC才特意去看windows编程的,结果一开始就撞墙。各位大侠请伸出援手,帮忙解决一下,请同志们多多回帖,出个主意。谢谢! 回复人:dawulibo 回复时间:2005-12-15 9:04:00一觉醒来,忽然想到VC也可以由wizards代劳写出win32代码,于是赶紧上实验室wizards一个,与自己那个比较一下,发现了不同之处。向导生成的代码中的CreateWindow里,参数没有一个有前缀括号说明数据类型,我于是干脆把自己的(其实是书上的)代码也去掉说明,居然编译通过了,然后连接虽然有错,但那是小问题了,很容易就解决了。真是畅快啊!不过遗憾的是我不知道原因,如果有高手知道一二,还望指点迷津。在此拜谢了 回复人:amons 回复时间:2005-12-15 9:40:00这个要强制转换 wcApp.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);这个里面的参数不要强制转换hWnd=CreateWindow(szProgName,"Simple Windows Application", WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,NULL,NULL, hInst,NULL); 回复人:dawulibo 回复时间:2005-12-15 9:45:00对,就是这样的。可是我怎么也想不明白。原因在哪里。 回复人:boxertony 回复时间:2005-12-15 10:27:00CreateWindows的倒数第二个参数的类型是HINSTANCE,而不是HANDLE,你不能乱强制转换呀。 回复人:amons 回复时间:2005-12-15 17:43:00我只知道在WinAPI中有一大堆以大写H开头的东东,通常叫句柄,其实都是指针,在VC中特别是WinAPI 中会经常遇到,这些句柄的区别就不知道了。为了把这两个句柄整明白,就在VC的头文件中搜索这些句柄的原始定义,用关键字搜索文件。 整个程序只有一个头文件windows.h,这个头文件里又包含了一堆头文件,定义肯定在这些头文件里面,搜索之后在头文件windef.h中发现了一句DECLARE_HANDLE(HINSTANCE);DECLARE_HANDLE一看就知道是个宏定义,什么意思呢?继续在windef.h中找这里面没有DECLARE_HANDLE的定义,但却只包含了一个头文件#include <winnt.h>终于在winnt.h中找到HANDLE和DECLARE_HANDLE的定义typedef void *HANDLE;#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name费了老大劲终于整明白了:HANDLE就是void*,而WINDEF.H中的这一句DECLARE_HANDLE(HINSTANCE); HINSTANCE成了struct HINSTANCE##*型(在错误提示中怎么又成了struct HINSTANCE__* 就不明白了),也就是说HINSTANCE和HANDLE都是指针, HANDLE是void指针, HINSTANCE是结构体指针。结构体指针赋给void指针当然没问题,void指针赋给结构体指针就要强制转换了。举个例子:HANDLE hdl;HINSTANCE hin;hdl=hin;//正确hin=hdl;//错误hin=(HINSTANCE)hal;//强制转换,正确。其它的句柄和HINSTANCE差不多的,只有HANDLE比较特殊。还有CreateWindow函数的自动提示参数类型是不对的,那个参数要求应该是HINSTANCE。