修改MFC OCX的GUID

    最近在開發一個新項目時,需要用到一個已經發布過的OCX控件,但是需要兩個產品能夠相互兼容,這就需要兩個不同的OCX,但是代碼等都是一樣的,所以想到修改OCX的名稱以及相關GUID來產生兩個OCX文件。OCX是通過regsvr32命令註冊到系統中的,在註冊表中可以搜索到OCX的GUID和文件位置,OCX工程中的ODL文件中記錄了它的接口、事件、類的GUID。下面以TestOcx項目爲示例,簡單講一下我的修改過程。
    開始時只修改了TestOcx.odl文件中的四個GUID,但是發現後面註冊的OCX還是會覆蓋前面註冊的OCX,儘管兩個OCX的名稱並不一樣,但是兩個產品使用的都是後註冊的OCX。通過搜索項目文件,在TestOcxCtl.cpp文件中找到的3個GUID,分別爲類、接口、事件的GUID,將它們分別改爲和TestOcx.odl文件中相同的GUID後重新編譯,發現後註冊的OCX不會再覆蓋先註冊的OCX文件了,就算文件名相同也無所謂。
    爲了便於使用同一個工程編譯出不同的項目文件,使用條件編譯的方式。在VS2010中新建解決方案,在項目屬性的C/C++選項的預處理器中,添加預處理定義“TEST2”然後分別在TestOcx.odl和TestOcxCtl.cpp兩個文件根據不同的預定義來決定使用哪個GUID。
    示例代碼如下:

TestOcx.odl文件

#ifdef TEST2
[ uuid(B4B13A2B-49C0-41FC-8AB3-8D42853709F7), version(1.0),
#else
[ uuid(C7504F21-4536-484B-9E5B-20172DC050F0), version(1.0),
#endif
 helpfile("TESTOCX.hlp"),
 helpstring("TESTOCX ActiveX Control module"),
 control ]
library TESTOCXLib
{
 importlib(STDOLE_TLB);
 importlib(STDTYPE_TLB);
 //  Primary dispatch interface for CEFBCOMCtrl
#ifdef TEST2
 [ uuid(3E1D241C-A638-4BB7-8826-531976CB7FFB),
#else
 [ uuid(E09E578B-1FC5-4889-AC9D-BF2BDD8363D4),
#endif
  helpstring("Dispatch interface for TESTOCX Control"), hidden ]
   dispinterface _DTESTOCX
 {
properties:
  // NOTE - ClassWizard will maintain property information here.
  //    Use extreme caution when editing this section.
  //{{AFX_ODL_PROP(CTESTOCXCtrl)
  //}}AFX_ODL_PROP
methods:
  // NOTE - ClassWizard will maintain method information here.
  //    Use extreme caution when editing this section.
  //{{AFX_ODL_METHOD(CTESTOCXCtrl)
  //}}AFX_ODL_METHOD
 };
 //  Event dispatch interface for CEFBCOMCtrl
#ifdef TEST2
 [ uuid(7A3CFCC7-9C92-471B-972C-B0DADB338C73),
#else
 [ uuid(F101C353-A6F9-4F96-A7DD-BA17A6ACE374),
#endif
  helpstring("Event interface for EFBCOM Control") ]
 dispinterface _DTESTOCXEvents
 {
properties:
  //  Event interface has no properties
methods:
  // NOTE - ClassWizard will maintain event information here.
  //    Use extreme caution when editing this section.
  //{{AFX_ODL_EVENT(CEFBCOMCtrl)
  [id(1)] void TESTOCXEvent(BSTR szXML);
  //}}AFX_ODL_EVENT
 };
 
 //  Class information for CEFBCOMCtrl
#ifdef TEST2
 [ uuid(A05E1B81-E655-4EDA-B9F1-C7DA63860086),
#else
 [ uuid(4AF2C253-937E-408F-9152-0914CF779150),
#endif
  helpstring("TESTOCX Control"), control ]
 coclass TESTOCX
 {
  [default] dispinterface _DTESTOCX;
  [default, source] dispinterface _DTESTOCXEvents;
 };

 //`AFX_APPEND_ODL`
 //}}AFX_APPEND_ODL}}
};

TestOcxCtl.cpp文件

#ifdef TEST2
IMPLEMENT_OLECREATE_EX(CTESTOCXCtrl, "TESTOCX.TESTOCXCtrl.1", 0xA05E1B81, 0xE655, 0x4EDA, 0xB9, 0xF1, 0xC7, 0xDA, 0x63, 0x86, 0x00, 0x86)
#else
IMPLEMENT_OLECREATE_EX(CTESTOCXCtrl, "TESTOCX.TESTOCXCtrl.1", 0x4af2c253, 0x937e, 0x408f, 0x91, 0x52, 0x9, 0x14, 0xcf, 0x77, 0x91, 0x50)
#endif
// Type library ID and version
IMPLEMENT_OLETYPELIB(CTESTOCXCtrl, _tlid, _wVerMajor, _wVerMinor)
// Interface IDs       
#ifdef TEST2
const IID BASED_CODE IID_DTESTOCX ={ 0x3E1D241C, 0xA638, 0x4BB7, { 0x88, 0x26, 0x53, 0x19, 0x76, 0xCB, 0x7F, 0xFB } };
const IID BASED_CODE IID_DTESTOCXEvents = { 0x7A3CFCC7, 0x9C92, 0x471B, { 0x97, 0x2C, 0xB0, 0xDA, 0xDB, 0x33, 0x8C, 0x73 } };
#else
const IID BASED_CODE IID_DTESTOCX ={ 0xe09e578b, 0x1fc5, 0x4889, { 0xac, 0x9d, 0xbf, 0x2b, 0xdd, 0x83, 0x63, 0xd4 } };
const IID BASED_CODE IID_DTESTOCXEvents = { 0xf101c353, 0xa6f9, 0x4f96, { 0xa7, 0xdd, 0xba, 0x17, 0xa6, 0xac, 0xe3, 0x74 } };
#endif


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章