设计问题:如何调用一个DLL接口

yanjinbin0 2009-03-25 06:32:00
应用程序想这样做,动态载入DLL文件,DLL接口是一样的,
假设接口是:MyDlg() ,就是简单的一弹出对话框.

然后发现一个DLL就添加一个菜单项到CMainFrame的菜单栏里面.

#define IDM_START 24000
CMenu *pMenu=this->GetMenu();
pMenu->GetSubMenu(0)->AppendMenu(MF_STRING,IDM_START+1,"添加菜单名1"); /*发现一个DLl就添加一个菜单*/

注册一个范围的消息响应函数:
ON_COMMAND_RANGE(IDM_START,IDM_START+10,mydlg)

响应函数如下:
void CMainFrame::mydlg(UINT id)
{
char str[20];
switch (id)
{
case IDM_START+1:
sprintf(str,"-%d-",id);
MessageBox(str);
break;
case IDM_START+2:
sprintf(str,"-%d-",id);
MessageBox(str);
break;
case IDM_START+3:
sprintf(str,"-%d-",id);
MessageBox(str);
break;
default:
sprintf(str,"-%d-",id);
MessageBox(str);
}
}
但是如何调用那个DLl接口呢?????????????
...全文
367 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
nodiebirdcomeback 2009-03-27
  • 打赏
  • 举报
回复
COM吧,可以帮你解决接口的问题!
yanjinbin0 2009-03-26
  • 打赏
  • 举报
回复
那不是更傻,你不能控制DLL名字.
实际要求,只要你DLL提供一个标准接口如:MyDlg()在程序中就能自动使用.
而不管别的.

谁做过程序的模块化设计,请给点经验.
谢谢。
cnzdgs 2009-03-26
  • 打赏
  • 举报
回复
把DLL的名称定义为连续的数字,例如xxx1.dll、xxx2.dll等,程序中用菜单项ID减去IDM_START,然后格式化字符串,再LoadLibrary,这样就不用switch了。
yanjinbin0 2009-03-26
  • 打赏
  • 举报
回复
我说程序傻,不够智能.
你不要理解错了。
birchlin 2009-03-26
  • 打赏
  • 举报
回复
别人好心回答你,还说别人傻。我看还有谁帮你?
yanjinbin0 2009-03-25
  • 打赏
  • 举报
回复
哎,也就这样吧.

感觉这样做好傻的样子.

谁做过程序的模块华设计啊.我做通讯的,因为要兼容多种协议,所以想把协议都作成一个DLL.
这样不用每次加协议都要重新编译.

但如果是这么傻的办法肯定不能用呢.
cnzdgs 2009-03-25
  • 打赏
  • 举报
回复
typedef BOOL * (*MyDlg_T)(void);

void CMainFrame::mydlg(UINT id)
{
HMODULE lib = NULL;
switch (id)
{
case IDM_START+1:
lib = LoadLibrary(_T("1.dll"));
break;
case IDM_START+2:
lib = LoadLibrary(_T("2.dll"));
break;
}
if (lib != NULL)
{
MyDlg_T pf_MyDlg = (MyDlg_T)GetProcAddress(lib, "MyDlg");
if (pf_MyDlg != NULL)
{
pf_MyDlg();
}
FreeLibrary(lib);
}
}
yanjinbin0 2009-03-25
  • 打赏
  • 举报
回复
不同的菜单ID,映射到不同的DLL,你根据不同的菜单ID,调用不同DLL的MyDlg()
如何映射?????

我现在的解决办法是不同DLL接口命名不同的名字:
例如:
typedef BOOL * (*MyDlg_T)(void);
MyDlg_T pf_MyDlg_1; /*DLL-1接口*/
MyDlg_T pf_MyDlg_2; /*DLL-2接口*/

然后调用的时候:
void CMainFrame::mydlg(UINT id)
{
switch (id)
{
case IDM_START+1:
pf_MyDlg_1(); /*使用DLL-1的接口*/
break;
case IDM_START+2:
pf_MyDlg_2(); /*使用DLL-2的接口*/
break;

}
}

oyljerry 2009-03-25
  • 打赏
  • 举报
回复
不同的菜单ID,映射到不同的DLL,你根据不同的菜单ID,调用不同DLL的MyDlg()
yanjinbin0 2009-03-25
  • 打赏
  • 举报
回复
晕忽忽,什么导出接口的,这些肯定做好的了.多个DLL都有一个接口函数为MyDlg()来显示一个窗体,
但每个DLL显示的窗体不一样.

在说明下:

我是先根据DLL是否装载成功来添加菜单 ---- 也就是说我已经用LoadLibary把DLL装载进来了.
只有装载成功,才会创建关联的菜单项

现在问题是怎么把把这个菜单项目和我装载的DLL提供的MyDlg()接口关联起来.


hust_terry 2009-03-25
  • 打赏
  • 举报
回复
楼上的都对,呵呵。
cnzdgs 2009-03-25
  • 打赏
  • 举报
回复
根据菜单项ID来Load不同的DLL,然后GetProcAddress获取函数地址,再调用函数,最后FreeLibrary。
glacier3d 2009-03-25
  • 打赏
  • 举报
回复
dll里的c函数、类、类方法都可以加__declspec(dllexport)来导出,或用.def文件也行
c++的话,接口用重虚函数也行
oyljerry 2009-03-25
  • 打赏
  • 举报
回复
DLL要dllexport导出对应的接口,然后就可以调用这个接口了

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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