В исходниках 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.



