0

Borland C++ Builder 4.0 で作成したプログラムについて、バッチ スクリプトをセットアップできるバージョンを作成できるようにしたいと考えています。バッチ srcipt は (メイン フォーム ウィンドウを起動せずに) .exe を呼び出し、バッチ ファイルで指定された入力を使用してプログラムのメイン プロセスが実行されます。出力が生成されると、プログラムはシャットダウンします。

バッチ スクリプトの最初の 3 つのパラメーターは、3 つの主要な入力ファイル (それ以外の場合はボタンで読み込まれるファイル) の場所を指定し、単一のケースまたは複数のケースに対して補間を行うかどうかを定義するスイッチを設定します (次のようなもの)。 m または -s)。前者が真の場合、プログラムは 4 番目のタイプの入力ファイルの場所を読み取ります。後者の場合、この 4 番目のタイプの入力の複数の入力ファイルの場所を示す別の csv を読み込みます。バッチ ファイルは、出力場所と出力ファイル名も定義します。

こことさまざまなフォーラムでこれまで読んだことに基づいて、これを達成する最も簡単な方法は、ParamCount() と ParamStr() を使用し、おそらく FindCmdLineSwitch を使用することだと考えています。これらをどのように使用するつもりなのか、まだ少しぼんやりしています (無知で申し訳ありませんが、これは私の最初の BCB プロジェクトであるだけでなく、C++ でのコーディングと Windows GUI の作成に関する最初の実際の経験でもあります)...私が理解していることから、ここで説明されているものと同様の方法でこれらを使用できますhttp://docwiki.embarcadero.com/CodeExamples/Seattle/en/ParamCount_(C%2B%2B) .

私が知らないことがいくつかあります:

  1. コマンド ラインまたはバッチ ファイルを使用して .exe を起動したかどうかを確認する ParamCount() および ParamStr() パーツは、プログラムのどこに配置すればよいですか? ここでは、フォームhttp://www.borlandtalk.com/running-command-line-parameters-vt17942.htmlを初期化するメイン .cpp ファイルに配置することをお勧めします。これを実行して、プライマリ UnitSomething.cpp から適切な関数を呼び出すことを考えていました。または、これらの関数を別の場所に配置する必要がありますか?
  2. バッチファイルはどのようになりますか? パラメータはどのように分離されていますか? スペースだけ?たとえば、スクリプトに新しい部分を含めた後、次のようなバッチ スクリプトを作成できますか?

    "C:/Program Files/myprogram/myprogram.exe" "最初の入力の場所" "2 番目の入力の場所" -m など

    (私は以前にCFDツールであるAnsys CFXをバッチモードで使用したことがあり、たとえば、どのファイルが定義ファイル[-def]と初期化ファイル[-ini]であるかを定義するスイッチがあります)。

  3. 上記に関連して、スイッチはどのように登場しますか? いつ使用する必要がありますか?たとえば、最初の入力の場所を定義したい場合、その前に -inp1 のようなスイッチが必要ですか? プログラム実行直後のフォームの選択に例がありますが、これが単純な ParamStr とどのように違うのかわかりませんか? より具体的には、FindCmdLineSwitch をいつ、どのように使用するのですか?

  4. 最後に、上記の 3 つの関数のいずれかを使用して、WINAPI WinMain() 呼び出しパラメーターを変更する必要はありますか?

ありがとうございました。

4

1 に答える 1

1

コマンド ラインまたはバッチ ファイルを使用して .exe を起動したかどうかを確認する ParamCount() および ParamStr() パーツは、プログラムのどこに配置すればよいですか?

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()ません。スイッチが見つかった位置がわからないためです。

最後に、上記の 3 つの関数のいずれかを使用して、WINAPI WinMain() 呼び出しパラメーターを変更する必要はありますか?

いいえ。ただし、ParamStr()解析に関する既知の問題がいくつかあり ( QC #3946を参照)、FindCmdLineSwitch()2 つの形式 (「/switch」と「-switch」のみ) に制限されており、「/switch:value」、「switch=」などは処理できません。値」など)。このような場合、コマンド ラインを手動で解析する必要がある場合は、lpCmdLineパラメータ ofを使用できますWinMain()(ただし、GetCommandLine()一般的には、より適切なオプションです)。

于 2015-12-08T22:38:42.800 に答える