'배포'에 해당되는 글 1건

  1. 2009.03.25 ActiveX (ocx) 배포하기 전
정보2009. 3. 25. 15:09

프로젝트 빌드로 ocx 생성하기 전에,

 

CUserCreatedCtrl.h 파일에 "ObjSafe.h"를 추가.

 

그리고 아래 코드를 추가.

class CUserCreatedCtrl : public COleControl  

{  

    DECLARE_DYNCREATE(CUserCreatedCtrl)  

    DECLARE_INTERFACE_MAP()  

    BEGIN_INTERFACE_PART(ObjSafe, IObjectSafety)  

    STDMETHOD_(HRESULT, GetInterfaceSafetyOptions) (  

    /* [in] */ REFIID riid,  

    /* [out] */ DWORD __RPC_FAR *pdwSupportedOptions,  

    /* [out] */ DWORD __RPC_FAR *pdwEnabledOptions  

);  

  

STDMETHOD_(HRESULT, SetInterfaceSafetyOptions) (  

    /* [in] */ REFIID riid,  

    /* [in] */ DWORD dwOptionSetMask,  

    /* [in] */ DWORD dwEnabledOptions  

);  

END_INTERFACE_PART(ObjSafe);

 


CUserCreatedCtrl.cpp 파일 이벤트 맵 밑의 적당한 곳에 아래 코드 추가.

/////////////////////////////////////////////////////////////  

// Interface map for IObjectSafety  

BEGIN_INTERFACE_MAP( CUserCreatedCtrl, COleControl )  

INTERFACE_PART(CUserCreatedCtrl, IID_IObjectSafety, ObjSafe)  

END_INTERFACE_MAP()  

  

/////////////////////////////////////////////////////////////  

// IObjectSafety member functions  

ULONG FAR EXPORT CUserCreatedCtrl::XObjSafe::AddRef()  

{  

    METHOD_PROLOGUE(CUserCreatedCtrl, ObjSafe)  

    return pThis->ExternalAddRef();  

}  

  

ULONG FAR EXPORT CUserCreatedCtrl::XObjSafe::Release()  

{  

    METHOD_PROLOGUE(CUserCreatedCtrl, ObjSafe)  

    return pThis->ExternalRelease();  

}  

  

HRESULT FAR EXPORT CUserCreatedCtrl::XObjSafe::QueryInterface(  

REFIID iid, void FAR* FAR* ppvObj)  

{  

    METHOD_PROLOGUE(CUserCreatedCtrl, ObjSafe)  

    return (HRESULT)pThis->ExternalQueryInterface(&iid,  

        ppvObj);  

}  

  

const DWORD dwSupportedBits =  

INTERFACESAFE_FOR_UNTRUSTED_CALLER |  

INTERFACESAFE_FOR_UNTRUSTED_DATA;  

const DWORD dwNotSupportedBits = ~ dwSupportedBits;  

  

HRESULT STDMETHODCALLTYPE  

CUserCreatedCtrl::XObjSafe::GetInterfaceSafetyOptions(  

/* [in] */ REFIID riid,  

/* [out] */ DWORD __RPC_FAR *pdwSupportedOptions,  

/* [out] */ DWORD __RPC_FAR *pdwEnabledOptions)  

{  

    METHOD_PROLOGUE(CUserCreatedCtrl, ObjSafe)  

  

    HRESULT retval = ResultFromScode(S_OK);  

  

    // does interface exist?  

    IUnknown FAR* punkInterface;  

    retval = pThis->ExternalQueryInterface(&riid,  

        (void * *)&punkInterface);  

    if (retval != E_NOINTERFACE) { // interface exists  

        punkInterface->Release(); // release it--just checking!  

    }  

  

    // we support both kinds of safety and have always both set,  

    // regardless of interface  

    *pdwSupportedOptions = *pdwEnabledOptions = dwSupportedBits;  

  

    return retval; // E_NOINTERFACE if QI failed  

}  

  

HRESULT STDMETHODCALLTYPE  

CUserCreatedCtrl::XObjSafe::SetInterfaceSafetyOptions(  

/* [in] */ REFIID riid,  

/* [in] */ DWORD dwOptionSetMask,  

/* [in] */ DWORD dwEnabledOptions)  

{  

    METHOD_PROLOGUE(CUserCreatedCtrl, ObjSafe)  

  

    // does interface exist?  

    IUnknown FAR* punkInterface;  

    pThis->ExternalQueryInterface(&riid,  

        (void**)&punkInterface);  

    if (punkInterface) { // interface exists  

        punkInterface->Release(); // release it--just checking!  

    }  

    else { // interface doesn't exist  

        return ResultFromScode(E_NOINTERFACE);  

    }  

  

    // can't set bits we don't support  

    if (dwOptionSetMask & dwNotSupportedBits) {  

        return ResultFromScode(E_FAIL);  

    }  

  

    // can't set bits we do support to zero  

    dwEnabledOptions &= dwSupportedBits;  

    // (we already know there are no extra bits in mask )  

    if ((dwOptionSetMask & dwEnabledOptions) !=  

        dwOptionSetMask) {  

        return ResultFromScode(E_FAIL);  

    }  

  

    // don't need to change anything since we're always safe  

    return ResultFromScode(S_OK);  

}  

이제 프로젝트 빌드해서 OCX 생성.

INF 파일 작성. [Add.Code]에서 ocx는 제일 상위에 기록.

필요한 dll과 vc++ 2005 재배포 패키지와 Cabinet으로 압축하고, .cab 파일에 인증서 삽입.

서버에 cab파일 업로드 후, 페이지에 html 코드로 <object> 태그로 클래스 호출.

codebase=cabinet파일경로#version=1,0,1,2

 

 

두 번 다시 이런 삽질은 하지 말자!

  

Posted by jk1