gpt4 book ai didi

c++ - 如果只知道程序名称,如何使用 CreateProcess 打开程序?

转载 作者:太空宇宙 更新时间:2023-11-04 05:52:03 24 4
gpt4 key购买 nike

如以下示例所示,我尝试使用 Windows API 函数 CreateProcess 从 Windows 应用程序启动 Googles Chrome 浏览器。

我遇到的问题是我不知道 Chrome 应用程序(或程序路径中的任何其他应用程序)的路径。我怎样才能得到这个?

在下面的代码中,我注释了三个不同的示例。如果我启动“calc”,计算器将按照它在 Windows/System32 路径中的方式启动。如果我使用它运行的应用程序的完整路径启动 Chrome。但是,如果我省略路径并尝试启动“chrome”,我会收到错误 #2。

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

void _tmain()
{

char* cmd = "calc"; // works... calc.exe is in windows/system32
// char* cmd = "chrome"; // doesn't work... how can I add the path if it's not known (e.g. windows installed on D:\)
// char* cmd = "c:/program files (x86)/google/chrome/application/chrome"; // works (even without extension .exe)

STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));

// Start the child process.
if (!CreateProcess(NULL, // No module name (use command line)
cmd, // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi) // Pointer to PROCESS_INFORMATION structure
)
{
printf("CreateProcess failed (%d).\n", GetLastError());
return;
}

// Wait until child process exits.
WaitForSingleObject(pi.hProcess, INFINITE);

// Close process and thread handles.
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}

注意:如果我在 Windows 运行命令窗口中输入“chrome”(不带引号),Chrome 也会启动。我正在寻找的是相同的功能。但是,我的应用程序可以驻留在任何地方,不一定与 Chrome 位于同一驱动器上。

最佳答案

如果您真的必须使用 CreateProcess,那么您将需要找出它的安装位置并将完整路径传递给可执行文件。这将需要一些注册表黑客攻击。

不过,我觉得有一种更简单、更健壮的方法。 Chrome 在 AppPaths 中注册自己注册所以ShellExecuteEx使用指定为 L"chrome" 的文件,默认动词将完成这项工作。

关于c++ - 如果只知道程序名称,如何使用 CreateProcess 打开程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38158243/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com