修改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文件

[cpp]  view plain  copy
  1. #ifdef TEST2  
  2. uuid(B4B13A2B-49C0-41FC-8AB3-8D42853709F7), version(1.0),  
  3. #else  
  4. uuid(C7504F21-4536-484B-9E5B-20172DC050F0), version(1.0),  
  5. #endif  
  6.  helpfile("TESTOCX.hlp"),  
  7.  helpstring("TESTOCX ActiveX Control module"),  
  8.  control ]  
  9. library TESTOCXLib  
  10. {  
  11.  importlib(STDOLE_TLB);  
  12.  importlib(STDTYPE_TLB);  
  13.  //  Primary dispatch interface for CEFBCOMCtrl  
  14. #ifdef TEST2  
  15.  [ uuid(3E1D241C-A638-4BB7-8826-531976CB7FFB),  
  16. #else  
  17.  [ uuid(E09E578B-1FC5-4889-AC9D-BF2BDD8363D4),  
  18. #endif  
  19.   helpstring("Dispatch interface for TESTOCX Control"), hidden ]  
  20.    dispinterface _DTESTOCX  
  21.  {  
  22. properties:  
  23.   // NOTE - ClassWizard will maintain property information here.  
  24.   //    Use extreme caution when editing this section.  
  25.   //{{AFX_ODL_PROP(CTESTOCXCtrl)  
  26.   //}}AFX_ODL_PROP  
  27. methods:  
  28.   // NOTE - ClassWizard will maintain method information here.  
  29.   //    Use extreme caution when editing this section.  
  30.   //{{AFX_ODL_METHOD(CTESTOCXCtrl)  
  31.   //}}AFX_ODL_METHOD  
  32.  };  
  33.  //  Event dispatch interface for CEFBCOMCtrl  
  34. #ifdef TEST2  
  35.  [ uuid(7A3CFCC7-9C92-471B-972C-B0DADB338C73),  
  36. #else  
  37.  [ uuid(F101C353-A6F9-4F96-A7DD-BA17A6ACE374),  
  38. #endif  
  39.   helpstring("Event interface for EFBCOM Control") ]  
  40.  dispinterface _DTESTOCXEvents  
  41.  {  
  42. properties:  
  43.   //  Event interface has no properties  
  44. methods:  
  45.   // NOTE - ClassWizard will maintain event information here.  
  46.   //    Use extreme caution when editing this section.  
  47.   //{{AFX_ODL_EVENT(CEFBCOMCtrl)  
  48.   [id(1)] void TESTOCXEvent(BSTR szXML);  
  49.   //}}AFX_ODL_EVENT  
  50.  };  
  51.    
  52.  //  Class information for CEFBCOMCtrl  
  53. #ifdef TEST2  
  54.  [ uuid(A05E1B81-E655-4EDA-B9F1-C7DA63860086),  
  55. #else  
  56.  [ uuid(4AF2C253-937E-408F-9152-0914CF779150),  
  57. #endif  
  58.   helpstring("TESTOCX Control"), control ]  
  59.  coclass TESTOCX  
  60.  {  
  61.   [default] dispinterface _DTESTOCX;  
  62.   [default, source] dispinterface _DTESTOCXEvents;  
  63.  };  
  64.   
  65.  //{{AFX_APPEND_ODL}}  
  66.  //}}AFX_APPEND_ODL}}  
  67. };  

TestOcxCtl.cpp文件

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


本文出自 “Jsl_mes” 博客,请务必保留此出处http://jslmes.blog.51cto.com/5008224/1422375

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值