Explorer 在其命令行参数中传递完整的可执行文件路径名
Explorer passing the full executable path name in its command line arguments
我创建了一个新的 Win32 控制台应用程序。它有这个主要入口点:
int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow)
我在lpCmdLine
中解析参数:
LPWSTR *szArglist;
int nArgs;
szArglist = CommandLineToArgvW(lpCmdLine, &nArgs);
if (nArgs >= 1 && wcslen(szArglist[0]) > 0)
productName = szArglist[0];
if (nArgs >= 2 && wcslen(szArglist[1]) > 0 && PathFileExists(szArglist[1]))
installPath = szArglist[1];
我想将第一个参数解析为productName
,将第二个参数解析为installPath
。但是,如果我从 explorer
启动该程序,它会将第一个参数设置为可执行文件的完整路径。
有什么办法可以处理这种行为吗? Windows 在什么情况下会向我的应用程序传递参数?我怎样才能忽略这些,并让我的应用程序接受如下命令行参数:
application.exe "Product Name" "C:\Program Files\Product Name"
看来我只需要通过解析命名参数来改变我的方法:
LPWSTR *szArglist;
int nArgs;
szArglist = CommandLineToArgvW(lpCmdLine, &nArgs);
BOOL skipNext = false;
for (int i = 0; i < nArgs; i++) {
if (skipNext) {
skipNext = false;
continue;
}
if (wcscmp(szArglist[i], L"/path") == 0 && i + 1 < nArgs && wcslen(szArglist[i + 1]) > 0 && PathFileExists(szArglist[i + 1])) {
installPath = szArglist[i + 1];
skipNext = true;
}
if (wcscmp(szArglist[i], L"/product") == 0 && i + 1 < nArgs && wcslen(szArglist[i + 1]) > 0) {
productName = szArglist[i + 1];
skipNext = true;
}
}
我创建了一个新的 Win32 控制台应用程序。它有这个主要入口点:
int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow)
我在lpCmdLine
中解析参数:
LPWSTR *szArglist;
int nArgs;
szArglist = CommandLineToArgvW(lpCmdLine, &nArgs);
if (nArgs >= 1 && wcslen(szArglist[0]) > 0)
productName = szArglist[0];
if (nArgs >= 2 && wcslen(szArglist[1]) > 0 && PathFileExists(szArglist[1]))
installPath = szArglist[1];
我想将第一个参数解析为productName
,将第二个参数解析为installPath
。但是,如果我从 explorer
启动该程序,它会将第一个参数设置为可执行文件的完整路径。
有什么办法可以处理这种行为吗? Windows 在什么情况下会向我的应用程序传递参数?我怎样才能忽略这些,并让我的应用程序接受如下命令行参数:
application.exe "Product Name" "C:\Program Files\Product Name"
看来我只需要通过解析命名参数来改变我的方法:
LPWSTR *szArglist;
int nArgs;
szArglist = CommandLineToArgvW(lpCmdLine, &nArgs);
BOOL skipNext = false;
for (int i = 0; i < nArgs; i++) {
if (skipNext) {
skipNext = false;
continue;
}
if (wcscmp(szArglist[i], L"/path") == 0 && i + 1 < nArgs && wcslen(szArglist[i + 1]) > 0 && PathFileExists(szArglist[i + 1])) {
installPath = szArglist[i + 1];
skipNext = true;
}
if (wcscmp(szArglist[i], L"/product") == 0 && i + 1 < nArgs && wcslen(szArglist[i + 1]) > 0) {
productName = szArglist[i + 1];
skipNext = true;
}
}