首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Delphi中使用C函数PyArg_ParseTupleAndKeywords?

如何在Delphi中使用C函数PyArg_ParseTupleAndKeywords?
EN

Stack Overflow用户
提问于 2014-04-19 13:56:30
回答 1查看 467关注 0票数 3

我目前正在使用python4delphi编写Python模块。我想使用标准的C函数ParseTupleAndKeywords

正如您从文档中看到的那样,签名如下:

代码语言:javascript
复制
int PyArg_ParseTupleAndKeywords(PyObject *args, PyObject *kw, const char *format,
    char *keywords[], ...)

现在,这个函数没有包装在python4delphi中,所以我自己添加了它:

代码语言:javascript
复制
PyArg_ParseTupleAndKeywords: function (args, kw: PPyObject; format: PAnsiChar; 
    keywords: array of PAnsiChar {;...}): Integer; cdecl varargs;
....
PyArg_ParseTupleAndKeywords := Import('PyArg_ParseTupleAndKeywords');

我遇到的问题是,当我试图以类似于以下代码段的方式使用它时,我会得到一个访问冲突错误:

代码语言:javascript
复制
function PyScript_MyFunction(pself, args, keywds : PPyObject) : PPyObject; cdecl;
var
  AAA, BBB : PChar;
  kwlist : array[0..2] of PAnsiChar;
begin
  kwlist[0] := 'AAA';
  kwlist[1] := 'BBB';
  kwlist[2] := nil;

  BBB := 'BBB';
  with GetPythonEngine do
  begin
    if (PyErr_Occurred() = nil) and (PyArg_ParseTupleAndKeywords(args, keywds,
        's|s:Script_MyFunction', kwlist, @AAA, @BBB) <> 0) then
    begin
      Result := VariantAsPyObject(MyFunction(AAA, BBB));
    end
    else
      Result := nil;
  end;
end;

//Module is my Python module I am working with

Module.AddMethodWithKeywords('Wrapped', @PyScript_MyFunction, 'no doc');

我怎么才能解决这个问题?有办法调试这样的错误吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-19 14:12:06

keywords参数的转换是不正确的。您使用了Delphi打开数组。Delphi打开数组的结果是传递两件事:数组中最后一项的索引和指向数组第一个元素的指针。Delphi打开的数组根本就不能用于互操作。

您需要像这样声明该参数:

代码语言:javascript
复制
keywords: PPAnsiChar

这是指向PAnsiChar的指针。

按如下方式调用函数:

代码语言:javascript
复制
PyArg_ParseTupleAndKeywords(..., @kwlist[0], ...) 

就我个人而言,我将使用动态数组来准备您的参数:

代码语言:javascript
复制
var
  kwlist: TArray<PAnsiChar>;

初始化如下:

代码语言:javascript
复制
kwlist := TArray<PAnsiChar>.Create('AAA', 'BBB', nil);

然后像这样递过来:

代码语言:javascript
复制
PPAnsiChar(kwlist)

或者像这样,如果你喜欢:

代码语言:javascript
复制
@kwlist[0]

后者至少是打字用的。

我注意到,您将AAABBB声明为PChar类型。当然,那应该是PAnsiChar

我很难确定你是否正确地准备了所有其他参数。我不熟悉这个特定的API调用。当然,我上面描述的是第一个也是最重要的问题。

我想知道调用者是如何释放返回给您的字符串的?我想你一定会这么做的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23170943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档