C++/CLI ラッピング入門2 ラッピングの基礎 関数編

C++/CLI ラッピング入門
今回は関数ラッピングについてです。
—————————————————————–

関数のラップは、
マネージドクラスのメンバ関数の中で、
ネイティブ関数を適切な引数を与えて呼び出し、
戻り値を適切にラップして返すという作業になります。
全てのマネージ関数はメンバ関数または、staticメンバ関数である必要があります。

・引数も戻り値もない関数は普通に呼び出すだけでラップできます。

“ref class”は参照型のマネージドクラス(C#でいうクラス)で有ることを表しています。
“value class”にすると値型マネージクラス(C#で言う構造体)になりますが、
コンストラクタやデストラクタの使用などに制限があるため、アンマネージクラスのラップにはあまり使いません。

//---------------------
// ネイティブ関数宣言
void func()
{
    ...
}
//マネージクラスの宣言
public ref class CLI
{
    public:
        static void Func()
        {
            //ネイティブ関数の呼び出し
            ::func();
        }
};

・引数がintなどの基本型の場合はそのまま渡してOK

//---------------------
// ネイティブ関数宣言
void func(int i)
{...}
//---------------------
//マネージクラスの宣言
public ref class CLI
{
    public:
        static void Func(int i)
        {
            //ネイティブ関数の呼び出し
            ::func( i );
        }
};
//---------------------
// マネージ関数呼び出し
CLI.Func(1);
//---------------------

・引数がオブジェクトの場合、
  まず、その引数の型のラッパークラスを作成し、
  internalなポインタ、またはそれにアスタリスクをつけて取得した値を引数に渡す。

//---------------------
ネイティブクラス宣言
class nativeClass
{
....
};
//---------------------
// ネイティブ関数宣言
void func(nativeClass nativeobject)
{...}
//---------------------
//マネージクラスの宣言
public ref class CLIClass
{
  CLIClass() {pData = new nativeClass();};
  ~CLIClass(){ this->!CLIClass(); }
  !CLIClass()
{
    delete pData;
    pData = NULL;
}
  internal:
   ::nativeClass* pData;
};
public ref class CLI
{
    public:
        static void Func(CLIClass^ cliobj)
        {
            //ネイティブ関数の呼び出し
            ::func(*cliobj->pData);
        }
};
//---------------------
// C# マネージ関数呼び出し
CLIClass obj = new CLIClass();
CLI.Func(obj);
//---------------------

・戻り値がオブジェクトの場合、
 まず、ラッパークラスを作り、それを生成する。
 関数の戻り値をポインタの指す位置にコピーする。

//---------------------
ネイティブクラス宣言
class nativeClass
{
....
};
//---------------------
// ネイティブ関数宣言
nativeClass func()
{...}
//---------------------
//マネージクラスの宣言
public ref class CLIClass
{
  CLIClass() {pData = new nativeClass();};
  ~CLIClass(){ this->!CLIClass(); }
  !CLIClass()
{
    delete pData;
    pData = NULL;
}
  internal:
   ::nativeClass* pData;
};
public ref class CLI
{
    public:
        static CLIClass^ Func(CLIClass^ cliobj)
        {
            CLIClass^ obj = new CLIClass();
            *(obj->pData) = ::func();
            return obj;
        }
};
//---------------------
// C# マネージ関数呼び出し
CLIClass obj = new CLIClass();
obj = CLI.Func();
//---------------------

戻り値がポインタの場合はさまざまなパターンがあるので次回

広告

akatukisiden について

フリーランスプログラマ 使用言語はC++,C#とそのつなぎのC++/CLI 専門はクライアントアプリ開発
カテゴリー: C++/CLI, 相互運用 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中