2012-10-18 2 views
0

나는 VS2010 C#으로 작성한 DLL을 가지고 있으며, 프로젝트를 COM 표시로 표시하고 COM Interop에 등록했다는 것을 보증합니다. VS2010 C++ 프로젝트에서 C++ 속성 페이지 -> 공통 속성 -> 프레임 워크 및 참조를 통해 C# 프로젝트를 참조하고 gcnew로 객체를 인스턴스화하는 코드를 작성하여 사용할 수 있습니다.볼랜드 C++에서 C# dll 사용하기

그러나이 방법은 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++, 오래된 것, 내 문제와 관련이없는 것 또는 작동하지 않는 것 중 하나입니다.

답변

2

알 수 있습니다.

CoInitialize(NULL); 
_MyClassPtr obj; 
HRESULT ptr = obj.CreateInstance(__uuidof(MyClass)); 

가장 간단한 것들 중 일부는 너무 어려울 수 있음을 좌절시키는 내용입니다.