2011-06-04 55 views
2

我有一個使用C(MinGW)編寫的Windows GUI應用程序,並希望應用程序執行不同的任務,具體取決於它是通過命令行使用文件名參數啓動還是通過將文件拖動到應用程序圖標上來執行。現在是這樣的,下面的函數不區分這兩種:在Windows中區分cmd行參數和拖動圖標參數的方法?

int argc; 
LPWSTR *argv = CommandLineToArgvW(GetCommandLineW(),&argc); 

當一個文件拖動到應用程序的圖標,它假定它是通過命令行啓動。這個問題是我需要額外的參數,必須通過命令行來傳遞,以做有用的事情。文件名本身是不夠的,所以應用程序退出,因爲它沒有足夠的信息進行。

我想讓用戶能夠將文件拖動到應用程序圖標上,然後出現一個窗口,詢問所需的選項。如果用戶使用已提供的必需選項通過命令行啓動應用程序,則應用程序將立即開始處理而不要求額外輸入。這可能嗎?

我遇到的另一個問題是,有時當文件被拖到應用程序的圖標上時,它會崩潰。我將其縮小到任何使用argv []值的操作。如果通過具有相同參數的命令行啓動,則不這樣做。例如,這會崩潰的應用程序大約20%的時間:

fprintf(stderr,"argv[3] was %ls\n",(LPWSTR)argv[3]); 

爲什麼要通過拖放正下降時,啓動這只是發生的呢?我在Windows 7 x64上。

回答

2

Windows將默認調用您的程序,並在其圖標上放置文件的文件名作爲第一個也是唯一的參數。因此,在這種情況下,當有人從命令行啓動程序時,您將獲得完全相同的調用參數,並且該文件的全限定名稱與唯一參數相同。

但是,當您安裝應用程序時,您可以將其他參數添加到快捷方式圖標,例如"path\myapp.exe -gui"。這樣可以區分通常通過圖標進行的調用(也適用於不帶任何參數的雙擊)以及通常不會指定參數的命令行上的調用。

+0

謝謝。如果只檢測到一個參數(文件名爲arg),我將代碼更改爲要求其他選項。所以,如果您只在命令行上傳遞文件名,那麼如果您將文件拖放到應用程序圖標上,則會出現相同的框。似乎現在工作正常,沒有崩潰。 – Synthetix 2011-06-04 11:02:55

1

我不認爲你可以,當你通過一個圖標拖動一個文件時,操作系統在命令行中使用文件名作爲參數執行程序,所以它們實際上是相同的。

2

這當然有可能。假設用戶必須在命令行上指定-slow-fast。您的代碼看起來像這樣:

int main(int argc, char *argv[]) { 
    if (argv contains "-slow" or -"fast") { 
     we were launched fronm the command line 
    else 
     we were either launched from an icon, or the user has 
     not specified -slow or -fast. In either case, pop up 
     a dialog to get the options 
    endif 
}