|
前回:COM講座第1回 C++からC#のクラスを呼び出したいと思います 開発環境は MFCやATLは使いません サンプル: 手順としては クラスライブラリでプロジェクトを作成します 以下のコードに変更します using System;
using System.Runtime.InteropServices;
namespace Component
{
public interface IVector3
{
void SetVector3(float x, float y, float z);
void GetVector3(out float x, out float y, out float z);
}
[ClassInterface(ClassInterfaceType.None)]
[ProgId("Component.Vector3")]
public class Vector3 : IVector3
{
public float x, y, z;
public Vector3() { }
public Vector3(float x, float y, float z)
{
this.x = x;
this.y = y;
this.z = z;
}
public void SetVector3(float x, float y, float z)
{
this.x = x;
this.y = y;
this.z = z;
}
public void GetVector3(out float x, out float y, out float z)
{
x = this.x;
y = this.y;
z = this.z;
}
}
public interface ITestCom
{
int Add(int a, int b);
Vector3 AddVec(Vector3 a, Vector3 b);
}
[ClassInterface(ClassInterfaceType.None)]
[ProgId("Component.TestCom")]
public class TestCom : ITestCom
{
public int Add(int a, int b)
{
return a + b;
}
public Vector3 AddVec(Vector3 a, Vector3 b)
{
return new Vector3(a.x + b.x, a.y + b.y, a.z + b.z);
}
}
}
System.Runtime.InteropServices名前空間を省略します 公開するクラスはインタフェースを継承し さらにProgIDの指定をします プロジェクトのプロパティを開きます アセンブリをCOM参照可にチェックを入れて、OKを押して閉じます 次にビルドのタブ欄の下にある ビルドをしてください。 ビルド時につぎのようなエラーが出た場合は管理者権限でVC#を起動してないので ビルドするとCOMコンポーネントが登録され ここからはVC++でのCOMコンポーネントの利用になります main.cppに以下のコードを書きます #include <tchar.h>
#include <Windows.h>
#include <Objbase.h>
// インポート
#import "Component.tlb" no_namespace named_guids raw_interfaces_only
// メイン処理
int main(int argc, char* argv[])
{
IVector3 *a,*b,*c;
ITestCom* pTestCom; // COMインターフェイスポインタ
// COMの初期化
::CoInitialize(NULL);
// インスタンスの作成(CLSIDとIIDを指定して、インスタンスを取得)
CoCreateInstance((REFCLSID) CLSID_TestCom, 0, CLSCTX_ALL,
(REFIID) IID_ITestCom, (LPVOID*)&pTestCom);
// インスタンスの作成(CLSIDとIIDを指定して、インスタンスを取得)
CoCreateInstance((REFCLSID) CLSID_Vector3, 0, CLSCTX_ALL,
(REFIID) IID_IVector3, (LPVOID*)&a);
// インスタンスの作成(CLSIDとIIDを指定して、インスタンスを取得)
CoCreateInstance((REFCLSID) CLSID_Vector3, 0, CLSCTX_ALL,
(REFIID) IID_IVector3, (LPVOID*)&b);
// インスタンスの作成(CLSIDとIIDを指定して、インスタンスを取得)
CoCreateInstance((REFCLSID) CLSID_Vector3, 0, CLSCTX_ALL,
(REFIID) IID_IVector3, (LPVOID*)&c);
long out;
pTestCom->Add(10,15,&out);
printf("%d\n",out);
a->SetVector3(1.0f,2.0f,3.0f);
b->SetVector3(3.0f,4.0f,5.0f);
pTestCom->AddVec(a,b,&c);
float x,y,z;
c->GetVector3(&x,&y,&z);
printf("%f,%f,%f\n",x,y,z);
c->Release();
b->Release();
a->Release();
pTestCom->Release();
// COMの終了処理
::CoUninitialize();
return 0;
}
まず、タイプライブラリをインポートします // インポート #import "Component.tlb" no_namespace named_guids raw_interfaces_only COMを使用するにはCoInitialize関数で準備して // COMの初期化 CoInitialize(NULL); // COMの終了処理 CoUninitialize(); インスタンスを生成するにはCoCreateInstance関数を使います 実行結果は次のようになります ちゃんとCOMコンポーネント化したC#のクラスがC++側から呼べています
|