20

実行可能ファイル名に基づいてアプリケーションの機能を変更する必要があります。大きなものは何もありません。表示される文字列といくつかの内部識別子を変更するだけです。このアプリケーションは、ネイティブコードと.NetC++-CLIコードを組み合わせて作成されています。

私が見た2つの方法は、Win32のGetCommandLine()関数を解析することと、.NetのAppDomainやその他のものを詰め込むことです。ただし、GetCommandLineの使用は、デバッガーから実行した場合のコマンドラインが空であるため、常に機能するとは限りません。そして、.Net AppDomainのものは、たくさんの詰め物を必要とするようです。

では、C ++ / CLIで実行可能ファイル名を決定するための最も優れた/最も単純な/最も効率的な方法は何ですか?(.Netで利用できる単純なものを見逃してしまったことを願っています。)

編集:私が言及しなければならないことの1つは、これはC ++ /CLIを使用するWindowsGUIアプリケーションであるため、従来のCスタイルのメイン関数にアクセスできず、Windows WinMain()関数を使用することです。

4

7 に答える 7

39

モジュールハンドルとして0を使用してGetModuleFileName()を呼び出します。

注:このパラメーターを使用して、mainを使用したり、mainがない場合は呼び出したりすることもできます。ただし、これらのメソッドは必ずしも実行可能ファイルへの完全なパスを提供するわけではないことに注意してください。プログラムの開始に使用されたのと同じ文字列が返されます。代わりに、を呼び出すと、常に完全なパスとファイル名が提供されます。argv[0]GetCommandLine()GetModuleFileName()

于 2008-09-24T01:31:38.227 に答える
14

フェルッチョの答えは良いです。次にいくつかのサンプルコードを示します。

TCHAR exepath[MAX_PATH+1];

if(0 == GetModuleFileName(0, exepath, MAX_PATH+1))
    MessageBox(_T("Error!"));

MessageBox(exepath, _T("My executable name"));
于 2008-09-24T02:27:31.977 に答える
8

argv引数を使用してmain

int main(int argc, char* argv[])
{
    printf("%s\n", argv[0]);  //argv[0] will contain the name of the app.
    return 0;
}

文字列をスキャンしてディレクトリ情報や拡張子を削除する必要があるかもしれませんが、名前はそこにあります。

于 2008-09-24T01:33:12.217 に答える
4

__argv[0] を使用

于 2008-09-24T06:54:51.320 に答える
3

アセンブリには、.NET で取得できる静的メソッドがあります。

Assembly.GetEntryAssembly().FullName

編集:ファイル名が必要だとは思いませんでした...次のように呼び出して取得することもできます:

Assembly.GetEntryAssembly().CodeBase

これにより、アセンブリへの完全なパス (ファイル名を含む) が取得されます。

于 2008-09-24T01:45:27.617 に答える