반응형
반응형

안녕하세요. 오늘은 COM 래퍼 크래스 만드는 방법을 배워보겠습니다.

OCX를 만들게 되면 일반적으로 웹에서 사용하지만,

간혹 OCX를 프로그램에서 사용해야 하는 경우가 있습니다.

이럴때 자동으로 UI에서 래퍼 클래스가 생성되지만

안될 경우 혼란에 빠지게 됩니다. ㅠㅠ




OCX를 직접 사용하기 위해서는 래퍼 클래스를 이용해서 노출된 인터페이스에 접근하게됩니다.

래퍼 클래스는 OCX를 개발할 때 생성된 GUID를 이용해서 접근합니다.



1
2
3
#include "StdAfx.h"
#include "Activex_TESTCtrl.h"
IMPLEMENT_DYNCREATE(Activex_TESTCtrl, CWnd)
cs


Activex_TESTCtrl.cpp 파일 입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#pragma once
 
// 컴퓨터에서 Microsoft Visual C++를 사용하여 생성한 IDispatch 래퍼 클래스입니다.
 
// 참고: 이 파일의 내용을 수정하지 마십시오. Microsoft Visual C++에서
//  이 클래스를 다시 생성할 때 수정한 내용을 덮어씁니다.
 
/////////////////////////////////////////////////////////////////////////////
// CActivex_test01ctrl1 래퍼 클래스입니다.
 
class Activex_TESTCtrl : public CWnd
{
protected:
    DECLARE_DYNCREATE(Activex_TESTCtrl)
public:
    CLSID const& GetClsid()
    {
        static CLSID const clsid                        
            = { 0x2d12f2e40x1c6f0x475a, { 0x180x320x190xef0xef0x9a0x170x58} };
        return clsid;
    }
    virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle,
        const RECT& rect, CWnd* pParentWnd, UINT nID, 
        CCreateContext* pContext = NULL)
    { 
        return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID); 
    }
 
    BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, 
        UINT nID, CFile* pPersist = NULL, BOOL bStorage = FALSE,
        BSTR bstrLicKey = NULL)
    { 
        return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID,
            pPersist, bStorage, bstrLicKey); 
    }
 
    // 특성입니다.
public:
 
 
    // 작업입니다.
public:
 
    // _DActiveX_Test01
 
    // Functions
    //
 
    void Fun()
    {
        InvokeHelper(0x01, DISPATCH_METHOD, VT_EMPTY, NULLNULL);
    }
 
    
    // Properties
    BSTR GetFunIP()
    {
        BSTR site;
        InvokeHelper(0x02, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&site, NULL);
        return site;
    }
 
    void SetFunIP(LPCTSTR newVal)
    {
        static BYTE parms[] = VTS_BSTR;
        InvokeHelper(0x02, DISPATCH_PROPERTYPUT, VT_BSTR, NULL, parms, newVal);
    }
 
    
 
};
 
cs


Activex_TESTCtrl.h 파일 입니다.


CSLID는 OCX에 등록된 GUID를 복사하면 됩니다.


생성된 래퍼 클래스는 DDX_Control 함수를 사용해서 직접 연결하면 사용 가능합니다.


OCX에 설정된 메서드 또는 속성에 접근하기 위해서는 InvokeHelper 함수를 사용해야 합니다.


InvokeHelper함수는 wFlags를 통해 지정된 컨텍스트에서 dwDispID를 통해 지정된 개체 메서드 또는 속성을 호출합니다.



InvokeHelper 함수 구문입니다.


5개 이상 매개 변수를 사용하고 있으며 가장 중요한 메서드는 dwDispID입니다.

dwDispID를 OCX개발 시 설정 된 ID이며 ID가 다를 경우 "형식 오류" 를 리턴 합니다.



vtRet인수의 가능한 VARENUM 열거형입니다.

설정 된 값을 설정 후 접근하면 됩니다.


이렇게 래퍼 클래스를 만들면 쉽게 COM을 접근해서 사용 가능합니다.


자동 생성이 안된다고 당황하지 마시고 안되면 그냥 위 내용을 복사해서 사용하시면 됩니다.


그럼 즐거운 주말 보내십시오.


감사합니다.


반응형

+ Recent posts