这个问题困扰我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应用程序的话,没有任何问题。恳请大家帮我看看到底是哪里出了问题。万分感谢!!!
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应用程序的话,没有任何问题。恳请大家帮我看看到底是哪里出了问题。万分感谢!!!
[email protected]
可是问题还没有解决。
app类里的导出函数都加的有AFX_MANAGE_STATE(AfxGetStaticModuleState())
InitInstance()没有,看您给我的文章里说这个函数里的切换工作会由mfc帮我们来做。
请问还需要在别的什么地方加入AFX_MANAGE_STATE(AfxGetStaticModuleState())进行资源切换吗?
我对这方面的知识不是很了解。
我的意思是Initinstance中没有加入AFX_MANAGE_STATE(AfxGetStaticModuleState())
不是扩展dll 是规则dll
void CxxDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_SHOCKWAVEFLASH1, m_FlashPlayer);
}
请问ax控件还需要做别的工作吗
我手动为ax控件改了个id值。(没有冲突的)
无论怎样,初始化dll里的对话框时,都会因为
void CXXDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_SHOCKWAVEFLASH1, m_FlashDlg);
}
而失败。高手们快来关注下,提下意见。我可以另外开贴加分!谢谢大家!
还是感谢!
我的猜测:既然取不到SITE,说明SITE没有创建成功,而SITE的创建是CONTAINER完成的,所以首先要检查CONTAINER是否有效。如果有效(调用了AfxEnableOleContainer时的正常情况)且没有被重载,CONTAINER会调用系统默认的OCCMANAGER,这个OCCMANAGER保存在模块信息里,或者从线程本地存储的数据中获取(应用程序提供的OCCMANAGER),但要正确地获取OCCMANAGER,需要正确地把本DLL的模块信息注册到MFC全局模块链中,但这个工作只能由MFC扩展DLL才能完成,REGULAR类型的DLL是不会做的。建议改成扩展DLL试试,否则即使发现了问题原因也不一定能解决。
谢谢jameshooo大哥的关注。您的分析很对,使用其他ocx的控件都会出现这个问题。由于我在这个工程中第一次编写dll,有些地方对我来说理解有点难。
我试着把共享dll改为了静态链接的,同样的代码,就能够正常使用了。
请问这种情况说明什么问题?
2.在共享DLL中使用MFC
3.在静态库中使用MFC
不关移植性的事,第二种指的是打包时一些MFC的DLL的内容没有被包含在EXE文件中,所以EXE文件较小,但是运行时要求系统中要有相关的DLL文件,第三种是将DLL中的相关代码写进EXE文件中,文件较大,但是可以在没有相关DLL的机器上运行.
一般选第二种,因为大多数系统中都会带有MFC 相关的DLL,因为许多程序都是用MFC做的,发布时会发布相关DLL,所以不用静态连接.VS2005的,系统带它的DLL的确实不多,用静态连接吧,要好一些的,因为不用加载DLL了.本人建议用静态的DLL,因为怕在别人的电脑上不能运行。