我对GetCommandLine()
API有疑问。
它通常返回可执行文件名,后跟空格和参数。正如文档所说,第一个令牌可能没有完整的图像路径,等等等等。
直到现在我才使用CreateProcess,lpApplicationName不是NULL。
如果我使用:
CreateProcess(NULL, "\"c:\\myexe.exe\" param1 param2", ...)
GetCommandLine
按预期返回“c:\ myexe.exe param1 param2”。
但如果我使用:
CreateProcess("C:\myexe.exe", "param1 param2")
GetCommandLine
仅返回“param1 param2”。
如果另一个应用程序启动我的,我怎么知道命令行上是否给出了可执行文件名?
此外,MFC启动代码假定命令行上的第一个标记是可执行文件名并跳过它。但是,如果使用第二个CreateProcess API示例启动MFC应用程序,MFC的代码将跳过第一个参数。
答案 0 :(得分:2)
我有一个解决方法,在这样的情况下可能会有所帮助。 我想我们总能检查我们的模块是如何启动的。 在这种情况下,我们应该检查第一个参数。
我会写代码,因为我的英语有问题。 这有两种方式:
第一个案例。我们可以比较模块名称和第一个命令行参数。 像这样的东西:
const TCHAR* csCommandLine = ::GetCommandLine();
// Attention!!! the first symbol can be quete
if (*csCommandLine == _T('\"'))
csCommandLine++;
TCHAR sModuleFileName[MAX_PATH];
DWORD dwModuleFileName = ::GetModuleFileName(NULL, sModuleFileName, MAX_PATH);
if (dwModuleFileName && !_tcsncmp(csCommandLine, sModuleFileName, dwModuleFileName)) {
// The command line contains the module name.
}
第二种情况。我们可以尝试获取第一个命令行参数的文件属性 像这样的东西:
//注意!!!如果要在命令行参数中传递文件路径,请不要使用它。
int nArgc;
LPTSTR* szArglist = ::CommandLineToArgvW(::GetCommandLine(), &nArgc);
if (nArgc && ::GetFileAttributes(szArglist[0]) != INVALID_FILE_ATTRIBUTES) {
// The command line contains the module name.
}
::LocalFree(szArglist);
我希望对某人有所帮助。
问候,弗拉基米尔
答案 1 :(得分:2)
不是你的问题。正确构造命令行是另一个应用程序的工作。您应该假设第一个参数是预期的可执行名称并跳过它。