私は次のような状況になりました:
Pascal プログラムから C 関数を呼び出したい。C 関数は、渡されたポインターに値を入力する必要があります。
C関数は次のとおりです。
DLLEXPORT int dpstate_callPluginFunction(const char* plugin, const char* function, bool synchronous, const char* p0, const char* p1, const char* p2, const char* p3, const char* p4, const char* p5, const char* p6, char** o0, char** o1, char** o2, char** o3, char** o4, char** o5, char** o6)
「p」パラメータは入力パラメータで、「o」パラメータは出力パラメータです。次のように、Pascal プログラムで関数を呼び出そうとしています。
C 関数呼び出し宣言:
var dpstate_callPluginFunction: function(plugin, method: PAnsiChar; synchronous: boolean; p0, p1, p2, p3, p4, p5, p6: PAnsiChar; o0, o1, o2, o3, o4, o5, o7: PPAnsiChar): integer; cdecl;
C 関数呼び出しの読み込み:
@dpstate_callPluginFunction:= GetProcAddress(mConnectorLibrary, 'dpstate_callPluginFunction');
関数呼び出し宣言:
function callPluginFunction(plugin, method: PAnsiChar; synchronous :boolean; param, returnParam:array of PAnsiChar): integer;
関数を呼び出す関数:
procedure TForm1.btn_pluginFunctionClick(Sender: TObject);
var param, returnParam: array of PAnsiChar;
begin
SetLength(param, 7);
SetLength(returnParam, 7);
param[0]:= 'Param1';
param[1]:= 'Param2';
connector.callPluginFunction('dpserverplugin', 'showconfigdialog', true, param, returnParam);
output.Append(returnParam[0]);
output.Append(returnParam[1]);
end;
関数:
function PConnect.callPluginFunction(plugin, method: PAnsiChar; synchronous :boolean; param, returnParam:array of PAnsiChar): integer;
var i, error: integer;
var p: array[0..6] of PAnsiChar;
var o: array[0..6] of PPAnsiChar;
begin
for i:=0 to 6 do
p[i]:= param[i];
dpstate_callPluginFunction(plugin, method, synchronous, p[0], p[1], p[2], p[3], p[4], p[5], p[6], @o[0], @o[1], @o[2], @o[3], @o[4], @o[5], @o[6]);
for i:=0 to 6 do
if o[i] <> Nil then
returnParam[i]:= o[i]^;
end;
私の問題は、出力「returnParam」に常に「範囲外のアドレスxxxxxx」が含まれていることです。迅速な回答に満足しています:)