0

現在のコードでの宣言も必要とする DLL (TExecute) に含まれるプロシージャを使用するコンポーネント用のプロシージャを作成しようとすると問題が発生します。したがって、このプロシージャには、評価の処理方法を知るためのパラメーターとしてポインターがあります。次のコードは問題なく動作しますが、このコンポーネントのプライベート変数を使用するには、プロシージャ eval がコンポーネント内にある必要があります。作業コードは次のとおりです。この場合、eval プロシージャはグローバルであることに注意してください。

TExecute = procedure(eval: pointer, var variableArray: double);cdecl
TMyComponent = Class(TComponent)
public
    FHandle: THandle;
    FExecute: TExecute;
    procedure Calculate;

var
    n: integer;
    x: array of double;

procedure eval(var x: double);

implementation
procedure eval(var x:double);
var
    mx: Array[0..200] of double absolute x;
begin
    mx[0]:= 2*mx[0];
end;

TMyComponent.Calculate;
begin
    FHandle:= LoadLibrary(.....);
    FExecute:= GetProcAddress(FHandle, 'main');

    n:=2;
    setlength(x,n);

    FExecute(@eval,x[0]);
end;

次のように TMyComponent 内にプロシージャ eval を配置すると、問題が発生しました。

TExecute = procedure(eval: pointer, var variableArray: double);cdecl
TMyComponent = Class(TComponent)
public
    FHandle: THandle;
    FExecute: TExecute;
    procedure Calculate;
    procedure eval(var x: double);

var
    n: integer;
    x: array of double;



implementation
procedure TMyComponent.eval(var x:double);
var
    mx: Array[0..200] of double absolute x;
begin
    mx[0]:= 2*mx[0];
end;

TMyComponent.Calculate;
begin
    FHandle:= LoadLibrary(.....);
    FExecute:= GetProcAddress(FHandle, 'main');

    n:=2;
    setlength(fx,n);

    FExecute(@TMyComponent.eval,x[0]);
end;

プロジェクトがメッセージで失敗したことがわかりました: 0x65900381f でのアクセス違反: アドレス 0x0000005c の書き込み。プロセスが停止しました。実行の設定を使用して続行します。

そして、私はこの問題について何の手がかりも持っていません.私はすでにほとんどすべてを変更しようとしましたが、解決策が得られませんでした. 誰かが私を助けてくれれば幸いです。

4

1 に答える 1