現在のコードでの宣言も必要とする 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 の書き込み。プロセスが停止しました。実行の設定を使用して続行します。
そして、私はこの問題について何の手がかりも持っていません.私はすでにほとんどすべてを変更しようとしましたが、解決策が得られませんでした. 誰かが私を助けてくれれば幸いです。