1. はじめに
C++/CLIでハンドルをグローバル変数に保存しようとして、
static System::String^ s;
などと書くと、
「静的ストレージ存続期間のある変数にハンドルや追跡参照型を指定することはできません」
とコンパイルエラーになります。
なんとかハンドルをグローバル変数に保存したく、下記の方法を考えました。
C++/CLIは詳しくないので、問題ないかどうかまだ評価中です。
Windows 10、.NET Framework 4.8、Visual Studio 2019で確認しています。
2. GCHandleを使う
using namespace System;
using namespace System::Runtime::InteropServices;
static GCHandle gcStr;
int main(int argc, char** argv) {
System::String^ str = "abc";
// アンマネージドメモリに保存
gcStr = GCHandle::Alloc(str);
// 保存したハンドルを取り出す
System::String^ str2 = safe_cast<System::String^>(gcStr.Target);
Console::WriteLine(str2);
}