代码之家  ›  专栏  ›  技术社区  ›  Vibeeshan Mahadeva

不带运行时包生成的delphi exe和dll

  •  0
  • Vibeeshan Mahadeva  · 技术社区  · 15 年前

    在上一个项目中,我在delphi应用程序中使用了许多框架,因此我决定创建dll并将它们放在dll中(都是在delphi中创建的)

    我浏览了很多网站,找到了有效的代码,但在这个例子中,我必须用 使用运行时包生成

    这是我找到的密码

    在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;
    

    仅此而已,我希望此代码在没有运行时包的情况下运行

    1 回复  |  直到 15 年前
        1
  •  7
  •   Rob Kennedy    15 年前

    太糟糕了。如果没有运行时包,该代码将无法工作。(和 具有 LoadPackage 而不是 LoadLibrary .)

    如果没有包,程序的每个模块(EXE和每个DLL)都有自己的所有标准类的定义副本,包括 TFrame , TWinControl ,甚至 TObject . 一个 EXE中的类看起来不像 到动态链接库。

    如果您真的不使用运行时包,则需要更改DLL的接口,使其不共享任何Delphi对象类型。而不是 双控 父级,传递控件的 Handle 财产,或任何其他 HWnd 用作父窗口的值。DLL代码将不能再假定父对象有Delphi对象,EXE也不能假定它接收的控件是Delphi对象;它们将被限制为使用Windows API操作窗口句柄和发送消息。