这个问题困扰我3天了,在网上查了各种资料还未解决:环境:vs2005,mfc dll工程(共享),在对话框中添加了一个shockwave flash object控件,并将其设置为对话框类的一个控件变量。问题:执行这个dll时,会弹出“试图执行系统不支持的操作”。 
          HWND CDataExchange::PrepareCtrl(int nIDC)
        {    
           ……………………     
 
           pSite = m_pDlgWnd->GetOleControlSite(nIDC);
  if (pSite == NULL)
  {
   TRACE(traceAppMsg, 0, "Error: no data exchange control with ID 0x%04X.\n", nIDC);
   ASSERT(FALSE);
   AfxThrowNotSupportedException();
  }
        }
nIDC是shockwave flash object控件的id值,但m_pDlgWnd->GetOleControlSite(nIDC)却返回空,跟进去后是因为COleControlContainer *m_pCtrlCont为空导致。然后AfxThrowNotSupportedException()就抛出“试图执行系统不支持的操作”。  注:1。已经在app类中做过AfxEnableControlContainer()、AfxOleInit()、CoInitialize( )工作。
           2。如果是mfc应用程序的话,没有任何问题。恳请大家帮我看看到底是哪里出了问题。万分感谢!!!

解决方案 »

  1.   

    http://support.microsoft.com/kb/140850
      

  2.   

    你可以把复现问题的代码发给我,我帮你调试一下
    [email protected]
      

  3.   

    您好,感谢您给予指导。
    可是问题还没有解决。
    app类里的导出函数都加的有AFX_MANAGE_STATE(AfxGetStaticModuleState())
    InitInstance()没有,看您给我的文章里说这个函数里的切换工作会由mfc帮我们来做。
    请问还需要在别的什么地方加入AFX_MANAGE_STATE(AfxGetStaticModuleState())进行资源切换吗?
    我对这方面的知识不是很了解。
      

  4.   

    对不起,我没有表达清楚。
    我的意思是Initinstance中没有加入AFX_MANAGE_STATE(AfxGetStaticModuleState())
    不是扩展dll 是规则dll
      

  5.   

    我是直接通过“添加变量”将这个控件作为Dlg类的一个控件变量。
    void CxxDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_SHOCKWAVEFLASH1, m_FlashPlayer);
    }
    请问ax控件还需要做别的工作吗
      

  6.   

    有个细节:mfc为这个ax控件生成的资源id值和对话框的资源id值是相同的。
              我手动为ax控件改了个id值。(没有冲突的)
      

  7.   

    问题还没解决,很惆怅!
    无论怎样,初始化dll里的对话框时,都会因为
    void CXXDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_SHOCKWAVEFLASH1, m_FlashDlg);
    }
    而失败。高手们快来关注下,提下意见。我可以另外开贴加分!谢谢大家!
      

  8.   

    http://www.vckbase.com/article/atl/0007.htm
      

  9.   

    谢谢 不过我是在dll中的对话框使用ocx控件。如果在exe中使用是不会出现这个问题的。
    还是感谢!
      

  10.   

    出问题的恐怕不仅仅是FLASH控件,其它OCX控件估计一样出问题。问题的现象:从这个控件ID取不到SITE,导致断言出错。
    我的猜测:既然取不到SITE,说明SITE没有创建成功,而SITE的创建是CONTAINER完成的,所以首先要检查CONTAINER是否有效。如果有效(调用了AfxEnableOleContainer时的正常情况)且没有被重载,CONTAINER会调用系统默认的OCCMANAGER,这个OCCMANAGER保存在模块信息里,或者从线程本地存储的数据中获取(应用程序提供的OCCMANAGER),但要正确地获取OCCMANAGER,需要正确地把本DLL的模块信息注册到MFC全局模块链中,但这个工作只能由MFC扩展DLL才能完成,REGULAR类型的DLL是不会做的。建议改成扩展DLL试试,否则即使发现了问题原因也不一定能解决。
      

  11.   

    http://blog.csdn.net/scq2099yt/archive/2008/02/01/2076363.aspx
      

  12.   


    谢谢jameshooo大哥的关注。您的分析很对,使用其他ocx的控件都会出现这个问题。由于我在这个工程中第一次编写dll,有些地方对我来说理解有点难。
    我试着把共享dll改为了静态链接的,同样的代码,就能够正常使用了。
    请问这种情况说明什么问题?
      

  13.   

    共享的DLL是说在编译的时候,程序自动在电脑的C:\WINDOWS\system32目录下找需要的DLL文件,这个只是针对与在该目录下已经有这些DLL文件的情况。静态的DLL是说在编译的时候把类库加到程序文件中,这个针对于在C:\WINDOWS\system32目录下找不到需要的DLL文件的情况。用VS2005写软件,在项目属性中有一项MFC的使用,有三种设置:1.使用标准Windows库
    2.在共享DLL中使用MFC
    3.在静态库中使用MFC
    不关移植性的事,第二种指的是打包时一些MFC的DLL的内容没有被包含在EXE文件中,所以EXE文件较小,但是运行时要求系统中要有相关的DLL文件,第三种是将DLL中的相关代码写进EXE文件中,文件较大,但是可以在没有相关DLL的机器上运行.
    一般选第二种,因为大多数系统中都会带有MFC 相关的DLL,因为许多程序都是用MFC做的,发布时会发布相关DLL,所以不用静态连接.VS2005的,系统带它的DLL的确实不多,用静态连接吧,要好一些的,因为不用加载DLL了.本人建议用静态的DLL,因为怕在别人的电脑上不能运行。