VS2010 C# で記述した dll があり、プロジェクトが COM 可視としてマークされ、COM Interop に登録されていることを確認しました。VS2010 C++ プロジェクトで使用できます。C++ プロパティ ページ -> 共通プロパティ -> フレームワークと参照を参照し、C# プロジェクトを参照してから、gcnew でオブジェクトをインスタンス化するコードを記述します。
ただし、この方法は Borland C++ では機能しません。C# dll が登録されたので、これへの参照を追加できます。*_OCX.h および *_TLB.h ファイルが生成され、これらのファイルで使用可能なオブジェクトのように見えるものを確認できます。しかし、クラスの作成方法がわかりません。名前が変更されているため、どのクラスが正しいのかさえわかりません。
C# では、クラスは次のように単純にすることができます。
public namespace MyTest
{
public class MyClass
{
public MyClass() { }
public int SomeInt { get; set; }
}
}
C++ では大量に生成されます。その一部は次のとおりです。
MyTest_TLB.cpp
#include <vcl.h>
#pragma hdrstop
#include "MyTest_TLB.h"
namespace Mytest_tlb
{
const GUID LIBID_MyTest = {0xE082EF89, 0x8FE8, 0x45FA,{ 0x8D, 0x13, 0x20,0x3B, 0x58, 0xCF,0x7E, 0x82} };
const GUID CLSID_MyClass = {0x22E68247, 0x3CDB, 0x3CCA,{ 0xB8, 0x8B, 0xB9,0x52, 0xF3, 0x4C,0x11, 0x70} };
const GUID IID__MyClass = {0x6A6EC8CB, 0x1AAB, 0x3AB1,{ 0xBD, 0x57, 0x0F,0xE2, 0x17, 0x78,0xD4, 0xE2} };
}; // namespace Mytest_tlb
MyTest_TLB.h
namespace Stdvcl {class IStrings; class IStringsDisp;}
using namespace Stdvcl;
typedef TComInterface<IStrings> IStringsPtr;
typedef TComInterface<IStringsDisp> IStringsDispPtr;
namespace Mytest_tlb
{
extern __declspec (package) const GUID LIBID_MyTest;
extern __declspec (package) const GUID IID__MyClass;
extern __declspec (package) const GUID CLSID_MyClass;
interface DECLSPEC_UUID("{6A6EC8CB-1AAB-3AB1-BD57-0FE21778D4E2}") _MyClass;
typedef TComInterface<_MyClass, &IID__MyClass> _MyClassPtr;
typedef _MyClass MyClass;
typedef _MyClassPtr MyClassPtr;
interface _MyClass : public IDispatch
{
public:
#if !defined(__TLB_NO_INTERFACE_WRAPPERS)
#endif // __TLB_NO_INTERFACE_WRAPPERS
};
#if !defined(__TLB_NO_INTERFACE_WRAPPERS)
template <class T /* _MyClass */ >
class TCOM_MyClassT : public TComInterface<_MyClass>, public TComInterfaceBase<IUnknown>
{
public:
TCOM_MyClassT() {}
TCOM_MyClassT(_MyClass *intf, bool addRef = false) : TComInterface<_MyClass>(intf, addRef) {}
TCOM_MyClassT(const TCOM_MyClassT& src) : TComInterface<_MyClass>(src) {}
TCOM_MyClassT& operator=(const TCOM_MyClassT& src) { Bind(src, true); return *this;}
};
typedef TCOM_MyClassT<_MyClass> TCOM_MyClass;
template<class T>
class _MyClassDispT : public TAutoDriver<_MyClass>
{
public:
_MyClassDispT(){}
_MyClassDispT(_MyClass *pintf)
{
TAutoDriver<_MyClass>::Bind(pintf, false);
}
_MyClassDispT(_MyClassPtr pintf)
{
TAutoDriver<_MyClass>::Bind(pintf, true);
}
_MyClassDispT& operator=(_MyClass *pintf)
{
TAutoDriver<_MyClass>::Bind(pintf, false);
return *this;
}
_MyClassDispT& operator=(_MyClassPtr pintf)
{
TAutoDriver<_MyClass>::Bind(pintf, true);
return *this;
}
HRESULT BindDefault()
{
return OLECHECK(Bind(CLSID_MyClass));
}
HRESULT BindRunning()
{
return BindToActive(CLSID_MyClass);
}
};
typedef _MyClassDispT<_MyClass> _MyClassDisp;
typedef TCoClassCreatorT<TCOM_MyClass, _MyClass, &CLSID_MyClass, &IID__MyClass> CoMyClass;
#endif // __TLB_NO_INTERFACE_WRAPPERS
}; // namespace Mytest_tlb
TCOM_MyClassT.h ファイルもあります。これが何を意味するのかわかりません。私が見たチュートリアルまたは例は、VC++ 用であるか、時代遅れであるか、私の問題に固有のものではないか、単に機能しないかのいずれかです。