본문으로 바로가기

VB에서 VC++ 상속 받기 혹은 추상화 하기

category 개발언어/c++ 2016. 7. 18. 10:32

C++ 로 만든 ATL에서 IUnknown형을 사용하는 Interace를 VB에서 상속받거나 사용하기

1.. IUnknown형을 VB에서는 인식 하지만 vb에서는 IUnknown의 자료형을 제공하지 못한다.

이 말이 무슨 의미인가? 다음 두 항목의 예를 보면

2. VB에서 VC에서 만들어진 ATL을 사용할 때

Private di As TDEVICELib. TCollection 같이 선언해서 사용 하거나

Dim t_coll As TCollection

Set t_coll = New TCollection   또는 Set coll = CreateObject("TDEVICELib. TCollection ")

 

Call t_coll.Add(New MultiRun, "Test")

과 같이 사용해도 된다 t_coll.Add(New MultiRun, "Test")의 함수가

HRESULT Add([in] IUnknown* pDispatch,[in, optional] VARIANT Key);

또는 속성값이

[propget, id(DISPID_VALUE), helpstring("property Item")] HRESULT Item([in] VARIANT vIndex, [out, retval]IUnknown** pDispatch);

[propput, id(DISPID_VALUE), helpstring("property Item")] HRESULT Item([in] VARIANT vIndex, [in] IUnknown* pDispatch);

와 같이 되어 있어도 VB는 문제 없이 처리한다.

이는 마치 VB가 IUnknown에 대해서 인식 할 수 있어서 잘 처리 되는 것이 아니라

몰라도 상관 없으니 그냥 넘겨주고 넘겨 받는 것으로 보인다. –별 다른 문제가 되지 않으니 그냥 사용한다.

이 부분에 대해 이의를 제기 하면 VC++도 마찬가지로 신뢰 할 수 가 없다 IUnknown이라는 것 자체가 "알 수 없는"의 의미인지라

IUnknown의 정체를 지능적으로 판단하기는 무리가 있다. – 또한 IUnknown을 사용할 때는 어는 정도 위험 부담을 안고 가야 만 하는 것이다.

 

3. 그런데 VB에서 C++로 만든 Object를 상속 받으려고

Implements TDEVICELib. TCollection 와 같이 사용하면 그때 부터 문제 가 발생한다.

VB가 IUnknown을 알 수 없으므로 IUnknown과 관련된 Interfce를 만들 수 가 없어서 Error가 발생한다

이런 이유 때문에 LPDISPATCH 를 사용해야 한다.-단 LPDISPATCH* 등과 같이 작성하면 VB는 Point의 개념이 없으므로

전혀 엉뚱한 Data가 되므로 주의 하자.