1

BPL からエクスポートされる関数 (以下に簡略化) を持っている

function DoA(amount: currency; var Info: string): Currency; stdcall;
 begin
  result := amount * 19;
  Info:= 'Some Text about the result';
 end;

LoadPackage を使用してメイン プログラムからロードされ、GetProcAddress は他の関数に対して正常に機能します。しかし、これは呼び出されたときに多くのエラーを引き起こします。

BPL とともに使用されます (簡略化)

  bplhandle: HModule;
  BPLDoA: function (amount: currency; var Info: string): Currency; stdcall;
  intoStr : string;

.

 begin
  bplhandle:=LoadPackage('test.bpl');
   if bplhandle <> 0 then
    begin
     @BPLDoA:=GetProcAddress(bplhandle,'DoA');
       if assigned(BPLDoA) then
       result := BPLDoA(123, intoStr);
    end;
 end;

プロシージャの最後に発生するように見える例外ですが、修正されたテキストは intoStr に返されます (ブレーク ポイントで表示)

エラーは、Info パラメータが var および/または文字列であることと関係がありますか?

エラーメッセージは

プロジェクト Project1.exe で例外クラス EInvalidPointer が発生し、「無効なポインター操作」というメッセージが表示されました

ありがとう

詳細 > 同じ bpl/ユニットからの別の機能は正常に動作します

function DoB(amount: currency): Currency; stdcall;
  result := amount * 19;
 end;

マッドエクセプト>

例外クラス: EInvalidPointer 例外メッセージ: 無効なポインタ操作です。

メイン スレッド ($1b7c): 0040276f +013 Project1.exe システム @FreeMem 00404650 +01c Project1.exe システム @LStrClr 00483814 +15c Project1.exe Unit1 97 +11 TForm1.Button3Click 00462430 +064 Project1.exe コントロール TControl.Click 0045a870 + 01c Project1.exe StdCtrls TButton.Click

4

3 に答える 3

6

EXE プロジェクトを "ランタイム パッケージでビルド" するように構成していません。プロジェクトオプションの「パッケージ」セクションでそれを見つけてください。(ドキュメンテーション)

EInvalidPointer例外は、メモリ マネージャーが割り当てられていないものを解放しようとしたときに発生しますこれは、2 つの異なるメモリ マネージャーがアクティブになっていることを示しています。BPL は、パッケージの「必須」リストに表示される RTL パッケージのものを使用しています。一方、EXE は、EXE モジュールにコンパイルされたメモリ マネージャーを使用しています。

ランタイム パッケージを使用するように EXE に指示することでこれを修正し、RTL パッケージが必要なパッケージのリストにあることを確認します。

于 2009-11-09T06:38:15.163 に答える
1

インポート宣言は、エクスポートされた関数のシグネチャと正確に一致していますか?

次のようにする必要があります。

DoAProc: function (amount: currency; var Info: string): Currency; stdcall;
于 2009-11-09T05:37:43.587 に答える
0

追加の BPL (メインの exe がランタイム BPL を使用しているため) を出荷する必要がない場合の別のオプションは、ShareMem ユニットをプロジェクトに含めることです。Delphi ヘルプ ファイルの「共有メモリ」トピックを参照してください。

ms-help://embarcadero.rs2010/rad/Sharing_Memory.html

于 2009-11-09T19:04:51.527 に答える