2010-07-20 82 views
2

GetCommandLine API有問題。GetCommandLine中缺少進程名稱

它通常會返回可執行文件名稱,後跟空格和參數。正如文檔所述,第一個標記可能沒有完整的路徑來形象和等等等等等等。

我從未有過的問題到現在爲止,我所使用的CreateProcess與lpApplicationName不是NULL

如果我使用:

的CreateProcess(NULL, 「\」 C:\ MYEXE.EXE \」參數1參數2" 。 ..)

GetCommandLine按預期返回「c:\ myexe.exe param1 param2」。

但是,如果使用:

的CreateProcess( 「C:\ MYEXE.EXE」, 「參數1參數2」)

GetCommandLine僅返回 「參數1參數2」。

所以問題是,如果另一個應用程序啓動我的程序,我怎麼知道cmd行中是否給出了可執行文件的名稱?

另外,MFC啓動代碼假定cmdline中的第一個標記是可執行文件名並跳過它。但是,如果使用第二個CreateProcess api示例啓動MFC應用程序,則MFC的代碼將跳過第一個參數。

問候,毛羅。

回答

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); 

我希望它可以幫助某人。

問候,弗拉基米爾

+0

嗨弗拉基米爾。我決定忽略像MFC一樣。 – 2010-12-21 19:09:58

+0

這是一個糟糕的主意,除非您的應用程序需要特定的*需要由您無法修復的錯誤代碼啓動。 – 2016-05-31 23:15:27

1

不是你的問題。正確構建命令行是另一個應用程序的工作。您應該簡單地假定第一個參數是預期的可執行文件名並跳過它。