下記のコードを参照してください。 Delphi XE3で動作しています。
unit Unit1;
interface
uses Vcl.Forms;
procedure Test(); stdcall;
exports
Test;
implementation
procedure Test();
var F : TForm;
begin
F := TForm.Create(nil);
F.ShowModal;
F.Release;
end;
end.
試験BPL計画Unit1.pas
// Package declaration
package Package1;
{$R *.res}
{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users}
{$ALIGN 8}
{$ASSERTIONS ON}
{$BOOLEVAL OFF}
{$DEBUGINFO ON}
{$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,
vcl;
contains
Unit1 in 'Unit1.pas';
end.
ユニット。 1つのTButtonで1つのTformのみが含まれます。 (Package1.bplがProject1.exeのと同じディレクトリにある)
unit Unit2;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm2 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
type
TProcTest = procedure;
var
PackageModule: HModule;
proc : TProcTest;
begin
PackageModule := LoadPackage('Package1.bpl');
if PackageModule <> 0 then
begin
@Proc := GetProcAddress(PackageModule, 'Test');
if @Proc <> nil then
Proc;
UnloadPackage(PackageModule);
end;
end;
end.
私は、Delphi XE7にあなたのコードを試してみましたが、それが動作します。あなたのプロジェクトは、パッケージをコンパイルするために使用されたものと同じDelphiバージョンを使用してコンパイルされていますか?そうでなければ、私は確信が持てませんが、うまくいかないと思います。 – Hwau
これは、パッケージから機能をエクスポートする方法ではありません。パッケージは、暗黙的にリンクされたときに最も効果的です。ここでデモンストレーションする機能を公開する場合は、DLLを使用します。ほとんどの場合、コードをモジュールに分けて、複雑さや問題を導入する必要はありません。すべてのコードを1つの実行可能ファイルに入れます。 –
Delphiのコマンドライン[TDUMP.EXE](http://docwiki.embarcadero.com/RADStudio/en/TDUMP.EXE,_the_File_Dumping_Utility)ユーティリティを使用して、エクスポートされている* exact *名前を表示してからコピーできますその名前を 'GetProcAddress()'呼び出しに追加します。 –