前回: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++側から呼べています
|