标题:编译运行吋,Process32First()出错。
只看楼主
tigerdown
Rank: 1
等 级:新手上路
帖 子:63
专家分:3
注 册:2017-8-21
结帖率:69.23%
已结贴  问题点数:20 回复次数:7 
编译运行吋,Process32First()出错。
这是书上的源码(见下), 用masm编译时出错
ProcessList.obj : error LNK2001: unresolved external symbol _Process32First@8
ProcessList.obj : error LNK2001: unresolved external symbol _Process32Next@8
ProcessList.exe : fatal error LNK1120: 2 unresolved externals
NMAKE : fatal error U1077: 'C:\masm32\bin\Link.EXE' : return code '0x460'
Stop.


查阅了一下网上,有人说需要初始化sizeof(Process32First)为dwSize:

http://msdn.(v=vs.85).aspx

dwSize
The size of the structure, in bytes. Before calling the Process32First function, set this member to sizeof(PROCESSENTRY32). If you do not initialize dwSize, Process32First fails.


但是,在汇编语言里怎样实现?


补充一下, 在kernel32.inc是这样定义的:
Process32FirstW PROTO STDCALL :DWORD,:DWORD
IFDEF __UNICODE__
  Process32First equ <Process32FirstW>
ENDIF


Process32NextW PROTO STDCALL :DWORD,:DWORD
IFDEF __UNICODE__
  Process32Next equ <Process32NextW>
ENDIF


codes:
=================
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .386
        .model flat, stdcall
        option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include        windows.inc
include        user32.inc
includelib    user32.lib
include        kernel32.inc
includelib    kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN    equ    1000
DLG_MAIN    equ    1000
IDC_PROCESS    equ     1001
IDC_REFRESH    equ     1002
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .data?
hInstance    dd    ?
hWinList    dd    ?

        .const
szErrTerminate    db    '无法结束指定进程!',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

        .code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_GetProcessList    proc    _hWnd
        local    @stProcess:PROCESSENTRY32
        local    @hSnapShot

        invoke    RtlZeroMemory,addr @stProcess,sizeof @stProcess
        invoke    SendMessage,hWinList,LB_RESETCONTENT,0,0
        mov    @stProcess.dwSize,sizeof @stProcess
        invoke    CreateToolhelp32Snapshot,TH32CS_SNAPALL,0  ;;;;;;Change to TH32CS_SNAPALL
        mov    @hSnapShot,eax
        invoke    Process32First, @hSnapShot, addr @stProcess
        .while    eax
            invoke    SendMessage,hWinList,LB_ADDSTRING,0,addr @stProcess.szExeFile
            invoke    SendMessage,hWinList,LB_SETITEMDATA,eax,@stProcess.th32ProcessID
            invoke    Process32Next, @hSnapShot, addr @stProcess
        .endw
        invoke    CloseHandle,@hSnapShot
        invoke    GetDlgItem,_hWnd,IDOK
        invoke    EnableWindow,eax,FALSE
        ret

_GetProcessList    endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlgMain    proc    uses ebx edi esi hWnd,wMsg,wParam,lParam

        mov    eax,wMsg
        .if    eax == WM_CLOSE
            invoke    EndDialog,hWnd,NULL
        .elseif    eax == WM_INITDIALOG
            invoke    GetDlgItem,hWnd,IDC_PROCESS
            mov    hWinList,eax
            invoke    _GetProcessList,hWnd
;********************************************************************
        .elseif    eax == WM_COMMAND
            mov    eax,wParam
            .if    ax ==    IDOK
                invoke    SendMessage,hWinList,LB_GETCURSEL,0,0
                invoke    SendMessage,hWinList,LB_GETITEMDATA,eax,0
                invoke    OpenProcess,PROCESS_TERMINATE,FALSE,eax
                .if    eax
                    mov    ebx,eax
                    invoke    TerminateProcess,ebx,-1
                    invoke    CloseHandle,ebx
                    invoke    Sleep,200
                    invoke    _GetProcessList,hWnd
                    jmp    @F
                .endif
                invoke    MessageBox,hWnd,addr szErrTerminate,NULL,MB_OK or MB_ICONWARNING
                @@:
;********************************************************************
            .elseif    ax ==    IDC_REFRESH
                invoke    _GetProcessList,hWnd
;********************************************************************
            .elseif    ax ==    IDC_PROCESS
                shr    eax,16
                .if    ax ==    LBN_SELCHANGE
                    invoke    GetDlgItem,hWnd,IDOK
                    invoke    EnableWindow,eax,TRUE
                .endif
            .endif
;********************************************************************
        .else
            mov    eax,FALSE
            ret
        .endif
        mov    eax,TRUE
        ret

_ProcDlgMain    endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
        invoke    GetModuleHandle,NULL
        mov    hInstance,eax
        invoke    DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
        invoke    ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        end    start

[此贴子已经被作者于2021-1-2 11:07编辑过]

搜索更多相关主题的帖子: hWnd If mov NULL invoke 
2021-01-02 10:45
tigerdown
Rank: 1
等 级:新手上路
帖 子:63
专家分:3
注 册:2017-8-21
得分:0 
冒着风险装了旧版masm, 成功了。旧版的kernel32.inc是这样定义的:
Process32First PROTO STDCALL :DWORD,:DWORD
Process32Next PROTO STDCALL :DWORD,:DWORD
2021-01-02 18:24
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:337
专家分:2462
注 册:2016-5-15
得分:0 
问题解决了就好
2021-01-03 06:34
tigerdown
Rank: 1
等 级:新手上路
帖 子:63
专家分:3
注 册:2017-8-21
得分:0 
回复 3楼 Valenciax
问你一个问题,如果仍用新版的话,有啥办法在源码里定义一下。例如,有人用这个办法,
    .DATA?

process32       PROCESSENTRY32      <>

        .CODE

        mov     process32.dwSize,sizeof PROCESSENTRY32

但不成功,听听你的建议。

[此贴子已经被作者于2021-1-3 08:58编辑过]

2021-01-03 08:53
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:337
专家分:2462
注 册:2016-5-15
得分:20 
回复 4楼 tigerdown
不知楼主是否只有这个源程式,这个代码里没有pop up视窗的细节,所以应该还有一个xxx.rc和rc里要求的include档RESOURCE.H(必须)或ico档(不必有),
RESOURCE.H是 include目录有的.

makefile时会把.rc里指出的ico和popup的视窗细节等等制作成.res资源档,再用link去连结.

至于symbol _Process32First@8的问题,这是ansi和unicode的不同编码而引发的,都要在kernel32.inc和kernel32.lib去解决,
楼主可以下载这个kernel32版本

链接:
https://pan.baidu.com/s/1HVRasOsnh-i70M38FK2Jjg
提取码:qll5



解压后kernel32.inc和kernel32.lib放在某个目录,不必覆盖原档,只要修改2句即可.
include        \xxxx\yyyy\kernel32.inc
includelib    \xxxx\yyyy\kernel32.lib

另外,在.data?之上加2句

Process32First PROTO STDCALL :DWORD,:DWORD
Process32Next PROTO STDCALL :DWORD,:DWORD
2021-01-03 20:19
tigerdown
Rank: 1
等 级:新手上路
帖 子:63
专家分:3
注 册:2017-8-21
得分:0 
Rc文件没贴出来,很不错,谢你了!.
2021-01-03 20:33
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:337
专家分:2462
注 册:2016-5-15
得分:0 
回复 6楼 tigerdown
问题解决了?
2021-01-03 21:09
tigerdown
Rank: 1
等 级:新手上路
帖 子:63
专家分:3
注 册:2017-8-21
得分:0 
回复 7楼 Valenciax
从长远之计,我安装了两个版本,把需要运行版本的文件夹名设置为masm,否之为masm_xxx. 当然我也可以采纳你的建议,拷贝旧的kernel文件,然后在头文件里标明文件路径,但这样做是否有局限性,其它函数是否对得上,毕竟api是个汪洋大海,而且还不断变化。另外,微软为什么把它设置为unicode, 为了显示中文,这么人性化,还是说在某些敏感api里做点手脚,给你添堵,还有,旧版在官网里己不存在,得从其它地方下载,所以有点不放心。
 不管怎样,问题己解决,再次感谢你的帮助。在漫漫的it路上,可能还有许多事要请教你,请你千万别介意。
2021-01-04 07:55



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-504480-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.116300 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved