如何检查一个win32 exe文件是否已经在运行?(使用win32 API代码)

3

我想检查一个win32 EXE文件是否已经在运行(仅知道文件路径和名称)。

请告诉我如何使用win32 API代码实现它。

非常感谢!

我的意思是只有每个EXE路径才能运行一个实例。


它是否有关联的窗口? - lost_in_the_source
被检查的Win32可执行文件可以是任何文件,无论它是否有窗口。 - user11847100
3个回答

3

0
通过阅读Remy Lebeau的回答,我成功地使用以下代码检查当前应用程序是否已在其他进程中运行:
DWORD processes[4096];
DWORD bytesGot;
EnumProcesses(processes, sizeof processes, &bytesGot);
DWORD processesCount = bytesGot / sizeof(DWORD);

WCHAR currName[MAX_PATH];
GetModuleFileNameEx(GetCurrentProcess(), NULL, currName, MAX_PATH);
DWORD currProcessId = GetCurrentProcessId();

for(int x=0;x<=processesCount-1;x++)
{
    HANDLE process = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processes[x]);
    WCHAR name[MAX_PATH];
    GetModuleFileNameEx(process,NULL, name, MAX_PATH);
    CloseHandle(process);
    if (processes[x]!=currProcessId&& wcscmp(name, currName)==0) return 0;
}

非常感谢Remy Lebeau :) 提供了非常有用的提示。


4
那种方法不适合解决这个问题。使用一个名为“murex”的工具可以解决。此外,这段代码没有错误检查。 - David Heffernan
@David Heffernan,那有什么问题吗? - user11847100
1
嗯,这取决于竞争。同一进程的两个实例完全有可能启动。解决您的问题的方法是使用命名互斥量。这里和其他地方有许多示例。如果您只是询问您的问题而不是解决方案,那就好了。 - David Heffernan
同样可以轻松地通过更改可执行文件名来击败。 - David Heffernan
@David Heffernan 是的 - user11847100
显示剩余3条评论

-3
创建一个空白文件并检查文件是否存在。

1
这个解决方案不好,因为你无法保证没有人会手动删除文件。如果是这样,你会认为 .exe 没有运行,尽管它仍在运行。虽然不是我给它点了踩。 - Fareanor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接