次のような手順で結果を公開している Delphi ライブラリがあります。
procedure Script_GetFindedList(List : Pointer; out Len : Cardinal); stdcall;
var X : TArray<Cardinal>;
begin
TScriptMethod.Create(SCGetFindedList).SendExecMethod.Free;
NamedPipe.WaitForReply(Pipe_WaitDelay);
if not ResultReady then ExitProcess(0);
SetLength(X,FuncResultStream.Size div 4);
FuncResultStream.Read(X[0],FuncResultStream.Size);
Len := Length(X) * 4;
if Assigned(List) then
Move(X[0],PByteArray(List)^[0],Len);
end;
そして、次のように通常の Delphi コードから呼び出すことができます。
function TFindEngine.GetFindedList : TArray<Cardinal>;
var BufLen : Cardinal;
begin
Script_GetFindedList(nil, BufLen);
if BufLen = 0 then Exit;
SetLength(Result,BufLen div 4);
Script_GetFindedList(PByteArray(Result), BufLen);
end;
ctypes ライブラリを使用して Python でコードをラップしたいのですが、次のようなコードがあります。
from ctypes import *
my_dll = windll.Script
def GetFindedList():
my_dll.Script_GetFindedList.argtypes = [POINTER(c_uint), POINTER(c_uint)]
my_dll.Script_GetFindedList.restype = None
BufLen = c_uint()
my_dll.Script_GetFindedList(None, byref(BufLen))
if BufLen.value > 0:
print("BufLen.value : {}".format(BufLen.value))
##################################################################
# alternate solution that just leaks memory while doing nothind
# buf = array('I', range(BufLen.value))
# addr, count = buf.buffer_info()
# Result = cast(addr, POINTER( (c_uint * BufLen.value) ))
Result = (c_uint * BufLen.value)()
print("Result before: {}".format(list(Result)))
my_dll.Script_GetFindedList(byref(Result), byref(BufLen))
print("Result after: {}".format(list(Result)))
return Result
else:
return []
しかし、これは機能していません。正しい BufLen.value を取得するだけですが、dll への 2 回目の呼び出しでは、配列に値を設定できません。私は多くの同様の試みをしましたが、運がありませんでした。私にアドバイスできる人はいますか?
ありがとうございました。