在Dll中直接导出窗体类失败

无理蛇 昇捷丰电子 2013-01-26 05:40:00
在BCB 2007中创建一个Dll, (VCL+多线程), 加入一个窗体,加入__declspec( dllexport),让其输出

#ifndef Unit5H
#define Unit5H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class __declspec( dllexport) TForm5 : public TForm
{
__published: // IDE-managed Components
private: // User declarations
public: // User declarations
__fastcall TForm5(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm5 *Form5;
//---------------------------------------------------------------------------
#endif


编译都没有问题,但在应用程序调这个Dll时,New一个对象的时候提示地址访问出错.
TForm5 *frmTemp = TForm5(NULL);

同时,输出线程类也是一样,就是一个线程类继承自TThread类,也是一样的错误。

请问各位大虾,是什么问题
...全文
177 7 点赞 打赏 收藏 举报
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
ARIKA 2013-02-19
在DLL的CPP中

#include "Form5.h"
....
extern "C" int __declspec(dllexport) __stdcall showForm(...)
{
    ...
    TForm5 *frmTemp = new TForm5(NULL);
    ...
    frmTemp->ShowModel();
    delete frmTemp;
}

在使用DLL的时候,只要调用showForm()这个方法就可以
  • 打赏
  • 举报
回复
ARIKA 2013-02-19
为何不把FORM直接放到DLL工程中,在你的DLL对外的函数中new这个窗体然后展现出来呢
  • 打赏
  • 举报
回复
静_海 2013-02-19
ARIKA 正解。DLL 程序在 CB 对象层次和外部是隔离的。外部程序可以取出对象地址,但你不能直接访问。恐怕你那层封装省不了。
  • 打赏
  • 举报
回复
无理蛇 2013-01-28
引用 1 楼 zhanghelpsgz 的回复:
FormStyle设置成fsMDIChild
你这种方法无效呀
  • 打赏
  • 举报
回复
无理蛇 2013-01-28
引用 2 楼 bigfog 的回复:
DLL有独立的栈,创建new或del都放在dll内部,
我试过封装一层,也就是把new\delete放在Dll内部是可以的,但我就是不想把它多此一举的就为了导出而让结构上多封装了一层,有没有更好的办法
  • 打赏
  • 举报
回复
bigfog 2013-01-27
DLL有独立的栈,创建new或del都放在dll内部,
  • 打赏
  • 举报
回复
zhanghelpsgz 2013-01-26
FormStyle设置成fsMDIChild
  • 打赏
  • 举报
回复
相关推荐
发帖
VCL组件使用和开发
加入

588

社区成员

C++ Builder VCL组件使用和开发
申请成为版主
帖子事件
创建了帖子
2013-01-26 05:40
社区公告
暂无公告