阅读:2826回复:12
一个与病毒无太大联系的问题(MASM32不支持CreateWindow API)
MASM32不支持CreateWindow API 函数,但我想在 MASM32 中使用这个函数(它比 CreateWindowEx 好用),该怎么办? ;)
|
|
沙发#
发布于:2003-02-28 12:55
包含Windows.inc文件!!!
|
|
|
板凳#
发布于:2003-03-01 08:54
我查看过 Windows.inc 里面全是一些常量和结构的定义,不进后来我改动 User32.inc 里面与 CreateWindowEx 相关的定义,编译是通过了但在 Link 时却出错了,提示如下:
XXXXXX.obj : error LNK2001: unresolved external symbol _CreateWindowA@48 XXXXXX.exe : fatal error LNK1120: 1 unresolved externals |
|
地板#
发布于:2003-03-01 10:35
连接时连接User32.lib!!!
我不知道MASM里用 includelib user32.lib 行不行。 |
|
|
地下室#
发布于:2003-03-01 11:35
换个高版本的MASM 7.0
|
|
5楼#
发布于:2003-03-02 08:17
我已经在用 MASM32 8.0 啦。
|
|
6楼#
发布于:2003-03-03 02:22
唉,犯了低级错误,好好看看user32.dll输出的函数,根本就没有CreateWindow,只有CreateWindowExA和CreateWindowExW,再看看user32.inc中CreateWindowEx的定义
CreateWindowExA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD CreateWindowEx equ <CreateWindowExA> 我们之所以能用CreateWindow这个SDK API函数,是由于开发工具掩盖了实现的细节,用VC向导建一个简单的WIN32 SDK程序,它就用的是CreateWindow,只要11个参数,比CreateWindowEx少了一个,而这个少的参数通过反汇编可知被赋值为0(NULL),其实还是调用的是CreateWindowExA,现在问题好办了,是用CreateWindowEx还是在user32.inc中加上一行CreateWindow equ <CreateWindowExA>,再在汇编源程序中将第一个参数赋值为NULL,自己选择吧:) |
|
7楼#
发布于:2003-03-03 08:38
WNDCLASSEX 结构 是 WNDCLASS 结构的扩展,而 CreateWindowEx 是 CreateWindow 的扩展,两个函数用不同的结构,没理由先扩展版本后有精简版本吧?!再说 CreateWindow 与 CreateWindowEx 在处理上除了扩展风格的差别外还有其它的不同,例如 CreateWindow 可以自己从标准图标中选择小图标作为应用程序的窗口图标,而 CreateWindowEx 则不能,如果设置了 WNDCLASSEX 结构的 hIcon 位而不设置 hIconSm 的话,应用程序的窗口图标是 Windows 的默认图标,相比之下 CreateWindow 要比 CreateWindowEx 智能些。
我想最重要的一点还是 User32.lib 没有导出这个函数的原故吧! ;) |
|
8楼#
发布于:2003-03-03 13:01
我没用过以前的老版本的WINDOWS,不知CreateWindowEx从何演变而来,但就WIN98 SE来说,是没有CreateWindow这个user32.dll的输出函数的,唯一一个是user.exe输出的CreateWindow,我的理解是不过是将CreateWindowEx的功能进行了保留,功能少的时候就是CreateWindow,有了新的功能就是CreateWindowEx,而且你说的也不完全对,我这里有一个工程,用的是CreateWindow,设置了HIcon,而没有设置hIconSm,程序的窗口图标一样是缺省的,除非设置hIconSm,否则是没有用的
|
|
9楼#
发布于:2003-03-03 13:27
CreateWindowEx的ExStyle参数为0,就成了传说中的CreateWindow
|
|
|
10楼#
发布于:2003-03-04 12:48
我没用过以前的老版本的WINDOWS,不知CreateWindowEx从何演变而来,但就WIN98 SE来说,是没有CreateWindow这个user32.dll的输出函数的,唯一一个是user.exe输出的CreateWindow,我的理解是不过是将CreateWindowEx的功能进行了保留,功能少的时候就是CreateWindow,有了新的功能就是CreateWindowEx,而且你说的也不完全对,我这里有一个工程,用的是CreateWindow,设置了HIcon,而没有设置hIconSm,程序的窗口图标一样是缺省的,除非设置hIconSm,否则是没有用的 //////////////////////////////////////////////////////////// 不会啊!我一直在用 CreateWindow API 一切正常,没你说的那样,我刚才也试过用 WNDCLASSES 结构和 RegisterClassEx API 注册,然后用 CreateWindow 创建窗口,图标正常显示了呀?!部分代码中下: ... WNDCLASS wc; wc.style = CS_VREDRAW | CS_HREDRAW; wc.lpfnWndProc = (WNDPROC) WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE(IDI_ICON) ); wc.hCursor = LoadCursor( NULL, IDC_ARROW ); wc.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH ); wc.lpszMenuName = NULL; wc.lpszClassName = lpszClsName; wc.hInstance = hInstance; if ( !RegisterClass(&wc) ) { MessageBox( NULL, TEXT(\"Window class register error!\"), lpszAppName, MB_OK|MB_ICONERROR ); return FALSE; } hWnd = CreateWindow( lpszClsName, lpszAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL ); ... 我的图标文件含有两个 ICON ,分别是:32x32 和 16x16,编译环境为 VC++ 6.0 企业英文版 + Pack 5 [编辑 - 3/5/03 by SkyEyes] |
|
11楼#
发布于:2003-03-06 11:06
那难怪,你试试用WNDCLASSEX结构,就明白了
我的部分代码如下: ....... WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_MY111111); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = (LPCSTR)IDC_MY111111; wcex.lpszClassName = szWindowClass; wcex.hIconSm =NULL; ....... HWND hWnd; hInst = hInstance; hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); ....... |
|
12楼#
发布于:2003-03-07 09:41
这并不矛盾, WNDCLASSEX 结构不仅是 WNDCLASS 的扩展,在处理图标上,它是对于多图标的应用程序,应用程序图标(hIcon)和窗口图标(hIconSm)是分开的,如果你只设置 hIcon 而 hIconSm 为 NULL 的话,窗口图标就会使用默认图标,所以如果没什么特别需要我喜欢用 WNDCLASS 和 CreateWindow API,我希望在 MASM32 上也使用它们,这是我发这份贴子的原因^_^
|
|