各位高手,小弟正在开发一个firefox的插件,这个插件里面需要用到我们自己定义好的ocx控件,由于firefox的插件开发是必须基于win32的dll项目的,所以无法在工具箱里面直接把ocx控件拖过去,只好使用代码调用的方式,代码如下:
//////在这里导入ocx文件
#import "BanaX.ocx"
using namespace BanaXLib;
/////////
////////这里省去一些无关的代码
//////////
::CoInitialize(NULL);CLSID clsid;IID iid;::CLSIDFromString(L"{67004315-CF72-4E45-A739-6DB3959A7010}",&clsid);::CLSIDFromString(L"{EAA1A185-91C7-4056-88C7-9B2454280EF8}",&iid);BanaXLib::_DBanaXPtr bana;///////////////////////在这里创建控件接口
HRESULT hr=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,iid,(LPVOID*)&bana);//////////////////////
if(SUCCEEDED(hr))
{
MessageBox(NULL,_T("OK!"),_T("Done"),MB_OK);
}
else
{
MessageBox(NULL,_T("Failed!"),_T("Error"),MB_OK);
}
if(bana)
bana.Release();
::CoUninitialize();现在的问题是,我的控件接口bana是创建成功了,问题是如何在初始化我们的控件,是否要用到控件的容器,调用的代码是怎样的?我在网上找了好久,网上说的方法分别有:1)使用IDispatch::Invoke函数   2)使用CAxWindow类
可是我都试过,就是不成功,请大家帮帮忙,我比较急~最好要有详细的代码,跪谢

解决方案 »

  1.   

    CoCreateInstance 创建对象实例后,QueryInterface等查询接口,然后就可以调用接口方法了
      

  2.   

    ActivX也是com组件,像其它com一样使用就可以
    项创建它的实例可以调用
    CAxWindow::CreateControl 
      

  3.   

    OCX不是普通的组件,它创建好之后必须激活才能正常使用,而激活又必须容器支持,容器又需要一个窗口来承载。一个无界面的插件使用OCX是没有意义的。
      

  4.   

    虽然firefox的插件是最后要生成为dll的,但是在插件里面可以获取firefox浏览器当中插件所在的句柄,请问,在能够获取到了句柄的情况下,是不是就可以用ocx控件呢?如果可以的话,具体代码又是怎样的?
      

  5.   


    我给出里面的一些代码
    ///////////////这段代码是在插件的Init()函数里面的
    #ifdef XP_WIN
      InvalidateRect(m_hWnd, NULL, TRUE);
      UpdateWindow(m_hWnd);
    #endif也就是说,可以在这个函数里面获取到HWND m_hWnd句柄,该句柄代表在firefox里面插件窗口的句柄,并不是firefox的句柄,比如,如果我的插件规定了插件窗口的大小为400*300,那么该句柄就代表这个400*300的窗口,并且可以在这个窗口里面绘制win32的图形啊,界面什么之类的