2

GetCommandLine()APIに問題があります。

通常、実行可能ファイル名の後にスペースと引数が続きます。ドキュメントにあるように、最初のトークンには画像への完全なパスが含まれていない可能性があります。

NULL ではない lpApplicationName で CreateProcess を使用するまで、問題はありませんでした。

私が使用する場合:

CreateProcess(NULL, "\"c:\\myexe.exe\" param1 param2", ...)

GetCommandLine期待どおり「c:\myexe.exe param1 param2」を返します。

しかし、私が使用する場合:

CreateProcess("C:\myexe.exe", "param1 param2")

GetCommandLine「param1 param2」のみを返します。

別のアプリケーションが自分のアプリケーションを起動した場合に、コマンド ラインで実行可能ファイル名が指定されているかどうかを確認するにはどうすればよいですか?

また、MFC スタートアップ コードは、コマンド ラインの最初のトークンが実行可能ファイル名であると想定し、それをスキップします。ただし、2 番目の CreateProcess API の例で MFC アプリケーションを起動すると、MFC のコードは最初の引数をスキップします。

4

2 に答える 2

2

このような場合に役立つ回避策があります。モジュールがどのように開始されたかを常に確認できると思います。この場合、最初の引数を確認する必要があります。

英語に問題があるのでコードを書きます。ここに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.
}

2番目のケース。次のような最初のコマンドライン引数のファイル属性を取得しようと試みることができます。

// 注意!!!コマンドライン引数でファイルパスを渡す場合は、このケースを使用しないでください。

int nArgc;

LPTSTR* szArglist = ::CommandLineToArgvW(::GetCommandLine(), &nArgc);

if (nArgc && ::GetFileAttributes(szArglist[0]) != INVALID_FILE_ATTRIBUTES) {

    // The command line contains the module name.
}

::LocalFree(szArglist);

誰かのお役に立てば幸いです。

よろしく、ウラジミール

于 2010-08-13T07:09:07.733 に答える
2

あなたの問題ではありません。コマンドラインを適切に構築するのは、他のアプリケーションの仕事です。最初の引数が期待どおりの実行可能ファイル名であると単純に想定して、それをスキップする必要があります。

于 2016-05-31T23:16:20.187 に答える