В исходниках Python for Delphi есть такой код:
- Код: Выделить всё
type
TPythonInterface=class(TDynamicDll)
private
{...}
DLL_PyArg_ParseTuple:
function( args: PPyObject; format: PChar {;...}):
Integer; cdecl; varargs;
{...}
function PyArg_ParseTuple( args: PPyObject; format: PChar;
argp: array of Pointer): Integer; cdecl;
{...}
end;
{...}
function TPythonInterface.PyArg_ParseTuple ( args: PPyObject; format: PChar;
argp: array of Pointer): Integer; cdecl;
begin
{$IFDEF DELPHI6_OR_HIGHER}
{...}
{$ELSE}
{***} Result := DLL_PyArg_ParseTuple( args, format ); {***}
{$ENDIF}
end;
Почему выделенное звёздочками работает в Delphi (т.е. корректно передает аргументы, которые в argp) и не работает в freepascal?
FreePascal версии 2.2.0, ключ -Mdelphi используется.
Не работает следующим образом: исключение Access Violation, причем не внутри DLL_PyArg_ParseTuple, а где-то после, при вызовах других функций (портится стек?). Если вызов PythonInterface.PyArg_ParseTuple заменить непосредственно на PythonInterface.DLL_PyArg_ParseTuple c соответствующим изменением прототипа (либо добавление модификатора varargs и убирание квадратных скобок в вызывающем коде, либо добавление array of const в список аргументов), то все работает как надо. Одинаковое поведение и на Windows, и на Linux.