DLL导出对话框技术要点

来源:互联网 发布:banner请求网络图片 编辑:程序博客网 时间:2024/06/06 05:29

  以前有写过,但是忘记了,这次又浪费了很多时间,现在写下来加深印象。

1.新建DLL工程,选择类型为"Regular Dll using shared MFC DLL";

2.将已有MFC工程的资源导入
  方法一:拷贝resource.h中相应的控件定义,再拷贝.rc文件中的对话框资源到当前DLL工程的.rc文件中;
  方法二:通过project->add to project->files选择对应工程的.rc文件,再用Ctrl+c/v将需要的控件拷贝进来。
3.将已有工程的实现代码及需要的相关代码拷贝到当前DLL中
   警告:带有APP类的头文件和实现文件不要拷贝,将其他文件中引用此文件的地方修改为当前xxxdll.h
         否则会造成成功生成DLL,但是调用失败,原因是APP类中有Initinstance为程序入口,而DLL工程本身也有程序入口,从而产生冲突。
注意:多个基于对话框的MFC程序通过一个DLL导出时可能会因为控件ID冲突而发生错误,因此为避免这个问题,写对话框程序的时候一定要给每个控件赋予一个有意义的ID号,以免造成冲突而不可用。 
4.在xxxdll.cpp中编写导出函数
  形如:
extern "C" __declspec(dllexport) char* CORGDlg_RtnString()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CCORGDlgDlg dlg;
dlg.DoModal ();
char p[1024];
strcpy(p, dlg.infoStr.GetBuffer(0));
return p;
}  
5. DLL文件的使用
生成文件后,可以用工具查看是否生成了正确的导出函数。
使用举例如下:
HINSTANCE hmod;
hmod =::LoadLibrary("OrgPidPlsrDlgDLL.dll");// CPLSYDlgDLL.dll CPSerialDll CPWMDlgDLL.dll CPLSR2DlgDLL.dll
if(hmod==NULL)
{
AfxMessageBox("Fail");
return;
}
CString strtest;
char str[1024];
memset(str, 0, 1024);
/*****************CORGDlg*********************/
#if 1
// 不传初始化配置,直接打开对话框进行设置后并返回
typedef const char* (*CORGDlg)();//定义函数指针类型
CORGDlg RtnString = (CORGDlg)GetProcAddress(hmod, "CORGDlg_RtnString");//获取函数void的地址
strcpy(str, RtnString());
strtest.Format("%s", str);
AfxMessageBox(str);


// 传递初始化配置,根据配置打开对话框,用户进行配置后再返回
CString iniStr = "initial string";
typedef const char* (*IniCORGDlg)(CString inistr);//定义函数指针类型
IniCORGDlg iniAdnRtn = (IniCORGDlg)GetProcAddress(hmod, "CORGDlg_InitialAndRtn");//获取函数void的地址
strcpy(str, iniAdnRtn(iniStr));
strtest.Format("%s", str);
AfxMessageBox(str);
#endif
FreeLibrary(hmod);