如以下示例所示,我尝试使用Windows API函数CreateProcess从Windows应用程序启动Googles Chrome浏览器。
我遇到的问题是我不知道Chrome应用程序(或程序路径中的任何其他应用程序)的路径。我怎么能得到这个?
在下面的代码中,我评论了三个不同的例子。如果我开始"计算",计算器将在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);
}
注意:如果我输入&#34; chrome&#34; (在Windows运行命令窗口中,不带引号),Chrome也会启动。我正在寻找的是同样的功能。但是,我的应用程序可以驻留在任何位置,并且不一定与Chrome位于同一驱动器上。
答案 0 :(得分:5)
如果你真的必须使用int[,]
,那么你需要找出它的安装位置并传递可执行文件的完整路径。这将需要一些注册表黑客攻击。
然而,我觉得有一种更简单,更健壮的方式。 Chrome会在AppPaths注册表中注册自己ShellExecuteEx
,文件指定为CreateProcess
,默认动词将完成此任务。
答案 1 :(得分:0)
这可能与WinAPI和CreateProcess
函数无关,但仅与环境变量PATH
无关。默认情况下,它包含所有标准Windows命令的路径,例如calc
或notepad
,但您必须为稍后添加的其他命令添加路径,无论是在Program Files下还是其他任何位置。
怎么做:
chrome
现在应该可以在不指定完整路径的情况下启动chrome。
注意:不确定上述所有标签的实际标签,我自己的盒子会说法语......