2010-10-21 88 views
0

因为我用我的Delphi应用程序许多帧我的最后一个项目,所以我决定要创建的dll并把它们的动态链接库(Delphi中所有已创建)德尔福exe文件和dll不与运行时包建立

我有内部通过许多网站,并提出了可用的代码,但对于这个例子,我必须编译构建与运行包这两个应用程序和dll,这意味着我必须分发bpls也。如果不要检查建立与运行软件包的错误来了

这是我在DLL中找到

在EXE

procedure TForm1.Button1Click(Sender: TObject); 
type 
TGetTheFrame =Function(Owner: TComponent; TheParent: TWinControl): TFrame; stdcall ; 
var 
    GetTheFrame : TGetTheFrame; 
begin 
try 
    GetTheFrame(application,TabSheet1).Free ; 
except 
end; 
frm := GetTheFrame(application,TabSheet1) ; 
dllHandle := LoadLibrary('project1.dll') ; 
    if dllHandle <> 0 then 
    begin 
    GetTheFrame := GetProcAddress(dllHandle, 'GetTheFrame') ; 
    frm := GetTheFrame(application,TabSheet1) //call the function 
    { ShowMessage('error function not found') ; 
    FreeLibrary(dllHandle) ; } 
    end 
    else 
    begin 
    ShowMessage('xxxx.dll not found/not loaded') ; 
    end 

Function GetTheFrame(Owner: TComponent; TheParent: TWinControl): TFrame; stdcall; 
Begin 
Result := TFrame2.Create(Owner); 

Result.Parent := TheParent; 
End; 

这就是所有的代码,但我想这个代码没有运行时包的工作

+0

但我确定代码是好的,因为它与runtimw = e软件包一起工作 – VibeeshanRC 2010-10-21 12:43:32

+1

第一个GetTheFrame调用的目的是什么?如果它的目的是做任何事情,而不是随意地摧毁你的记忆,那么你就错了。编译器应该警告你在那里使用一个未初始化的变量。 – 2010-10-21 12:50:32

+0

在你之前的问题中看到我的答案:http://stackoverflow.com/questions/3985256/how-to-use-delphi-dlls-without-enabling-build-with-runtime-packages我认为这个问题是重复的。 – 2010-10-21 12:52:36

回答

7

太糟糕了。没有运行时软件包,该代码将无法运行。 (和运行时软件包,你应该使用LoadPackage,而不是LoadLibrary

没有包,你的程序(EXE和每个DLL)的每个模块都有自己的所有标准类的定义副本包括TFrame,TWinControl,甚至TObject。来自EXE的TWinControl类看起来不像DLL的TWinControl

由于您在模块之间共享类,您需要确保它们都具有与这些类相同的定义,并且运行时包是您如何做到的。

如果你真的不会使用运行时包,那么你需要改变你的DLL的接口,所以它不共享任何Delphi对象类型。而不是TWinControl父项,传递控件的Handle属性或任何其他HWnd值作为父窗口。 DLL代码将无法再假定父对象有一个Delphi对象,并且EXE将无法假定它接收的控件是一个Delphi对象;他们将被限制为使用Windows API来操作窗口句柄并发送消息。

+0

那么我现在可以做什么 – VibeeshanRC 2010-10-21 13:33:10

+0

该句柄可以作为参数传递并作为DLL内部函数的结果返回。 – skamradt 2010-10-21 16:10:16