0

管理対象文字列に共有ポインタを使用したいのですが、構文がわかりません。共有ポインタを作成するには、を呼び出すアロケータが必要Marshal::StringToHGlobalAnsi(managedString)です。ポインタを解放するには、カスタム削除者はを呼び出す必要がありますMarshal::FreeHGlobal。私は次のようなものを探しています:

std::shared_ptr<IntPtr> managedFilename(Marshal::StringToHGlobalAnsi(videoFilename), 
    Marshal::FreeHGlobal);  // does not compile

コンパイラーはvideoFilenameパラメーターとIntPtr-to-void変換を窒息させています。

私はこれを従来のCで動作させています。ただし、STLを使用したい。

4

1 に答える 1

0

あなたが達成したい結果は何ですか?

アンマネージ コードで文字列を使用する場合は、次のように記述する必要があります。

void MarshalString ( String ^ s, std::string& os ) {
    using namespace Runtime::InteropServices;
    const char* chars = 
    (const char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer();
    os = chars;
    Marshal::FreeHGlobal(IntPtr((void*)chars));
}

マネージ コードを記述している場合は、String^ 型を直接使用します。

shared_ptr はマネージド型での使用を意図していません

UPD このようにできますが、なぜですか?

static void MyFreeHGlobal(void * ptr)
{
    using namespace Runtime::InteropServices;
    Marshal::FreeHGlobal(System::IntPtr(ptr));
}

// ...
System::String ^ s = L"test";
using namespace Runtime::InteropServices;
boost::shared_ptr<void> managedFilename(Marshal::StringToHGlobalAnsi(s).ToPointer(), 
    &MyFreeHGlobal); 
于 2012-10-20T19:35:09.080 に答える