当应用程序和库都编译为 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.