我手里有个COM组件,包含源码,现在遇到的问题是我不知道怎么在MFC中去调用。
COM源码地址:
http://download.csdn.net/detail/morrist1987/4015035。之前在MFC中也调用EXCEL、WORD和MSCHART等Activex控件,也能够用。我一直是用添加TypeLib的方法来用,
就是生成一个包装类,然后声明一个包装类的对象来实现所有功能。
但是这个控件我生成包装类后,去调用里面的函数,根本不做任何响应。
void CTestDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CoInitialize(NULL);
CVideoPlayWnd s;
s.OpenVideo("test.264");
CoUninitialize();
}
上面是我的调用方法。控件里面有一个CContainWindow的对象,里面实现OnCreate,OnSetFocus等消息响应函数,生成的包装类里面没有这些消息响应函数,只有几个构造函数和其他两个函数,class CVideoPlayWnd : public COleDispatchDriver
{
public:
CVideoPlayWnd(){} // 调用 COleDispatchDriver 默认构造函数
CVideoPlayWnd(LPDISPATCH pDispatch) : COleDispatchDriver(pDispatch) {}
CVideoPlayWnd(const CVideoPlayWnd& dispatchSrc) : COleDispatchDriver(dispatchSrc) {}
public:
long OpenVideo(LPCTSTR strVideoPath)
{
long result;
static BYTE parms[] = VTS_BSTR ;
InvokeHelper(0x1, DISPATCH_METHOD, VT_I4, (void*)&result, parms, strVideoPath);
return result;
}
void CloseVideo()
{
InvokeHelper(0x2, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
}
};
现在恳请高手帮我看看,要怎么去调用该控件。
我刚接触COM和ATL,很多地方都不懂,希望各位大大指教。

解决方案 »

  1.   

    要先注册组件,在开始-》运行中用regsvr32.exe来注册组件。
    CVideoPlayWnd这个看起来像是一个控件,应该用类似
    CVideoPlayWnd *s = new CVideoPlayWnd ;
    s->Create(.....)创建控件然后CoInitialize(NULL)在BOOL CXXApp::InitInstance()中调用。
    CoUninitialize();可以不调用
      

  2.   

    我把DLL放到sys32目录下,然后注册,出错了。
    提示:模块“VideoPlay.dll”加载失败。请确保该二进制存储在指定的路径中或者调试它以检查该二进制或相关的dll文件是否有问题。不过我没用regsvr32注册,但是我在注册表中也已经找到该控件。是用guid搜索找到的。
      

  3.   

    不知道你用的什么开发工具
    正如1楼说的 的确看起来像是个控件 我没下载那个源码
    不过像QvodPlayer提供了二次开发的接口一样 可以在COM里面引用开放的dll
      

  4.   

    老大,还有你回答的
    s->Create(.....)创建控件
    这个要怎么去创建控件呢?调用里面的oncreate函数吗?
    我试过调用oncreat,但是提示oncreate不是类成员。
    该用什么方法去创建控件呢?
    恳请老大不吝赐教。
      

  5.   


    开发工具用的是VS2005。com是以dll的形式提供的。
      

  6.   

    提示:模块“VideoPlay.dll”加载失败缺少库,或者路径不正确
      

  7.   

    现在dll已经注册成功,之前注册失败的原因是因为该控件本身调用其他的dll,需要将被调用的dll放到sys32目录。
    我在VS2005中插入activex控件,然后添加该控件的一个变量。
    我用添加后的变量去create一个控件窗口,出现了异常。
    我的代码如下:
    CVideoplaywnd1 sp;
    sp.Create("bofang",SW_SHOW,CRect(0,0,200,200),this,1000);
    出现的问题是一个断言错误:在occsite.cpp文件中。
    if (pWndCtrl != NULL)
    {
    ASSERT(pWndCtrl->m_pCtrlSite == NULL);  //这里报断言错误。
    m_pWndCtrl = pWndCtrl;
    pWndCtrl->m_pCtrlSite = this;
    }
      

  8.   

    用depence看看少什么库,在注册,如果是Win7注册不上的话就看看自己的权限。
      

  9.   

    那你就不要用代码创建,直接在资源管理器中在对话框上添加控件
    还有就是,你的create的参数错了
    大概是长这样的
    s.Create(_T("My button"), WS_CHILD|WS_VISIBLE, 
       CRect(10,10,100,30), this, 100);
      

  10.   

    恩。我现在修改了创建控件的方式。是直接在对话框面板中添加了控件。
    已经初步解决了一部分问题。还有一个问题就是我调用com里面的openvideo之后,发现该函数调用成功,也成功进入到dll内部的playvideofile函数里面。但是并没有出现播放该视频。只是弹出了playvideofile里面的一个messagebox的提示。
    楼上的大大,你能把我那个com控件下载后看看么。谢谢了。
      

  11.   


    现在已经注册成功。需要的话可以从我的资源里下载该activex控件的源码。
    不过编译后生成的dll和里面附带的dll一起放到sys32目录下才能注册成功。