我遇到了以下情况:
我想从我的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超出范围”的提示。希望您能快速回答 :)
@o[0]
时,实际上是一个指向PPAnsiChar
的指针。但函数期望的是PPAnsiChar
。所以这是不匹配的。但我们仍然不知道接口契约是什么。描述一下char **
参数的规则。在我看来,你需要大大简化接口才能帮助我们。尝试使用单个char **
参数的版本,并查看是否可以使其正常工作。 - David Heffernan