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가 되므로 주의 하자.
'개발언어 > c++' 카테고리의 다른 글
CoInitialize의 기능 (0) | 2016.07.18 |
---|---|
ATL, _com_error 클래스와 HRESULT 에러 처리,error (0) | 2016.07.18 |
ATL License 구하기,Activex License 찾기 (0) | 2016.07.18 |
Visual Basic 에서 사용하는 Winsock 컨트롤 내부 구현 (0) | 2016.07.18 |
현재 실행되는 모든 프로세스의 동작 상태 체크하기 (0) | 2016.07.18 |