我有一个OCX的控件,我在VC里用导入控件的方式就可以调用。 
这个时候这个OCX是从CWnd里面派生的。
如果我用class Wizard方式导入这个OCX的类型库。这个时候我用CreateDispach("类名classID") 
之后我再调用OCX里的方法为什么都不能得到正确结果呢?我想问大家,从Compoent里导入的OCX和从class Wizard中导入的有什么区别?
其实很多OCX都是不带界面的,如MSCOMM.dll难道我非要创建一个窗口来放不行么?

解决方案 »

  1.   

    注册一个 OCX 控件
    BOOL RegisterOcx(LPCSTR pszDllName)
    {
     HRESULT (STDAPICALLTYPE * lpDllEntryPoint) (void);
     LPCSTR pszDllEntryPoint = TEXT("");//_szDllRegSvr;
     BOOL bRtn;
     if (FAILED(OleInitialize(NULL)))
     {
      AfxMessageBox("Ole Initialize failed");
      return FALSE;
     }
     SetErrorMode(SEM_FAILCRITICALERRORS);
     HINSTANCE hLib = LoadLibraryEx(pszDllName, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
     if (hLib < (HINSTANCE)HINSTANCE_ERROR)
     {
      AfxMessageBox("Load Libary failed");
      bRtn = FALSE;
      goto CleanOle;
     }
      

  2.   

    这几天我也在研究com组件的调用问题,也有很多困惑,一块学习吧
    在vc中使用组件通常用三种方法
    1 使用com库函数,就是直接使用CoCreateInstance等函数直接访问COM对象提供的方法
     这个方法需要你将com组件接口定义和说明文件包含进来,比较麻烦
    2使用MFC OLE的Classwizard,利用ClassWizard从对象的类型库中创建组件的包装类,然后通过包装类来调用com对象提供的方法和属性
    3使用#import指令引入类型库,编译器从类型库中读出信息并且创建包装类,然后通过包装类调用com的方法和属性
    Compoent里导入的OCX和从class Wizard中导入的有什么区别??
    我觉得两种方法从本质上说是一样的,都是给你的com组件生成一个包装类,要说有区别那就是compoent的包装类是一个窗口类,从class wizard生产的包装类就是一个普通的c++类,至于你说的两种方法的结果不一样,我也不明白,从理论上应该是一样的,你再仔细的检查一下代码如果真的不一样,请告诉我,我正在学习