MASM32编程用两种方法运行外部程序并等待其结束

简介: MASM32编程用两种方法运行外部程序并等待其结束

在实现DelUninstall的卸载软件功能时,我们需要运行软件所指定的卸载程序,并等待其进程结束。

 

在用API函数WaitForSingleObject来等卸载程序进程结束时:

 

 

 

DWORD WaitForSingleObject(  HANDLE hHandle, // 等待对象的句柄  DWORD dwMilliseconds // 等待毫秒数,INFINITE表示无限等待 );

 

我们需要把进程句柄作为第一个参数传递给它。

 

要得到卸载程序运行时的进程句柄,我们至少有两个方法:

 

一、使用API函数ShellExecuteEx来运行卸载程序。

 

ShellExecuteEx的原型为:

 

BOOL ShellExecuteEx( LPSHELLEXECUTEINFO lpExecInfo );

 

其参数所指向的结构SHELLEXECUTEINFO定义为:

typedef struct _SHELLEXECUTEINFO
{
    DWORD cbSize;
    ULONG fMask;
    HWND hwnd;
    LPCTSTR lpVerb;
    LPCTSTR lpFile;
    LPCTSTR lpParameters;
    LPCTSTR lpDirectory;
    int nShow;
    HINSTANCE hInstApp;
    LPVOID lpIDList;
    LPCTSTR lpClass;
    HKEY hkeyClass;
    DWORD dwHotKey;
    union
    {
        HANDLE hIcon;
        HANDLE hMonitor;
    } DUMMYUNIONNAME;
    HANDLE hProcess;
} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;

我们把卸载程序的命令行字符串首地址赋给SHELLEXECUTEINFO的成员lpFile,在调用成功后,在SHELLEXECUTEINFO的成员hProcess中保存着进程的句柄。

 

二、使用API函数CreateProcess来运行卸载程序。

 

CreateProcess的原型为:

BOOL WINAPI CreateProcess(
  __in_opt     LPCTSTR lpApplicationName,
  __inout_opt  LPTSTR lpCommandLine,
  __in_opt     LPSECURITY_ATTRIBUTES lpProcessAttributes,
  __in_opt     LPSECURITY_ATTRIBUTES lpThreadAttributes,
  __in         BOOL bInheritHandles,
  __in         DWORD dwCreationFlags,
  __in_opt     LPVOID lpEnvironment,
  __in_opt     LPCTSTR lpCurrentDirectory,
  __in         LPSTARTUPINFO lpStartupInfo,
  __out        LPPROCESS_INFORMATION lpProcessInformation
);

我们把卸载程序的命令行字符串首地址传给第2个参数lpCommandLine,同时我们初始化一个STARTUPINFO结构变量和一个PROCESS_INFORMATION结构变量,并把其地址作为第9和第10个参数传递。

 

PROCESS_INFORMATION结构定义为:

typedef struct _PROCESS_INFORMATION
{
  HANDLE hProcess;
  HANDLE hThread;
  DWORD  dwProcessId;
  DWORD  dwThreadId;
}PROCESS_INFORMATION, *LPPROCESS_INFORMATION;

调用成功后,进程句柄就存放在PROCESS_INFORMATION结构变量的成员hProcess中。

 

下面是DelUninstall中有关代码,当常量c_UseshlExec值为1时,我们使用ShellExecuteEx来实现,否则使用CreateProcess:

;lpszUnFile:卸载程序的命令行字符串首地址
UninstallA proc  lpszUnFile: LPSTR

c_UseshlExec equ 1

if c_UseshlExec eq 1
    local siExeInfo: SHELLEXECUTEINFO
else
    local piProcInfo: PROCESS_INFORMATION
    local siStartInfo: STARTUPINFO
endif   ; c_UseshlExec

   
if c_UseshlExec eq 1

 invoke RtlZeroMemory, addr siExeInfo, sizeof SHELLEXECUTEINFO
 mov siExeInfo.cbSize, sizeof SHELLEXECUTEINFO
 mov eax, lpszUnFile
 mov siExeInfo.lpFile, eax
 mov siExeInfo.fMask, SEE_MASK_NOCLOSEPROCESS
 mov siExeInfo.nShow, SW_HIDE
 invoke ShellExecuteEx, addr siExeInfo
 test eax, eax
 jz @F

 invoke WaitForSingleObject, siExeInfo.hProcess, INFINITE

else    ; c_UseshlExec

 invoke RtlZeroMemory, addr siStartInfo, sizeof STARTUPINFO
 invoke RtlZeroMemory, addr piProcInfo, sizeof PROCESS_INFORMATION
 mov siStartInfo.cb, sizeof STARTUPINFO

 xor ebx, ebx
 invoke CreateProcess, ebx, lpszUnFile,/
     ebx,/ ;process security attributes
     ebx,/ ;primary thread security attributes
     ebx,/ ;handles are inherited
     ebx,/ ;creation flags
     ebx,/ ;use parent's environment
     ebx,/ ;use parent's current directory
     addr siStartInfo,/;STARTUPINFO pointer
     addr piProcInfo   ;receives PROCESS_INFORMATION  

 invoke WaitForSingleObject, piProcInfo.hProcess, INFINITE

        endif   ;c_UseshlExec
    .endif
@@:
    ret
UninstallA endp
相关文章
|
开发者 Windows
'wepy' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
'wepy' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
135 0
|
3月前
|
API Windows
MASM32编程分析、获取命令行参数
MASM32编程分析、获取命令行参数
|
7月前
|
开发工具 C语言
主程序、子程序链接、子程序的编译
【5月更文挑战第14天】主程序、子程序链接、子程序的编译。
35 1
|
7月前
|
Unix Linux Shell
Linux系统编程(exec函数家族和system函数)
Linux系统编程(exec函数家族和system函数)
96 0
|
Java Python Windows
【已解决】‘python‘ 不是内部或外部命令,也不是可运行的程序或批处理文件
【已解决】‘python‘ 不是内部或外部命令,也不是可运行的程序或批处理文件
|
编译器 Linux C语言
在C语言/C++中把资源编译进exe可执行文件,并运行时释放资源
在C语言/C++中把资源编译进exe可执行文件,并运行时释放资源
407 0
|
Linux C语言
介绍几种LINUX编程中非常实用的调试程序宏变量
介绍几种LINUX编程中非常实用的调试程序宏变量
C++ 编写DLL文件给易语言调用
  摸索了两天了,终于解决了所有问题,在此跟大家分享。   需要三个文件,dll_demo.h、dll_demo.cpp、dll_dome.def   直接上代码:   头文件如下: 1 #ifndef _DLL_DEMO_H_ 2 #define _DLL_DEMO_H_ 3 #ifdef DL...
2182 0
|
SQL Java 数据库连接
第一个JDBC程序
第一个JDBC程序
成功解决 python 不是内部或外部命令,也不是可运行的程序或批处理文件
成功解决 python 不是内部或外部命令,也不是可运行的程序或批处理文件
成功解决 python 不是内部或外部命令,也不是可运行的程序或批处理文件