【发布时间】:2011-12-27 21:40:01
【问题描述】:
我正在尝试使用 BPL 在 delphi2010 中制作模块化应用程序。 问题是当我尝试在 BPL 中创建类时,我收到此错误消息。
我没有对资源(RES文件)做任何操作!
Procedure TControllerMain.Btn1OnClick(Sender: TObject);
type
TInitProcedure = function: TModuleBaseClass; stdcall;
TModuleBaseClass= class of TModuleBase;
var
h: HMODULE;
proc: TInitProcedure;
vClass: TModuleBaseClass;
begin
h := LoadPackage('test.bpl');
@proc := GetProcAddress(h, 'InitializePlugin');
vClass := proc();
vClass.Create(nil); // error here
UnloadPackage(h);
end;
dll代码
TModuleBase 是一个 TCustomPanel
type
TVLCVideo = class(TModuleBase)
private
...
public
...
end;
function InitializePlugin: TModuleBaseClass; stdcall;
implementation
function InitializePlugin: TModuleBaseClass;
begin
Result := TVLCVideo;
end;
exports
InitializePlugin;
end.
【问题讨论】:
-
在 DFM 流式传输期间会发生这种错误,但前提是
TModuleBase源自TForm、TFrame或TDataModule,而不是源自TCustomPanel。 -
好吧,你能告诉我有没有办法在 dll 中使用组件?我不想创建 ActiveX 组件
-
如果
InitializePlugin()返回的是实例化对象而不是类类型,你是否也有同样的问题?发生错误时调用堆栈是什么样的? -
谢谢 Remy,我用接口解决了这个问题
-
@relative,您能否将解决方案粘贴为答案并自己接受?它可能对未来遇到同样问题的访问者有所帮助。