使用ACE_DLL 进行操作碰到的问题

cy721 2008-11-13 10:23:16
我最近在学习使用ACE_DLL动态加载链接库。。
写了个程序代码如下:
int main(int argc, char *argv[])
{
ACE_DLL *m_pAceDll = new ACE_DLL;
int errorCode = m_pAceDll->open("Link",ACE_DEFAULT_SHLIB_MODE,1);
if(0 != errorCode)
{
cout <<"Fail to open the dll file!" <<endl;
}
Test* pdll=(Test*)m_pAceDll->symbol("ClassInterface");
pdll->output();

return 1;

}
在执行的时候总是会报ACESS VIOLATION 的错误
那个output()函数没有执行成功。。

请大家帮我看下代码,那里写错了
...全文
457 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
cy721 2008-11-13
  • 打赏
  • 举报
回复
好,谢谢,分给你了
xhs_lh04 2008-11-13
  • 打赏
  • 举报
回复
symbol返回的指针,是指向你定位的函数地址
你当然要用函数去调用
pdllfunc这是函数指针,那调用当然要加()
cy721 2008-11-13
  • 打赏
  • 举报
回复
typedef DLLFUNC Point* (*pfunc)()
改成typedef Point* (*DLLFUNC)() 就可以了
Point *point = pdllfunc(); 但是不明白为什么pdllfunc要加括号
xhs_lh04 2008-11-13
  • 打赏
  • 举报
回复
Test* pdll=(Test*)m_pAceDll->symbol("ClassInterface");


====>
至少也应该这样调吧
typedef DLLFUNC Point* (*pfunc)()

DLLFUNC pdllfunc =(DLLFUNC)m_pAceDll->symbol("ClassInterface");
if (pdllfunc ==NULL)
{
...
}
Point *point = pdllfunc();
point->output();

cy721 2008-11-13
  • 打赏
  • 举报
回复
而且我的pdll不为空
cy721 2008-11-13
  • 打赏
  • 举报
回复
我在我的DLL里定义的接口是个函数啊

class Point:public Test
{
public:
virtual void output();
virtual void rest();

};


Point* ClassInterface()
{
return new Point();
}
hhyttppd 2008-11-13
  • 打赏
  • 举报
回复
up楼上.
Test* pdll=(Test*)m_pAceDll->symbol("ClassInterface");
//此处取回的pdll必然为NULL
//所以会产生“解引用空指针错误”(pdll->output();)

正解的做法如楼上所言,做一个对象工厂函数.
extern "C"
Test* CreateObject()
{
return new Test();//?
}

Test* pdll=(Test*)m_pAceDll->symbol("CreateObject");
if(pdll) pdll->output();

xhs_lh04 2008-11-13
  • 打赏
  • 举报
回复
你可以参照一下ACE自带的ACE_DLL静态方式的调用例子
$ACE_ROOT/tests/Based_Pointer_Test_Lib.cpp及Based_Pointer_Test.cpp
xhs_lh04 2008-11-13
  • 打赏
  • 举报
回复
Test 是你定义的什么?类吗?
Test* pdll=(Test*)m_pAceDll->symbol("ClassInterface");
这样转是不行的
在你的库里应该定义的接口是一个函数
在这里定位到的应该是一个函数
调用函数再返回一个类的实例指针



65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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