我得到以下情况:
我想从我的 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 越界”。我会很高兴得到一个快速的答案:)