就是能够象VB或VC开发环境那样的,选菜单项“插入ActiveX控件”就能把已经注册的ocx控件用列表框列出来,当我点选这个控件时,能够在对话框或View上动态创建。(应该会用到注册表吧)另外,关于动态创建(我说的动态创建是:我的程序已经做好了,然后又要加人新的控件)我发过帖子问过,基本上有两种方式:其一是用CWnd::CreateControl, jiangsheng(蒋晟.MSMVP2004Jan) 大哥说用法参考CHTMLView的源代码,可是我一直没有找到,如果哪位有发到我的信箱里吧,[email protected] 多谢多谢,另外一种方法是用com技术,得到CLSID,我不是很懂,如果哪位有例子,或者知道给讲解一下吧,或发到我得信箱里,分不够可以再加,多谢了!

解决方案 »

  1.   

    可以用:
    CAxWindow m_ax;
    LPCTSTR pszName = __T("yourtlb.controlname");//控件的ProgID
    HWND hwndContainer = m_ax.Create(m_hWnd,rect,pszName,WS_CHILD|WS_VISIBLE);
    可以通过
    IXXXX* pXXXX = NULL;
    m_ax.QueryControl(&pXXXX);    //得到控件接口
    pXXXX->foo();              //调用方法或者设置属性
      

  2.   

    控件的GUID位于注册表的classes主键下。
      

  3.   

    To: wangweixing2000(星(准备跳槽中!!)) 
    您给的例子还是在已知Activex控件类的基础上的
    我想实现的是这样一个控件容器:只要ocx或dll在系统中注册,我可以不知道它的类
    我就可以将其列出,并动态创建。
    类似于VB开发环境下,可以将任意的已注册控件的窗体拖到form上。
      

  4.   

    我给你的例子不用知道控件类,控件的ProgID可从注册表中查到!哈哈!
      

  5.   

    http://community.csdn.net/Expert/topic/3109/3109110.xml?temp=.1241571麻烦大侠们看一下!
      

  6.   

    请问wangweixing2000(星(准备跳槽中!!)) 
    您给的代码中CAxWindow 是继承自哪个类的?
    另外如果我只知道要创建控件的名称(比如mschart.ocx)那么它的ProgID怎么得到呐?
    不好意思打扰,希望能得到您的帮助,多谢!
      

  7.   

    bluearth(九二)
    由于文档中心升级,目前还不能发表文章,而你问这个问题又比较急,因此,我只能尽量帮你一下,把动态注册控件的核心代码给你列出如下://------------------------------------------------------------------
    // 注册控件函数
    BOOL CEx32Dlg::Register(CString strOcxPath)
    {
    BOOL bResult = FALSE ;
    // 检查是否支持注册
    if (SupportsSelfRegister(strOcxPath))
    {
    HMODULE hModule = ::LoadLibrary(strOcxPath) ;
    if (LOADLIBRARY_FAILED(hModule)) return FALSE ;
                       
                       // 获得注册函数地址
    CTLREGPROC DLLRegisterServer =
                (CTLREGPROC)::GetProcAddress(hModule,"DllRegisterServer" ) ;
    if (DLLRegisterServer != NULL)
    {
    HRESULT regResult = DLLRegisterServer() ;
    bResult = (regResult == NOERROR) ; 
    }
    ::FreeLibrary(hModule) ;
    }
    return bResult ;
    }//------------------------------------------------------------------
    // 卸载注册控件函数
    BOOL CEx32Dlg::UnRegister(CString strOcxPath)
    {
    BOOL bResult = FALSE ;
    //  检查是否支持注册
    if (SupportsSelfRegister(strOcxPath))
    {
    HMODULE hModule = ::LoadLibrary(strOcxPath) ;
    if (LOADLIBRARY_FAILED(hModule)) return FALSE ;

    // 获得注册函数地址
    CTLREGPROC DLLUnregisterServer =
                (CTLREGPROC)::GetProcAddress( hModule,
    "DllUnregisterServer" ) ;
    if (DLLUnregisterServer != NULL)
    {
    HRESULT regResult = DLLUnregisterServer() ;
    bResult = (regResult == NOERROR) ; 
    }
    ::FreeLibrary(hModule) ;
    }
    return bResult ;
    }//-----------------------------------------------------------------
    // 检查控件是否支持注册
    BOOL CEx32Dlg::SupportsSelfRegister(CString strOcxPath)
    {
    BOOL bResult = FALSE;
    DWORD  handle;
    UINT  uiInfoSize;
    UINT  uiVerSize ;
    UINT  uiSize ;
    BYTE* pbData = NULL ;
    DWORD* lpBuffer;;
    char szName[512] ;

    // 获得文件大小信息
    uiInfoSize = 
    ::GetFileVersionInfoSize(strOcxPath.GetBuffer(0),
    &handle);
    if (uiInfoSize == 0) return FALSE ; pbData = new BYTE[uiInfoSize] ;

    //  获得文件信息
    bResult = 
    ::GetFileVersionInfo(strOcxPath.GetBuffer(0),
    handle,
    uiInfoSize,
    pbData);
    if (!bResult) goto NastyGoto ;

    // 在注册表中查找
    bResult = 
    ::VerQueryValue( pbData,
    "\\VarFileInfo\\Translation",
    (void**)&lpBuffer,
    &uiVerSize);
    if (!bResult) goto NastyGoto ;

    bResult = uiVerSize ;
    if (!bResult) goto NastyGoto ;

    // Build the path to the OLESelfRegister key
    // using the translation information.
    sprintf( szName,
    "\\StringFileInfo\\%04hX%04hX\\OLESelfRegister",
    LOWORD(*lpBuffer),
    HIWORD(*lpBuffer)) ;

    // Search for the key.
    bResult = ::VerQueryValue( pbData, 
    szName, 
    (void**)&lpBuffer, 
    &uiSize);

    NastyGoto:
    delete [] pbData ;
    return bResult ;
    }一般注册控件最好选择在窗体的OnCreate事件中。
    在窗体的.cpp文件中加上:#ifdef _WIN32
    #define LOADLIBRARY_FAILED(x) (x == 0)
    #else
    #define LOADLIBRARY_FAILED(x) (x <= HINSTANCE_ERROR)
    #endifProject-->Settings的link加上链接库:version.lib