内容へ移動
C++プログラマのためのC++/CLI入門
ユーザ用ツール
ログイン
サイト用ツール
検索
ツール
文書の表示
以前のリビジョン
バックリンク
最近の変更
メディアマネージャー
サイトマップ
ログイン
>
最近の変更
メディアマネージャー
サイトマップ
現在位置:
TOP
»
実用編
»
ネイティブデータとclrの混在
実用編:ネイティブデータとclrの混在
この文書は読取専用です。文書のソースを閲覧することは可能ですが、変更はできません。もし変更したい場合は管理者に連絡してください。
====== ネイティブデータとCLRの混在 ====== C++/CLIを使う理由の1つは既存のCライブラリを使うことです。このとき既存ライブラリのデータをCLRアプリでどう扱うか、という問題があります。 ===== ref classの中にポインタで持つ ===== ref classはネイティブクラスの実体をもつことはできませんが、ポインタなら持つことができます。ただしref classはその開放方法が様々なので、そのポインタをどうやって破棄するのかを考えておかなければなりません。 <code cpp> #include <string.h> #include <stdlib.h> using namespace System; ref class REFCLASS { void clearp() { if (p) { free((void*)p); p = NULL; } } public: char* p; ~REFCLASS() { clearp(); } !REFCLASS() { clearp(); } }; int main(array<System::String ^> ^args) { { REFCLASS c; c.p = strdup("AAA"); Console::WriteLine(gcnew String(c.p)); REFCLASS^ hc = gcnew REFCLASS; hc->p = strdup("BBB"); Console::WriteLine(gcnew String(hc->p)); } return 0; } </code> ===== C++のclassの中にgcrootで持つ ===== gcrootを使うと、ネイティブクラスの中にハンドルを持つことができます。 <code cpp> #include <gcroot.h> using namespace System; class NativeClass { public: gcroot<String^> clrstring; }; int main(array<System::String ^> ^args) { String^ s = L"AAA"; NativeClass n; n.clrstring = s; Console::WriteLine(n.clrstring); return 0; } </code> gcrootはC++クラスでメンバはvoid* handle;だけです。これはSystem::Runtime::InteropServices::GCHandle::Alloc()の戻り値をキャストしたものです。
/var/www/html/virtual/cppcli/data/pages/実用編/ネイティブデータとclrの混在.txt
· 最終更新: 2013/12/23 09:08 (外部編集)
ページ用ツール
文書の表示
以前のリビジョン
バックリンク
文書の先頭へ