
图三
如图一和图二所示,通过MFC AppWizard(dll)输入DLL程序的名称"DLL"后点击"Finish"按钮生成一个DLL程序的基本结构,其中在运行到图二界面时,我们可以选择第一项按钮"Regular DLL with MFC statically linked" 生成常规静态DLL,也可以选择第二项按钮"Regular DLL using shared MFC DLL"生成常规动态DLL,后者的体积远远小于前者。现在的任务是在运行DLL时弹出一个显示"This is My DLL"字样的对话框,点击"确定"后返回调用程序。为此,需要在DLL工程中插入一个对话框资源(该对话框类名为CMyDlg),在DLL.cpp程序开头输入以下代码:
| #include "MyDlg.h" |
在DLL.cpp程序最后一行代码"CDLLApp theApp;"后面输入以下代码:
| extern "C" _declspec(dllexport) int MyTest() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); CMyDlg dlg; dlg.DoModal(); return 0; } |
对DLL编译后生成DLL.dll程序。
然后,进入主程序TestDll,利用ClassWizard对命令按钮代码段添加下列代码:
| void CTestDlg::OnButton1() { // TODO: Add your control notification handler code here typedef int(_cdecl *Connect)(); HINSTANCE hinstDLL=NULL; hinstDLL=LoadLibrary("DLL.dll"); if (hinstDLL) { Connect Proc; Proc = (Connect)GetProcAddress(hinstDLL,"MyTest"); int iTemp = Proc(); FreeLibrary(hinstDLL); } else { AfxMessageBox("Not found dll !"); } } |
为了让TestDll能够调用DLL.dll程序,需要让前者能够"看见" DLL程序。一个Windows程序定位DLL的次序是, 1.包含EXE文件的目录,2.进程的当前工作目录, 3.Windows系统目录, 4.Windows目录,5.列在Path环境变量中的一系列目录。为此,需要将DLL.dll放到上述相关目录中,这样执行主程序TestDll,点击命令按钮就显示以下DLL运行结果,见图四。

图四