求助:vs2008中如何创建MFC DLL,外部如何调用?

fengbingchun
博客专家认证
2011-08-23 03:41:55
在vs2008中,按照向导创建完一个基于MFC的动态库,编译成功,向此库中添加一对话框,如何使对话框与此库联系起来?
例如,生成了一个TestDll.dll库,工程名为TestDll,对话框生成的类为CDialogTest,如何使对话框与此库联系起来呢?
是否是在TestDll.h文件中加入对话框的头文件,然后在TestDll.cpp中实现呢?可是这样总是出错。

TestDll.h文件中的类名为CTestDllApp,继承于CWinApp,向导生成时默认生成的。

另外,外部调用它,是通过TestDll.h文件中的函数吗?这样也总是出错。

望高手指点,谢谢!

...全文
858 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
康斯坦汀 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 qunqun2012 的回复:]

很多mfc类 放在dll中,你不用扩展dll,那么你用什么

只能用扩展dll

引用 37 楼 r3000 的回复:

引用 18 楼 fengbingchun 的回复:

引用 16 楼 r3000 的回复:
输出类的DLL最好别用MFC,因为这样的话调用者也必须是MFC扩展DLL方式的。
不用MFC的话,任何类型的VC++的工程都可以调用。题外话。哈哈。


谢谢……
[/Quote]

如果调用DLL者都是MFC程序,那当然要用MFC扩展DLL,但是如果你的DLL不仅
给MFC应用程序调用,还要给Win32SDK,WTL,ActiveX等等调用,那就不要用
MFC扩展DLL。编写DLL的目的是做为若干应用的公用模块,所以,最好还是更通用
些比较好,对于用到的MFC类,关联度不是很大的类可以包装一下再输出,关联很大的
类,为了通用性还是不要用MFC的好。你看C++类库有哪个是基于MFC写的,不是MFC
不好,而是关联度造成的。其实现在WTL+STL+Boost等等要比MFC强大多了。对于开发
更通用的库而言。。。
fengbingchun 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 r3000 的回复:]
引用 18 楼 fengbingchun 的回复:

引用 16 楼 r3000 的回复:
输出类的DLL最好别用MFC,因为这样的话调用者也必须是MFC扩展DLL方式的。
不用MFC的话,任何类型的VC++的工程都可以调用。题外话。哈哈。


谢谢!
那按照你的意思是不是再dll中加入一个.h,.cpp作为外部的接口呢?


理论上是可以的,总之DLL输出不要采用MFC扩展……
[/Quote]

谢谢!
康斯坦汀 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 fengbingchun 的回复:]

引用 16 楼 r3000 的回复:
输出类的DLL最好别用MFC,因为这样的话调用者也必须是MFC扩展DLL方式的。
不用MFC的话,任何类型的VC++的工程都可以调用。题外话。哈哈。


谢谢!
那按照你的意思是不是再dll中加入一个.h,.cpp作为外部的接口呢?
[/Quote]

理论上是可以的,总之DLL输出不要采用MFC扩展DLL,这会限制使用场合,
普通的类放置在DLL中可以被SDK、MFC、WTL等各种方式的应用程序调用。
ndy_w 2011-08-24
  • 打赏
  • 举报
回复
那你就在OnOk里面给m_num赋值啊!
fengbingchun 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 ndy_w 的回复:]
对话框里面的控件/窗口销毁了,也就不可访问了。所以要在EndDialog之前你要把控件内容取出来,放在CDialogTest这个C++类对象中。C++对象在析构前是一直可以访问的,这样你在DoModal结束后可以得到想要的值
[/Quote]
谢谢!
那该如何修改才可以得到想要的值呢?
dlg.DoModal();

m_temp = dlg.m_num;
能够得到正确值,但是我希望在点击ok按钮后才获取值。
ndy_w 2011-08-24
  • 打赏
  • 举报
回复
对话框里面的控件/窗口销毁了,也就不可访问了。所以要在EndDialog之前你要把控件内容取出来,放在CDialogTest这个C++类对象中。C++对象在析构前是一直可以访问的,这样你在DoModal结束后可以得到想要的值
fengbingchun 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 ndy_w 的回复:]
这个是不正常的...domodal应该就返回idok/idcancel之类才对.
[/Quote]

点击idok或者idcancel后,是不是对对话框的所有操作就结束了,对话框中得到的所有值也会全部不存在了呢?对它们的这种关系搞不清楚。
ndy_w 2011-08-24
  • 打赏
  • 举报
回复
晕...我还以为你说的是domodal返回大负数。
dlg.m_num是你自己在对话框消息处理过程中赋值的,如果它是个未初始化的值,你自己检查。看你这用法,dlg要负责把m_num填好的。
fengbingchun 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 ndy_w 的回复:]
??你有没有调用EndDialog?如果没有,要跟踪到MFC代码里了...
[/Quote]

没有调用EndDialog.

我是在添加的.cpp文件中操作的,在对话框类CDialogTest中,有个按钮,点击按钮后成员变量m_num得到一个新值如100,然后点击对话框上的ok按钮,关闭对话框。
在.cpp文件中(非对话框类)有一函数接口, CDialogTest dlg;

if (dlg.DoModal() == IDOK)
{
m_temp = dlg.m_num; }

此时,m_temp的值是个很大负值。
我该如何修改呢?谢谢!
ndy_w 2011-08-24
  • 打赏
  • 举报
回复
这个是不正常的...domodal应该就返回idok/idcancel之类才对.
ndy_w 2011-08-24
  • 打赏
  • 举报
回复
??你有没有调用EndDialog?如果没有,要跟踪到MFC代码里了...
fengbingchun 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 ndy_w 的回复:]
?你说的意思是点了ok后domodal没有返回IDOK是吧?这个不应该啊!
跟踪下看看Domodal到底返回什么了。
[/Quote]

返回的是一个很大的负值。
ndy_w 2011-08-24
  • 打赏
  • 举报
回复
?你说的意思是点了ok后domodal没有返回IDOK是吧?这个不应该啊!
跟踪下看看Domodal到底返回什么了。
fengbingchun 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 ndy_w 的回复:]
直接取啊!CDialogTest是个C++类,即使窗口关闭了,它的成员你还是可以访问的。
[/Quote]

但是一点击对话框中ok,对话框中得到的值就不存在了呀。
if (IDOK == dlg.DoModal())
{
m_num = dlg.GetValue();
}
但是点击完ok后,m_num就是个乱值,
如果 dlg.DoModal();

m_num = dlg.GetValue();
那么m_num能够得到正确的值,
但是我需要点击ok后才需要返回值。该如何修改呢?
ndy_w 2011-08-24
  • 打赏
  • 举报
回复
直接取啊!CDialogTest是个C++类,即使窗口关闭了,它的成员你还是可以访问的。
fengbingchun 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 ndy_w 的回复:]
引用 15 楼 ndy_w 的回复:
或者你不改也行,在exe中,#include “dialogtest.h”之前,随便定义一个IDD_DIALOGTEST。反正exe也不用这个,只是为了编译通过。这种方式好一点,DLL方便修改。

不好意思,先说的那个方法比较简单粗暴。
[/Quote]

没关系,仍旧谢谢你!

我在dll中重新添加了一个.h、.cpp文件,在.h里定义了一个类,里面有些函数用作外部的接口,.cpp里通过domodal调用对话框,然后在对话框中作响应的操作,完成后点击ok,如何才能把操作完的结果传给外部呢?
ndy_w 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 ndy_w 的回复:]
或者你不改也行,在exe中,#include “dialogtest.h”之前,随便定义一个IDD_DIALOGTEST。反正exe也不用这个,只是为了编译通过。这种方式好一点,DLL方便修改。
[/Quote]
不好意思,先说的那个方法比较简单粗暴。
fengbingchun 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ndy_w 的回复:]
删掉enum这一行。
构造函数里用到IDD的地方直接写上IDD_DIALOGTEST。
或者你把IDD_DIALOGTEST的定义从resource.h拷到你的dlg头文件里,总之就是让你的exe避开这个不认识的资源ID.因为这个资源ID是在dll工程里有效,对exe来说没有意义。
在调用的时候也有这个问题,要使用你的dll的HINSTANCE才能正确找到对话框模版。
类似这样:
HIN……
[/Quote]

按照你说的,删掉enum这一行。
构造函数里用到IDD的地方直接写上IDD_DIALOGTEST,这样不会出错,但是新添加的按钮都没有消息响应函数了,怎么解决呢?
fengbingchun 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 qunqun2012 的回复:]
没仔细看帖子,感觉你选择错了

扩展mfc dll是有 入口函数的,对吧,我印象是这样的


你要搞对话框之类, 用 扩展 mfc dll


然后添加类,类是mfc的类, 类的基类选择为:CDialog /CDialogEx





引用楼主 fengbingchun 的回复:
在vs2008中,按照向导创建完一个基于MFC的动态库,编译成功,向此库中添加一对话框……
[/Quote]

谢谢!
扩展mfc dll与一般的mfc dll区别大吗?我只是想通过一个函数调用显示对话框,然后把最终的结果再返回给主程序。
qunqun2012 2011-08-24
  • 打赏
  • 举报
回复
很多mfc类 放在dll中,你不用扩展dll,那么你用什么

只能用扩展dll

[Quote=引用 37 楼 r3000 的回复:]

引用 18 楼 fengbingchun 的回复:

引用 16 楼 r3000 的回复:
输出类的DLL最好别用MFC,因为这样的话调用者也必须是MFC扩展DLL方式的。
不用MFC的话,任何类型的VC++的工程都可以调用。题外话。哈哈。


谢谢!
那按照你的意思是不是再dll中加入一个.h,.cpp作为外部的接口呢?


理论上是可以的,总之DLL输出不要采用MFC扩……
[/Quote]
加载更多回复(21)

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧