相关疑难解决方法(0)

如何在C++中通过其名称获取进程句柄?

我正在尝试获取example.exe的进程句柄,所以我可以调用TerminateProcess它.我怎样才能做到这一点?请注意,它没有窗口,因此FindWindow无法工作.

c++ winapi process

55
推荐指数
4
解决办法
12万
查看次数

无法升级的程序启动升级更新程序,更新程序应等待程序完成

我有2个应用程序,program.exe和updater.exe,都是用Delphi5编写的.程序在没有admin-rights(并且没有manifest)的情况下运行,updater有一个带有"requireAdministrator"的清单,因为他必须能够在Program-Folder中写入以更新program.exe.

问题是启动更新程序,让他等到程序关闭.我在网上找到了不同的方式,但都没有用(大多数情况下,第一个应用程序启动第二个应用程序并等待第二个应用程序的结束,在我的情况下,第二个应用程序应该等待第一个应用程序的结束).

更新程序应该等待,这很容易
updater.exe

{$R manifest.res}
label.caption:='Wait for program.exe closing';
repeat
    sleep(1000);
until File is not open
ProgramHandle := Read Handle from File
WaitForSingleObject(ProgramHandle,INFINITE);
label.caption:='program.exe CLOSED';
Do updates
Run Code Online (Sandbox Code Playgroud)

方法1
使用CreateProcess启动更新程序:
program.exe

FillChar(siInfo, SizeOf(siInfo), 0);
siInfo.cb := SizeOf(siInfo);

saProcessAttributes.nLength := SizeOf(saProcessAttributes);
saProcessAttributes.lpSecurityDescriptor := nil;
saProcessAttributes.bInheritHandle := TRUE;

saThreadAttributes.nLength := SizeOf(saThreadAttributes);
saThreadAttributes.lpSecurityDescriptor := nil;
saThreadAttributes.bInheritHandle := True;

if CreateProcess(nil,
           PChar('updater.exe'),
           @saProcessAttributes,
           @saThreadAttributes,
           TRUE, NORMAL_PRIORITY_CLASS, nil,
           PChar(ExtractFilePath(Application.ExeName)),
           siInfo, piInfo) then
begin
DuplicateHandle(GetCurrentProcess, GetCurrentProcess,
                piInfo.hProcess, @MyHandle,
                PROCESS_QUERY_INFORMATION, TRUE,
                DUPLICATE_SAME_ACCESS) then
Write MyHandle in a …
Run Code Online (Sandbox Code Playgroud)

delphi createprocess handle waitforsingleobject shellexecuteex

8
推荐指数
1
解决办法
374
查看次数

检查进程ID时使用WaitForSingleObject的好处

使用WaitForSingleObject此处而不是不使用它有什么好处?第一个代码块来自之前的答案.第二个块是我如何做到这一点.

BOOL IsProcessRunning(DWORD pid)
{
    HANDLE process = OpenProcess(SYNCHRONIZE, FALSE, pid);
    DWORD ret = WaitForSingleObject(process, 0);
    CloseHandle(process);
    return (ret == WAIT_TIMEOUT);
}
Run Code Online (Sandbox Code Playgroud)

VS

BOOL IsProcessRunning(DWORD pid)
{
   HANDLE process = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pid);
   const bool exists = (process != NULL);
   CloseHandle(process);
   return exists;
}
Run Code Online (Sandbox Code Playgroud)

似乎使用SYNCHRONIZE需要更高的权限,我只想检查当前用户的PID.

c++ winapi pid

6
推荐指数
1
解决办法
7297
查看次数