我现在遇到的问题是;做个dll工程 工程中有个对话框在放入activex控件后调这个dll显示对话框函数,但对话框显示不出来,去掉activex控件后对话框就显示出来了。
  但做成exe放入activex控件也能显示,没有问题 
  还忘高手指点.

解决方案 »

  1.   

    我也要一份。
    我的油箱是[email protected]
      

  2.   

    如果是MFC,而你的DLL也是基于MFC时,如果要调用,
    在函数接口开始加入AFX_MANAGE_STATE(AfxGetStaticModuleState())
      

  3.   

    我的active控件估计也是用vc写的,我最近才用vc 不算太熟。
      dll是基于mfc的 接口开始我也加入了AFX_MANAGE_STATE(AfxGetStaticModuleState())  可还是不行啊。我想是不是需要加入AfxOleInit()才行,但不知怎么加入,除此之外还需要什么
      为什么exe下就可以而dll下确不行?
      各位大虾多多执教啊.
      

  4.   

    AfxOleInit()在DLLMain加入。
    也可能是你少加入了某个库。
    比如如果用RichEdit的话就得加载LoadLibrary( "riched32.dll" );
      

  5.   

    谢谢 楼上的,我按你说的做了,的确richedit能出来了,但我现在放入的是ocx控件啊 也就是
      在窗口中insert activex control 我放了一个日历(calendar)控件 我该如何让它老人家显示出来 ,高手指点指点啊.
      

  6.   

    关键你的调用dll的程序中也要有这个com组件的资源,不然不可以,我也碰到过这个问题,你在你的应用程序的资源中也插入这么一个控件你再试试就知道了,对话窗出来了,不过这个不是解决方法。等高人回答吧。
      

  7.   

    to elabs :
      能不能写些代码指点指点,我比较菜。
     其实我的问题是这样的:我做的是控制数码相机拍照。开发包(sdk)提供的是ocx,有vc和
    vb的demo例子。但我用的是delphi。提供方说不支持delphi。我把ocx控件装到delphi里
      简单修改修改倒是可以用了,但预览后的图像传不回来。vc里就那么几行代码就行,我在
    delphi里写了好多都不行。
      vc里是我是这样写的:
       COleSafeArray buff;
       CString strFile;
       int PicSize;
       LPVOID lpbuf;   m_Rye.Preview(m_nCurrentCamera);
       m_Rye.SetPropCurrentPicture(m_nCurrentCamera,0);
          PicSize=m_Rye.GetPropPicSize(m_nCurrentCamera);   
       if (PicSize>0)
       {
          //保留到当前目录下
      strFile="d:/Preview.jpg";

          buff.CreateOneDim(VT_UI1,PicSize);
      m_Rye.GetPreview(m_nCurrentCamera,PicSize,buff);
      CFile file(strFile, CFile::modeCreate | CFile::modeReadWrite |   CFile::typeBinary);
          buff.AccessData(&lpbuf);
         file.Write(lpbuf, PicSize);
          buff.UnaccessData();
       }  可改成delphi的方式传不回图像来。
       delphi 里我是这样写的:
     var
        OleData:OleVariant;
        PData:pointer;
        oleArray:PSafeArray;
        ArrayBounds :TSafeArrayBound;
     begin  Rye.Preview(nCurrentCamera);
      Rye.propCurrentPicture[nCurrentCamera]:=0;
      PicSize:=Rye.propPicSize[nCurrentCamera];
      if PicSize>0 then
      begin
        ArrayBounds.lLbound:=0;
        ArrayBounds.cElements:=PicSize;
        VarBounds[0].ElementCount:=PicSize;
        VarBounds[0].LowBound:=0;
        oleArray:=SafeArrayCreate(VT_UI1,1,ArrayBounds)
        TVariantArg(oleData).vt:=varByte or varArray;
        TVariantArg(OleData).pArray:=oleArray    Rye.GetPreview(nCurrentCamera,PicSize,OleData);
        if VarIsArray(OleData) then
        begin
          if SafeArrayAccessData(TVariantArg(oleData).parray,PData)=s_ok then
          begin
            -------
          end;
         //---跟踪发现pdata^没有值.
       end;
      end;
      哪位高手能不能看看我的将上面的vc改成delphi问题出在哪里了?
      如果delphi里不行,我就只能将vc得做成dll但做成dll delphi调会出现我最前面的帖子
     说的情况。加入activex控件的窗口无法显示。
      

  8.   

    哎,我都要疯了,郁闷,前天用delphi做了一晚上都没做出来,vc我又不算太熟,以前没写过vc的项目,上来就让我搞这么深奥的。
      高手、大虾、高人帮帮忙啊。
      

  9.   

    是不是要使用 CoInitialize(NULL); 函数呀
      

  10.   

    AfxEnableControlContainer好像也不行啊,
      哎,高手到哪里去了啊,有谁有这方面的例子吗
      

  11.   

    把应用程序的窗口句柄传到的dll中。
      

  12.   

    to syy64;
        传过去如何初始化啊,哎,我这个特笨的,能不能详细说说。
        拜托了啊,最好能写点例子或函数之类的。
        先谢谢了啊.
      

  13.   

    http://community.csdn.net/Expert/topic/3081/3081869.xml?temp=.707226
      

  14.   

    做成EXE可以而DLL不行的原因:放入ACTIVX控件需要调用者程序是包容器,AfxEnableControlContainer帮你自动完成了,但做成DLL,调用DLL的程序并不是包容器,因此窗口出不来。
    前面 elabs(洋洋) 提到的在你的应用程序的资源中也插入这么一个控件的方法就是让调用程序成为了包容器。