我通过新建Resource Script的方式在支持MFC的静态链接库中加入了资源,然后又添加对话框资源和对话框类CMyDialog。之后在静态库里创建如下函数:
void fun(CWnd *wnd)
{
CMyDialog *dlg = CMyDialog(wnd);
dlg->DoModal();
delete dlg;
}同时我新建一个MFC的EXE项目,在项目里调用
fun(this);
编译是通过了,但运行时却调不出CMyDialog对话框。不知为何,哪位高手可以指点?最好写明具体步骤。多谢多谢!

解决方案 »

  1.   

    不能在静态链接库中使用CDialog是因为CDialog需要模板资源,而静态链接库却不能访问资源。不过,可以在内存中动态创建Dialog的模板来达到在静态链接库中创建对话框的要求。可以参考MSDN中一个DLGTEMPL的例子,这个例子动态创建了Dialog的模板。需要创建DLGTEMPLATE和DLGITEMTEMPLATE结构然后用InitModalIndirect去调用他们。当然,如果你有一个动态链接库,可以将需要的资源通过动态链接库来装载到内存,然后再调用InitModalIndirect和DoModal。这样就不需要处理DLGTEMPLATE和DLGITEMTEMPLATE这么多麻烦的事情了。可以参考下面的这篇文章:http://support.microsoft.com/default.aspx?scid=kb;EN-US;q231591
      

  2.   

    学习!使用静态链接库还有什么意思吗?编译的时候都已经链接到EXE中了,那么就不能起到减小EXE文件大小的作用了。使用动态DLL可以参考例子:
    http://www.vckbase.com/document/viewdoc/?id=543
      

  3.   

    主要是现在有个程序,需要在静态库中动态创建各种对话框,对于静态库的使用者不需要知道具体是创建了什么,这由静态库来管理,这样有利于程序的模块化,所以有关对话框的信息及资源需要在静态库里管理。
    当然以后如果需要将之变成动态库不会太复杂,但现在就是想用静态库。按照楼主所说,在内存中动态创建Dialog的模板来达到在静态链接库中创建对话框的要求的话,其实CDialog::DoModal()函数内部本身也是通过类似的方法实现的,既然这样找不到资源模板,那为什么在静态库的代码中显式调用就能实现了呢?
    疑问?
      

  4.   

    其实也就是在静态库的调用者(即主程序)中使用静态库中的资源ID,假如在静态库中创建一个资源ID:110,在静态库中调用110时,在运行时却发现是在主程序的资源列表中去找110,如果找到了,则成功,找不到则失败。真不明白为什么静态库中的资源无法链入主程序呢?
      

  5.   

    你可以将源代码发到:[email protected]吗?共同学习,呵呵。
      

  6.   

    不只到是不是这个原因,你在创建对话框前加上这个试一下
    AFX_MANAGE_STATE(AfxGetStaticModuleState());