2015-10-06 29 views
0

對於我在Borland C++ Builder 4.0中創建的程序,我希望能夠創建一個可以設置批處理腳本的版本。批處理srcipt會調用我的.exe(無需啓動主窗體),這會導致我的程序的主進程使用批處理文件中指定的輸入執行。一旦產生輸出,程序就會關閉。創建我的.exe的批處理版本,它採用BCB 4.0中的命令行參數(ParamCount(),ParamStr()和FindCmdLineSwitch)

批處理腳本的前三個參數將指定三個主輸入文件的位置(用其他方式加載按鈕的文件),設置一個開關以定義是針對單個情況還是多個(類似-m或-s)。如果前者爲真,程序將讀取第四種輸入文件的位置。在後者的情況下,它將在另一個csv中讀取,該csv給出該第四類型輸入的多個輸入文件的位置。該批處理文件還將定義輸出位置和輸出文件名。

根據我迄今爲止在這裏和不同論壇上閱讀的內容,我在想最簡單的方法是使用ParamCount()和ParamStr()以及FindCmdLineSwitch。這仍然有點朦朧,我究竟如何使用這些(我爲我的無知道歉,但這不僅是我的第一個BCB項目,也是我第一次使用C++進行編碼和創建Windows GUI的真實體驗)...根據我的理解,我可以使用這些與http://docwiki.embarcadero.com/CodeExamples/Seattle/en/ParamCount_(C%2B%2B)中描述的相似的方式。

有幾件事情我不知道:

  1. 凡在我的節目,我應該把ParamCount()和ParamStr這(),它檢查是否我已經推出在命令行中的.exe零件/與批處理文件?這裏建議將它放在主要的.cpp文件中,該文件初始化表格http://www.borlandtalk.com/running-command-line-parameters-vt17942.html。我正在考慮這樣做,並從我的主要UnitSomething.cpp中調用正確的函數。或者我應該把這些功能放在別的地方?
  2. 批處理文件將如何顯示?參數如何分離?只是空間?比方說,在我的腳本中包含新部分之後,我可以創建一個看起來像這樣的批處理腳本嗎?

    「C:/程序文件/ MyProgram/myprogram.exe」, 「第一輸入的位置」, 「第二輸入的位置」 等-m

    (I已經在批處理中使用ANSYS CFX,一個CFD工具前模式,並且例如具有切換以定義哪個文件是定義文件[-def]和初始化文件[-ini])。

  3. 與前面相關,交換機如何進入圖片?他們什麼時候應該使用?例如,當我想爲第一個輸入定義一個位置時,是否應該在它之前有一個開關,像-inp1?我在這裏看到一個例子Selection of Forms just after program execution,但我不確定這與一個簡單的ParamStr有什麼不同?更具體地說,我如何以及何時使用FindCmdLineSwitch?

  4. 最後,使用上述三個函數中的任何一個,是否必須更改WINAPI WinMain()調用參數中的任何內容?

謝謝。

+1

GUI應用程序和控制檯應用程序需要將不同的後端代碼鏈接到EXE中。如果您沒有控制檯嚮導,則無法創建真正的控制檯應用程序。但是,您並不需要爲應用程序創建單獨的控制檯版本。您可以簡單地編輯現有的GUI應用程序的'WinMain()'函數,以便在啓動時查找命令行參數,可以通過VCL的'ParamCount()'和'ParamStr()'函數或Win32 API'GetCommandLine() 'CommandLineToArgvW()'函數。如果參數存在,根據需要處理它們,然後退出'WinMain()'而不顯示GUI。 –

+0

非常感謝@RemyLebeau。我花了一天的時間閱讀文檔和(主要是你)在不同論壇上回復類似的問題。基於上述,我對如何實現我需要的東西有一個模糊的想法,但是有些東西有些不清楚。我編輯了我的原始問題,我是否可以請你告訴我,如果我在正確的軌道上,並且如果你有時間,可能回答我添加的一個或兩個問題? – laika

+0

_Boost.Program \ _Options_?方便地管理「主要」論點是一個解決的問題。 –

回答

1

在我的程序中,我應該放置ParamCount()和ParamStr()部分來檢查我是否已經從命令行/批處理文件啓動.exe。

該項目的WinMain()功能,就像我在評論中告訴你的。例如:

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) 
{ 
    if (ParamCount() >= 5) 
    { 
     String InputFile1 = ParamStr(1); 
     String InputFile2 = ParamStr(2); 
     String InputFile3 = ParamStr(3); 
     String Interpolation = ParamStr(4); 

     int index = 5; 
     if (Interpolation == "-s") 
     { 
      String InputFile4 = ParamStr(index++); 
      // load file as needed... 
     } 
     else 
     { 
      // load CSV as needed... 
     } 

     String OutputFile = ParamStr(index); 

     // process files as needed... 
    } 
    else 
    { 
     // normal GUI code here... 
    } 

    return 0; 
} 

,建議將其放置在主.cpp文件,初始化形式

是一個。

批處理文件將如何顯示?

例如:

myprogram.exe "inputfile1" "inputfile2" "inputfile3" -m "outputfile" 

myprogram.exe "inputfile1" "inputfile2" "inputfile3" -s "inputfile4" "outputfile" 

如何參數在它分開嗎?只是空間?

是的。其中有空格的參數需要引用。

說,在我的腳本中包含新部件之後,是否可以創建一個類似於此的批處理腳本?

是的。

與前面相關,交換機如何進入圖片?他們什麼時候應該使用?例如,當我想爲第一個輸入定義一個位置時,是否應該在它之前有一個開關,像-inp1?

您可以這樣做,但由於參數具有固定的位置,所以在此情況下不需要。如果你想命名的開關,你可以做更多的東西是這樣的:

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) 
{ 
    int count = ParamCount(); 
    if (count > 0) 
    { 
     String InputFile1; 
     String InputFile2; 
     String InputFile3; 
     String InputFile4; 
     String Interpolation; 
     String OutputFile; 

     int idx = 1; 
     while (idx <= count) 
     { 
      String param = ParamStr(idx++); 

      if (param == "-inp1") 
       InputFile1 = ParamStr(idx++); 

      else if (param == "-inp2") 
       InputFile2 = ParamStr(idx++); 

      else if (param == "-inp3") 
       InputFile3 = ParamStr(idx++); 

      else if (param == "-s") 
      { 
       Interpolation = param; 
       InputFile4 = ParamStr(idx++); 
      } 

      else if (param == "-m") 
       Interpolation = param; 

      else if (param == "-out") 
       OutputFile = ParamStr(idx++); 
     } 

     // process files as needed... 
    } 
    else 
    { 
     // normal GUI code here... 
    } 

    return 0; 
} 

之我見「剛剛執行程序後,選擇形式」這裏一個例子,但我不知道它如何從不同一個簡單的ParamStr?更具體地說,我如何以及何時使用FindCmdLineSwitch?

FindCmdLineSwitch()在整個命令行中搜索指定的開關。交換機本身可以存在於命令行中的任何位置。當你不知道或關心參數的順序時,這很好,你只是想知道這個開關是否存在。 FindCmdLineSwitch()在開關的位置很重要或者其他參數與開關相關時是沒有用的,因爲FindCmdLineSwitch()沒有告訴你它找到開關的位置。

最後,使用上述三個函數中的任何一個,是否必須更改WINAPI WinMain()調用參數中的任何內容?

No.但是,ParamStr()確實存在一些已知的解析問題(請參閱QC#3946),而FindCmdLineSwitch()僅限於兩種格式(「/ switch」和「-switch」),它不能處理諸如「/ switch:value」,「switch = value」等)。在這些情況下,如果您發現需要手動解析命令行,則可以使用的lpCmdLine參數(儘管GetCommandLine()通常是更好的選擇)。