dll导出类的构造函数为什么没被调用

ZSP95 2011-08-25 05:17:35
一个dll工程中使用_declspec(dllexport)修饰一个类使之成为导出类(便于在另外的工程中引用该类),

在另外一个程序里动态载入(LoadLibrary+GetProcAddress)该dll并获取其导出类以及成员函数,

但是在调用时却发现无法调用到该dll的导出类的构造函数,无论是显式或隐式,

结果造成了该导出函数的成员函数调用时会出错--因为该导出类的一些成员变量引用为空 尤其是指针时 导致程序崩溃 .

经过两天的研究和查找 始终没能解决之 发帖于此 希望高手能给予解答 !!!
...全文
501 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
myiszjf 2013-09-28
  • 打赏
  • 举报
回复
楼主,我想请问,这问题您解决了没有!我也遇到了这问题,纠结了好久了!
zlz66668888 2013-07-15
  • 打赏
  • 举报
回复
可以参看http://blog.csdn.net/maxttyl/article/details/1537023,我在下面加了一点补充注释。
shesui 2012-07-23
  • 打赏
  • 举报
回复
我也遇到同样的问题,引用一个dll,却没办法实例化
ZSP95 2011-09-15
  • 打赏
  • 举报
回复
各位 由于源码 太多 好多个文件 不方便 贴出来 !

看了各位的贴子 :

11楼 7楼 所说的那些细节 我都是严格按照微软MSDN网站上的建议实现的 没有什么出入

4楼所说的 我发帖之前就试验过 没用 问题照样出现 .

其余的全都太笼统了 没什么帮助

这个问题 跟踪过后 发现根本不是 调用格式 或者 定义,引用函数什么的语法错误 .

一直到现在都没解决 幸好现在 修改方案了 不用这样调用这个dll了 用了其他的dll(该dll又调用了出错的那个dll)代替 之后没有发现问题

真是奇了怪了 ! 还在一直研究中 有结果 我会发帖在我的空间上 谢谢各位了.

qiuxin315 2011-08-25
  • 打赏
  • 举报
回复
楼主源码大吗?建议放出源码,高手一看便知有没有问题
hxingz 2011-08-25
  • 打赏
  • 举报
回复
定义导出类时,应该判断是否在导出类的dll中,如果是则导出,如果不是则导入。如

#ifdef _MYDLL
#define DLLEXPT __declspec(dllexport)
#else
#define DLLEXPT __declspec(dllimport)
#endif

class DLLEXPT x
{
//……
};

这样就只能隐式链接,需要头文件,lib文件,并且将lib文件链接到工程中。
xaojin2011 2011-08-25
  • 打赏
  • 举报
回复
类不能显示加载dll ,很麻烦, 改成隐世加载dll, 楼主,懂了不?


一叶之舟 2011-08-25
  • 打赏
  • 举报
回复
如果用导出类,最好用静态连接方式,通过lib文件使用动态库,
如果使用LoadLibrary+GetProcAddress方式,最好导出一个createobj函数,通过导出函数去创建类对象。
wickyboy 2011-08-25
  • 打赏
  • 举报
回复
有可能是因为DLL堆的管理跟主程序中的堆不一样,这个地方导致的指针引用问题。
至善者善之敌 2011-08-25
  • 打赏
  • 举报
回复
函数调用约定导致的常见问题
  如果定义的约定和使用的约定不一致,则将导致堆栈被破坏,导致严重问题,下面是两种常见的问题:

  函数原型声明和函数体定义不一致
  DLL导入函数时声明了不同的函数约定
  以后者为例,假设我们在dll种声明了一种函数为:

  __declspec(dllexport) int func(int a,int b);//注意,这里没有stdcall,使用的是cdecl
  使用时代码为:

  typedef int (*WINAPI DLLFUNC)func(int a,int b);
  hLib = LoadLibrary(...);

  DLLFUNC func = (DLLFUNC)GetProcAddress(...)//这里修改了调用约定
  result = func(1,2);//导致错误

  由于调用者没有理解WINAPI的含义错误的增加了这个修饰,上述代码必然导致堆栈被破坏,MFC在编译时插入的checkesp函数将告诉你,堆栈被破坏
luciferisnotsatan 2011-08-25
  • 打赏
  • 举报
回复
http://www.codeguru.com/cpp/w-p/dll/importexportissues/article.php/c123/
看看这个对你有用没。
ouyh12345 2011-08-25
  • 打赏
  • 举报
回复
把初始化工作放在Init函数里
luciferisnotsatan 2011-08-25
  • 打赏
  • 举报
回复
用(LoadLibrary+GetProcAddress)这方法调C++风格的函数很麻烦。

你可以建个全局的Create函数,返回类对象。
gykgod 2011-08-25
  • 打赏
  • 举报
回复
用depends工具看看
  • 打赏
  • 举报
回复
导出类的话 ,不要使用(LoadLibrary+GetProcAddress)这种方式调用。
gykgod 2011-08-25
  • 打赏
  • 举报
回复
extern "c"没有

保证导出的函数是原型

65,186

社区成员

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

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