0

Program Files のフォルダーにインストールされた自己登録 COM 可視 dll (C++) と、クリック 1 回のアプリケーションを指す appref-ms ファイルがあります。この dll の目的は、クリック ワンス アプリを Windows エクスプローラーの右クリック メニューから起動できるようにすることです。

文字列を保持するためにのみ wchar_t* を使用する既存のコードを変更していますが、C++ の経験はほとんどありません。以下を使用して、dll と appref-ms を含むフォルダーへのパスを取得しています。

std::wstring DllFolder() {
    wchar_t buffer[MAX_PATH];
    GetModuleFileName( (HINSTANCE)&__ImageBase, buffer, MAX_PATH );
    std::wstring::size_type pos = std::wstring( buffer ).find_last_of( L"\\/" );
    return std::wstring( buffer ).substr( 0, pos);
}

...

const wchar_t* folder = DllFolder().c_str();

これでほぼ動くのですが、ドライブレターが毎回違います。例:

{:\Projects\MyAppName\x64\Release e:\Projects\MyAppName\x64\Release O:\Projects\MyAppName\x64\Release

: の後に改行があり、文字がない場合があります。

別の質問: クラス member に起動文字列を保持していますwchar_t m_Launch[MAX_PATH*10]。ユーザーが選択するファイルの数がわからないため、動的にサイズを変更する方法はありますか?

4

1 に答える 1

1

関数DLLFolder()は一時オブジェクトを返します。そのデータへのポインターを ( 経由でfolder = DLLFolder().c_str()) 取得すると、シンボル配列へのポインターが取得されます。これは、のデストラクタが呼び出されると破棄さwstringれます (次の行になります)。解決策は次のとおりです。

  1. ポインターを取得しないで、次のコピーを使用しますwstring

    std::wstring folder = DLLFolder();

  2. 同じ呼び出しで、それを必要とする関数へのポインタを転送します。

    do_smth_with_dll_folder( DllFolder().c_str() )

于 2013-04-30T09:46:32.737 に答える