在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类,也是一样的错误。

请问各位大虾,是什么问题
...全文
201 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
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

602

社区成员

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

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