SkyEyes
驱动牛犊
驱动牛犊
  • 注册日期2003-02-13
  • 最后登录2008-08-05
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望12点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
阅读:2741回复:12

一个与病毒无太大联系的问题(MASM32不支持CreateWindow API)

楼主#
更多 发布于:2003-02-25 13:11
MASM32不支持CreateWindow API 函数,但我想在 MASM32 中使用这个函数(它比 CreateWindowEx 好用),该怎么办? ;)
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-02-28 12:55
包含Windows.inc文件!!!
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
SkyEyes
驱动牛犊
驱动牛犊
  • 注册日期2003-02-13
  • 最后登录2008-08-05
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望12点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-03-01 10:35
连接时连接User32.lib!!!
我不知道MASM里用
includelib user32.lib
行不行。
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
bsod1977
驱动牛犊
驱动牛犊
  • 注册日期2003-03-01
  • 最后登录2003-03-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-03-01 11:35
换个高版本的MASM 7.0
SkyEyes
驱动牛犊
驱动牛犊
  • 注册日期2003-02-13
  • 最后登录2008-08-05
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望12点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-03-02 08:17
我已经在用 MASM32 8.0 啦。
bsod1977
驱动牛犊
驱动牛犊
  • 注册日期2003-03-01
  • 最后登录2003-03-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分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,自己选择吧:)
SkyEyes
驱动牛犊
驱动牛犊
  • 注册日期2003-02-13
  • 最后登录2008-08-05
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望12点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-03-03 08:38
WNDCLASSEX 结构 是 WNDCLASS 结构的扩展,而 CreateWindowEx 是 CreateWindow 的扩展,两个函数用不同的结构,没理由先扩展版本后有精简版本吧?!再说 CreateWindow 与 CreateWindowEx 在处理上除了扩展风格的差别外还有其它的不同,例如 CreateWindow 可以自己从标准图标中选择小图标作为应用程序的窗口图标,而 CreateWindowEx 则不能,如果设置了 WNDCLASSEX 结构的 hIcon 位而不设置 hIconSm 的话,应用程序的窗口图标是 Windows 的默认图标,相比之下 CreateWindow 要比 CreateWindowEx 智能些。
我想最重要的一点还是 User32.lib 没有导出这个函数的原故吧! ;)
bsod1977
驱动牛犊
驱动牛犊
  • 注册日期2003-03-01
  • 最后登录2003-03-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-03-03 13:01
我没用过以前的老版本的WINDOWS,不知CreateWindowEx从何演变而来,但就WIN98 SE来说,是没有CreateWindow这个user32.dll的输出函数的,唯一一个是user.exe输出的CreateWindow,我的理解是不过是将CreateWindowEx的功能进行了保留,功能少的时候就是CreateWindow,有了新的功能就是CreateWindowEx,而且你说的也不完全对,我这里有一个工程,用的是CreateWindow,设置了HIcon,而没有设置hIconSm,程序的窗口图标一样是缺省的,除非设置hIconSm,否则是没有用的
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-03-03 13:27
CreateWindowEx的ExStyle参数为0,就成了传说中的CreateWindow
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
SkyEyes
驱动牛犊
驱动牛犊
  • 注册日期2003-02-13
  • 最后登录2008-08-05
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望12点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
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]
bsod1977
驱动牛犊
驱动牛犊
  • 注册日期2003-03-01
  • 最后登录2003-03-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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);
.......
SkyEyes
驱动牛犊
驱动牛犊
  • 注册日期2003-02-13
  • 最后登录2008-08-05
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望12点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-03-07 09:41
这并不矛盾, WNDCLASSEX 结构不仅是 WNDCLASS 的扩展,在处理图标上,它是对于多图标的应用程序,应用程序图标(hIcon)和窗口图标(hIconSm)是分开的,如果你只设置 hIcon 而 hIconSm 为 NULL 的话,窗口图标就会使用默认图标,所以如果没什么特别需要我喜欢用 WNDCLASS 和 CreateWindow API,我希望在 MASM32 上也使用它们,这是我发这份贴子的原因^_^
游客

返回顶部