请教一个动态调用dll的问题,大侠帮忙啊!!!!

skyergg 2010-05-29 07:12:05
我写了一个程序调用多个dll文件,都是自己写的

所有dll文件都需要动态生成一个Menuitem

现在有个问题,如果把生成Menuitem的函数屏蔽掉,就可以加载所有的dll库
如果其中有两个以上dll中有生成Menuitem的函数,就只能加载一个,之后的所有dll都不再显示
断点跟踪是发现dll可以被加载,但GetProcAddress时返回NULL

大侠帮忙啊!!!!!!!!!!!!!!!!!!
...全文
88 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccrun.com 2010-05-30
  • 打赏
  • 举报
回复
每个Dll中的导出函数声明一致吗?
skyergg 2010-05-30
  • 打赏
  • 举报
回复
解决了,initPlug 主窗体和dll中的定义不一致

但为什么是这种情况还是不明白


谢妖哥了
skyergg 2010-05-30
  • 打赏
  • 举报
回复
现在的问题是如果在主函数中屏蔽initPlug的调用,就能正常显示

如果调用initPlug,之后的循环LoadLibrary有返回值,但GetProcAddress的返回值是NULL


skyergg 2010-05-30
  • 打赏
  • 举报
回复
为什么没有人啊!!!!!!!!!!!!!!!!!111


没人遇到过吗???
ccrun.com 2010-05-30
  • 打赏
  • 举报
回复
GetPlugInfo最好在循环中定义.
另外,对于PlugInfo函数的参数,可以用TPlugInfo *
skyergg 2010-05-30
  • 打赏
  • 举报
回复
extern "C" __declspec( dllexport ) bool __stdcall PlugInfo(TPlugInfo &PlugInfo)
{

if(&PlugInfo != NULL) {
PlugInfo.Name = "皮肤插件";
PlugInfo.Version = "1.0.0";
PlugInfo.ProgLng = bcb60;
return true;
}
else {
return false;
}
}

麻烦妖哥了
skyergg 2010-05-30
  • 打赏
  • 举报
回复
不好意思,说错了

都可以正常load,只是在GetProcAddress时返回NULL
skyergg 2010-05-30
  • 打赏
  • 举报
回复
函数是循环load dll的,如果读到的一个dll中initplug函数有Menuitem可以正常加载,但之后的所有load返回都为NULL

如果没有Menutiem可以正常读取所有的dll文件
ccrun.com 2010-05-30
  • 打赏
  • 举报
回复
看你的代码,每个Dll中都有一个名为PlugInfo的导出函数?该函数原型是什么?
每一次的LoadLibrary是否成功?
skyergg 2010-05-30
  • 打赏
  • 举报
回复
extern "C" __declspec( dllexport )
void __stdcall InitPlug(TMenuItem *NewItem, LPVOID lpReserved)
{
//插件内容
TMenuItem *NewItem1 = NULL;
NewItem1 = new TMenuItem(NewItem);
NewItem1->Caption = "ghghgfhf";
NewItem->Add(NewItem1);

}
//---------------------------------------------------------------------------
skyergg 2010-05-30
  • 打赏
  • 举报
回复
do{
tmp = sPath+sr.Name;
hInsts = LoadLibrary(tmp.c_str()); //加载DLL文件
GetPlugInfo = (TGetPlugInfo)GetProcAddress(hInsts,"PlugInfo");
if (GetPlugInfo!=NULL) { //得到入口地址
PlugInfo = new TPlugInfo;
GetPlugInfo(*PlugInfo); //提取插件信息
PlugInfo->hInsts = hInsts;
PlugIns_List->Add(PlugInfo); //保存插件信息
///////////////////////////建立菜单///////////////////////////
NewItem = new TMenuItem(TrayIcon_Menu);
NewItem->Caption = AnsiString(PlugInfo->Name);
TrayIcon_Menu->Items->Insert(0, NewItem);
}
}
else {
//加载失败释放
FreeLibrary(hInsts);
}
} while (FindNext(sr) == 0);
skyergg 2010-05-30
  • 打赏
  • 举报
回复
总算有人关注了!!!!!!!!111谢谢妖哥

所有的DLL文件都是用的是一一样的导出函数,


复制的

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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