Dain.Bora.Net  ver 2.0  
About Me
프로필
나의 가족
용's X-file
숙's X-file
다인홈피 ver 1.0
소중한 사람들
가족들
친구들
직장동료들
다인&건희
다인이 이야기
건희 이야기
엄마 이야기
기억속으로
가족들과 함께
즐거운 추억들
사진 & 물생활
디카 이야기
행복한 물생활
포토갤러리
게시판
부스러기들
자료실
좋은글
스터디
방명록
먹고자고놀고
가볼만한곳
먹고싶은것
링크
카운터
오늘 : 1
전체 : 30716
날자 : 2020/06/02

Category Category
MFC로 작성된 ActiveX 컨트롤의 복제
# C/C++   2005-07-28 18:00
이상용
GameNet을  진행하면서 ActiveX Control에 여러개 만드는 작업을 일일이 수작
업으로  하나의 Project를 만들고 , 기존에 있는 code를 Copy and Paste 작업
으로 새로운 ActiveX control을 생성했는 데 이런 번거로운 작업을 간단히 하
는 방법을 알았읍니다.
    
먼저 GUID는 4가지 포멧으로 생성할 수 있읍니다.
    
    1. IMPLEMENT_OLECREATE(...)
       This format specifies the GUID in an IMPLEMENT_OLECREATE macro.
    
    2. DEFINE_GUID(...)
       This format specifies the GUID using the DEFINE_GUID macro.
    
    3. static const struct GUID = {...}
       This format declares the GUID as a static structure declaration.
    
    4. Registry Format (i.e. {xxxxxxxx-xxxx...xxxx})
       This format specifies the GUID in a form suitable for registry
       entries or registry editor scripts.
    
    
그리고,  ActiveX  control은 다음과 같은 GUID의 일종인 4개의 UUID와 2개의
GUID 와 2개의 IID, 1개의 CLSID를 가지고 생성됩니다.
    
    
.odl에서 4개의 UUID를 볼 수 있읍니다.


=========================================================================
    #include
    #include
    
    [ uuid(D1F9BD23-5F4A-11D3-B23A-00A024EE8EDE), version(1.0),
      helpfile("MFC_ActtiveX.hlp"),
      helpstring("MFC_ActtiveX ActiveX Control module"),
      control ]
    library MFC_ACTTIVEXLib
    {
        importlib(STDOLE_TLB);
        importlib(STDTYPE_TLB);
    
        //  Primary dispatch interface for CMFC_ActtiveXCtrl
    
        [ uuid(D1F9BD24-5F4A-11D3-B23A-00A024EE8EDE),
          helpstring("Dispatch interface for MFC_ActtiveX Control"),
          hidden ]
        dispinterface _DMFC_ActtiveX
        {
            properties:
                //{{AFX_ODL_PROP(CMFC_ActtiveXCtrl)
                //}}AFX_ODL_PROP
    
            methods:
                //{{AFX_ODL_METHOD(CMFC_ActtiveXCtrl)
                //}}AFX_ODL_METHOD
        };
    
        //  Event dispatch interface for CMFC_ActtiveXCtrl
    
        [ uuid(D1F9BD25-5F4A-11D3-B23A-00A024EE8EDE),
          helpstring("Event interface for MFC_ActtiveX Control") ]
        dispinterface _DMFC_ActtiveXEvents
        {
            properties:
                //  Event interface has no properties
    
            methods:
                //{{AFX_ODL_EVENT(CMFC_ActtiveXCtrl)
                //}}AFX_ODL_EVENT
        };
    
        //  Class information for CMFC_ActtiveXCtrl
    
        [ uuid(D1F9BD26-5F4A-11D3-B23A-00A024EE8EDE),  // ==> html에서 사용하는 activex clsid
          helpstring("MFC_ActtiveX Control"), control ]
        coclass MFC_ActtiveX
        {
            [default] dispinterface _DMFC_ActtiveX;
            [default, source] dispinterface _DMFC_ActtiveXEvents;
        };
    
    
        //{{AFX_APPEND_ODL}}
        //}}AFX_APPEND_ODL}}
    };
==========================================================================
    
    

ActiveX Application class 인 .cpp에 다음 같은 포멧의 GUID이 있읍니다.


===================================================================================    
    const GUID CDECL BASED_CODE _tlid =    
        {  0xd1f9bd23,  0x5f4a,  0x11d3,  { 0xb2, 0x3a, 0, 0xa0, 0x24,
           0xee, 0x8e, 0xde } };

   const GUID CDECL BASED_CODE _ctlid =
        {0x7c91d9a6, 0x4a4c, 0x48e7, 0xa5, 0xe5, 0xa3, 0x93, 0x1e, 0x8d, 0xf0, 0xd0};
==========================================================================================

    
    
또, property page class인 .cpp에 다음과 같은 포멧의 GUID가 있읍니다.



==========================================================================================    
    IMPLEMENT_OLECREATE_EX(CMFC_ActtiveXPropPage,
    "MFCACTTIVEX.MFCActtiveXPropPage.1",
        0xd1f9bd27, 0x5f4a, 0x11d3, 0xb2, 0x3a, 0, 0xa0, 0x24, 0xee,
        0x8e, 0xde)
==========================================================================================


    
    
또,ActiveX  Control class인 .cpp에 다음과 같은 포멧의 IID와 CLSID가 있읍
니다.



==========================================================================================        
    IMPLEMENT_OLECREATE_EX(CXxxCtrl, "XXX.XxxCtrl.1",
        0xd1f9bd26, 0x5f4a, 0x11d3, 0xb2, 0x3a, 0, 0xa0, 0x24, 0xee,
        0x8e, 0xde)    
    // ActiveX Control CLSID
    
    Interface IDs
    
    const IID BASED_CODE IID_DXxx =
            {  0xd1f9bd24,  0x5f4a, 0x11d3, { 0xb2, 0x3a, 0, 0xa0,
               0x24, 0xee, 0x8e, 0xde} };
    // ActiveX Control  Dispatch interface ID
    
    const IID BASED_CODE IID_DXxxEvents =
            {  0xd1f9bd25,  0x5f4a, 0x11d3, { 0xb2, 0x3a, 0, 0xa0,
               0x24, 0xee, 0x8e, 0xde} };
    // ActiveX Control  Event interface ID
==========================================================================================


    
    
    
ActiveX control은 다음과 같은 Default로 9개의 GUID가 있읍니다.
    
Visual C++에서는 GUID를 생성하는 2가지의 방법을 제공하고 있읍니다.
도스   커맨드   상에서   쓸수  있는  UUIDGEN.exe와  컴포넌트로  제공하는
GUIDGEN.exe입니다.
저는  컴포넌트를  사용했는 데 이것이 더 쉽게 GUID가 포멧별로 생성이 됩니
다.
    
    1. GUID의 생성기에서 3번째 포멧으로 GUID를 생성하면, 4번째 포멧도 자동으
    로 알 수 있읍니다.
    
    2. 3번째 포멧으로 생성한 GUID를 Application Class인 cpp에서 바꾸고,
    
    3.  4번째  포멧으로  생성한  GUID에  첫번째  집합의  끝자리에 +1 을 해서
    property page class인 cpp에서 GUID를 바꾸고,
    
    4.  4번째 포멧으로 된 것을 .odl 에서 4개의 GUID를 첫번째 집합의 끝자리를
    하나 하나 변경하면서 바꾸어 주면 됩니다.
    이때  주의  하셔야  될것은  _tlid 값은 .odl에서 처음에 사용된 값을 사용하고
    _ctlid는 마지막 즉 실제 cllsid를 사용해야한다.
    
    5.ActiveX  Control  class인 .cpp에서 .odl 에서 CLSID인 4번째 UUID를 변경 (실제 clsid)
    ActiveX   Control  class인  .cpp에서  IID를  .odl에서  Primary  dispatch
    interface, Event dispatch interface에 있는 UUID로 변경
    
기타  문의 사항은 저에게 물어 보세요 .. 아는 한도 내에서 답변해 드리겠읍니다.
간단하죠..
    
그리고   ATL도   조금   틀리긴  해도  마찬가지  입니다.  .rgs(레지스트리 스크
립트)와 .idl(이것은 odl과 같음)에 GUID가 있읍니다.
    
    
------------------------------------------------------------------------
    
    
태경씨가  올려준 대로 GUID들을 몇개 만들어서 다른 컨트롤로 복제를 하는데
있어서 한가지를 추가합니다..
    
IE에 의해서 다운로드 받고 설치된 파일들은 그 파일이 설치된 폴더에 상관없
이 windows 폴더 밑에 다운로드 프로그램 파일스란 폴더에서 모두 볼 수 있습
니다..
    
    
이곳에  나타나는 문자열을 조정해야 하는데.. 이는 리소스 파일의 맨 마지막
에 들어있는 문자열과 odl 파일의 맨 마지막 부분에 있는 컨트롤의 헬프 스트
링을 변경합으로써 원하는 문자열이 나타나도록 할 수 있습니다..
    
    
이외에 클래스명을 바꾸지 않음으로해서 레지스트리에는 클래스명이 중복되어
등록되어 있게 되는 문제가 있습니다..
이는  델파이나 비베, VC++을 사용하여 ActiveX 컨트롤을 재사용 하는 경우에
어느게 어느 컨트롤인지 알아볼 수가 없게 하는 문제가 있습니다.. (클래스명
이  다 똑같아서..) 하지만 아직까지는 End User가 사용하는데는 아무런 문제
가 없어보이니 별 탈은 없을 것 같습니다..    
qqq http://www.christianlouboutinoutlet.us.org http://www.pandora-jewelry.us.com http://www.airhuaracheuk.org.uk http://www.sanfranciscogiantsjerseys.us http://www.fjallravenkanken.org http://www.airmax270.org http://www.suprashoes.us.com http://www.mulberrybagssale.org.uk http://www.pandorajewelry.us.org http://www.coach-outlets.us.com http://www.hydroflask.us.comqqq
2019-05-13 12:11
x
Name       Pass       Secret Code   Resize  
List
8    [웹] Apache+Linux 서버 튜닝 [1] 이상용 2005.09.22 1055
7    [웹] 아파치 웹서버 캐시 설정 [1] 이상용 2005.09.22 2664
   [C/C++] MFC로 작성된 ActiveX 컨트롤의 복제 [1] 이상용 2005.07.28 3237
5    [리눅스/유닉스] 리눅스 bonding 설정하기 [1] 이상용 2005.07.22 6345
4    [윈도우] 배포하기(Cab 파일 작성법) [1] 이상용 2005.07.21 3029
3    [윈도우] Microsoft Windows 2003 Server 최적화 설정하기 [1] 이상용 2005.07.17 608
2    [메일] 전자우편 보안 표준 S/MIME V3.1 확정[한국정보통신기술협회] [1] 이상용 2005.06.23 1632
1    [자바스크립트] 배경음악 넣기 [1] 이상용 2005.05.29 977
List   [1] 2  
Copyright 1999-2020 Zeroboard / skin by eggnara