怎么把一个工程(里面带有多个对话框)做成DLL,调用后显示主界面?1.我的MFC EXE工程已经写好了,里面有多个对话框和多个类,其中一个主类——CTestDlg是主界面的对话框类显示主界面
CTestDlg dlg;
dlg.DoModal();2.怎么把这个工程做成DLL,导出CTestDlg类,在测试程序里面使用这个——
CTestDlg dlg;
dlg.DoModal();
来显示主界面呢。类可以通过往工程中添加文件加进去,资源(对话框和图标)怎么导入到DLL工程中呢?
CTestDlg dlg;
dlg.DoModal();2.怎么把这个工程做成DLL,导出CTestDlg类,在测试程序里面使用这个——
CTestDlg dlg;
dlg.DoModal();
来显示主界面呢。类可以通过往工程中添加文件加进去,资源(对话框和图标)怎么导入到DLL工程中呢?
太累了啊。
还不如重新作个dll,把需要的类和函数加进去。
在新的EXE中需要加入CTestDlg的类定义,把dllexport改成dllimport,并包含原有项目的resource.h(或其中用到的定义),导入对应的lib文件。在调用对话框时,需要先调用AfxSetResourceHandle把dll句柄设置为默认资源句柄。感觉这样就差不多了,先试试吧。
我以前的工程是基于对话框的,里面有TabCtrl,并有多个页面。显示主界面的代码在App类中呢,我怎么删除?BOOL CPropertySheetTestApp::InitInstance()
{
AfxEnableControlContainer(); // Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif CPropertySheetTestDlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: Place code here to handle when the dialog is
// dismissed with OK
}
else if (nResponse == IDCANCEL)
{
// TODO: Place code here to handle when the dialog is
// dismissed with Cancel
} // Since the dialog has been closed, return FALSE so that we exit the
// application, rather than start the application's message pump.
return FALSE;
}
warning C4273: 'protected: static struct AFX_MSGMAP const CPropertySheetTestApp::messageMap' : inconsistent dll linkage. dllexport assumed.你把现有工程中CWinApp类InitInstance中的显示对话框的相关代码删除,最后返回TRUE。再把CTestDlg类定义改为:class __declspec(dllexport) CTestDlg : public CDialog,在项目设置中把输出文件改为dll。
-----------------------------------------------------
做了这些工作后出现以上错误,未完
你原本的CTestDlg是从CDialog类派生的吗?
错误信息都是警告还是也有错误?
------------------------------
是的
你先只改class __declspec(dllexport) CTestDlg : public CDialog这一行,其它都维持原状不变试试,如果出错在到对应代码上看看可能是什么原因。
c:\documents and settings\gpw\桌面\test\propertysheettestdlg.h(11) : fatal error C1083: Cannot open include file: 'TabPage1.h': No such file or directory需要我第一个属性页类的头文件,是不是需要把CTestDlg类用到的所有分页类的头文件都加进来?
还有这个怎么用——AfxSetResourceHandle麻烦了。
AfxSetResourceHandle(LoadLibrary("这个DLL"));
CPropertySheetTestDlg dlg;
dlg.DoModal();
HINSTANCE ins = LoadLibrary("PropertySheetTest.dll");
if (ins != NULL)
{
AfxSetResourceHandle(ins);
}
----------------------------------------------------------
以上都好着呢,到了下面这句的时候,Debug报 CPropertySheetTestDlg dlg;
DLL和EXE都用Release编译执行一下试试。
报了好多这个东西——error LNK2001: unresolved external symbol "public: virtual __thiscall ConfigPage1::~ConfigPage1(void)" (??1CLinkConfig@@UAE@XZ)这些都是我CTestDlg主界面中的分页
if (ins != NULL)
{
AfxSetResourceHandle(ins);
} CPropertySheetTestDlg dlg;
dlg.DoModal();
具体错误信息是什么?
DLL用Debug编译应该可以跟踪到CPropertySheetTestDlg的构造函数里面。
这是没有把DLL里面的类导出吧~~
-------------------------------------------------------这个怎么导入?
你用Debug编译F5执行,报错的时候选择重试,看一下具体停在那一行,判断一下是哪个指针出了问题,然后再根据代码分析是哪一步导致了这个错误。(都是看MFC的代码)
1、首先要生成一个*.ogx的文件。
方法:打开包含有所要加的对话框资源的工程。
在视图资源中鼠标右键点击所需的对话框的类
这时,你会看到右键菜单中有个“add to gallery”的选项。
选择这个选项,则*.ogx文件生成。
生成的文件名会类似你的对话框的类名,只不过中间会多出一些空格
一般情况下是:
c:\program files\microsoft visual studio\common\msdev98\gallery
\[你的工程名] 目录下
2、接着就是insert这个*.ogx的文件。
也就是insert这个对话框资源和这个对话框类
打开所要加入的工程,选择
project->add to project->components and controls...
这时打开的是一个对话框,默认的打开目录就是:
c:\program files\microsoft visual studio\common\msdev98\gallery
在对话框中选择进入“你的工程名”的目录,你就会看到那个 *.ogx的文件,
选择它,然后insert. 最后关闭对话框。
这时你就会看到那个对话框的类已经出现在你的工程中,
再到资源resourceview中的dialog中看看吧,那个对话框的资源已经出现。
是com
将需要的所有资源写成dll控件
然后test的时候新建MFC APPWizard[exe]工程
拖个button测试
在OnButtonClick的地方添加
void CTestModuleDllDlg::OnButton1()
{
// TODO: Add your control notification handler code here
typedef void (WINAPI * TESTDLL)();
HINSTANCE hmod;
hmod = ::LoadLibrary ("你的dll文件路径.dll");
if(hmod==NULL)
{
AfxMessageBox("Fail");
}
TESTDLL lpproc;
lpproc = (TESTDLL)GetProcAddress (hmod,"Show");
if(lpproc!=(TESTDLL)NULL)
(*lpproc)();
FreeLibrary(hmod);
}
*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) http://www.cnblogs.com/feiyun0112/archive/2006/09/20/509783.html
*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) http://www.cnblogs.com/feiyun0112/archive/2006/09/20/509783.html
*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) http://www.cnblogs.com/feiyun0112/archive/2006/09/20/509783.html