1

当应用程序和库都编译为 64 位时,动态加载我的库时遇到问题。

以下声明:

intHandle: = LoadPackage (PWideChar (strFileName));

导致以下错误:

Project Project1.exe 引发异常类 EPackageError,并显示消息“无法加载包 F:\New Projects\bpls\exe\Win64\Debug\libs\MinhaLib.bpl。
%1 不是有效的 Win32 应用程序”。

如果我为 32 位重新编译应用程序和库,则一切正常。

我将我的库更改为 DLL 并使用该LoadLibrary()函数。在这种情况下,一切都在 32 位和 64 位中完美运行。

为了使 BPL 库在 64 位中工作,我是否必须对其进行任何更改?

我正在使用德尔福 10.3。

项目1.dpr:

program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
   System.SysUtils, Winapi.Windows;

type
   TMyFunc = function(const intA, intB: Integer): Integer; stdcall;

begin
   try
      var myLib := ExtractFilePath(ParamStr(0)) + 'Lib.bpl';
      var intHandle := LoadPackage(myLib);
      try
         if intHandle <> 0 then
         begin
            var myFnc: TMyFunc := GetProcAddress(intHandle, PWideChar('MyFunction'));
            if @myFnc <> nil then
               Writeln('Result: ', myFnc(5, 5));
         end;

         var strV: string := '';
         Readln(strV);
      finally
         if intHandle <> 0 then
            UnloadPackage(intHandle);
      end;

   except
      on E: Exception do
         Writeln(E.ClassName, ': ', E.Message);
   end;

end.

库.dpk:

package Lib;

{$R *.res}
{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users}
{$ALIGN 8}
{$ASSERTIONS ON}
{$BOOLEVAL OFF}
{$DEBUGINFO OFF}
{$EXTENDEDSYNTAX ON}
{$IMPORTEDDATA ON}
{$IOCHECKS ON}
{$LOCALSYMBOLS ON}
{$LONGSTRINGS ON}
{$OPENSTRINGS ON}
{$OPTIMIZATION OFF}
{$OVERFLOWCHECKS OFF}
{$RANGECHECKS OFF}
{$REFERENCEINFO ON}
{$SAFEDIVIDE OFF}
{$STACKFRAMES ON}
{$TYPEDADDRESS OFF}
{$VARSTRINGCHECKS ON}
{$WRITEABLECONST OFF}
{$MINENUMSIZE 1}
{$IMAGEBASE $400000}
{$DEFINE DEBUG}
{$ENDIF IMPLICITBUILDING}
{$IMPLICITBUILD ON}

requires
  rtl;

contains
  Unit1 in 'Unit1.pas';

end.

单元1.pas:

unit Unit1;

interface

function MyFunction(const intA, intB: Integer): Integer; stdcall;

implementation

function MyFunction(const intA, intB: Integer): Integer;
begin
   Result := intA + intB;
end;

exports
   MyFunction;

end.
4

0 回答 0