我有一個帶有幾個匯出函式的 C# DLL。在其中一個函式上,當從我們的 Delphi XE2 應用程式呼叫它時,陣列的長度引數在 DLL 中總是被讀取為 31,而不管我實際傳遞的是什么。
C# 函式宣告
[DllExport(CallingConvention = CallingConvention.StdCall)]
public static bool FraDataRead(int dbHash, uint pointid, [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] Double[] FraData, int length)
Delphi 函式宣告
TGetFraData = function(dbHash : Integer;
pointid : Uint32;
unmanagedArray : Array of Double;
arraySize : Integer) : Bool; stdcall;
獲取程式
GetFraData : TGetFraData; //this is a class variable, here for simplicity
@GetFraData := GetProcAddress(FDllHandle, 'FraDataRead');
呼叫函式
function TIviumSQLAccess.IviFraData(const PointId : Uint32;
const FraData : Array of Double;
const arraySize : Integer): Boolean;
begin
Result := GetFraData(dbHash,
PointId,
FraData,
arraySize);
end;
我已經測驗過從另一個 C# 應用程式呼叫該函式,并且長度引數按預期運行。當從 Delphi 呼叫時,它總是以 32 作為長度(當前)呼叫,但 DLL 總是處理 31。我在呼叫時嘗試了更大和更小的數字,但它總是使用 31。
uj5u.com熱心網友回復:
TGetFraData = function(dbHash : Integer;
pointid : Uint32;
unmanagedArray : Array of Double;
arraySize : Integer) : Bool; stdcall;
這段代碼是錯誤的,因為它使用了 Delphi 開放陣列。這些實際上是作為兩個引數實作的,指向陣列的指標和最后一個元素的索引,這就是為什么您看到長度為 32 的陣列的 31 的原因。
您需要像這樣宣告型別
TGetFraData = function(dbHash : Integer;
pointid : Uint32;
unmanagedArray : PDouble;
arraySize : Integer) : Bool; stdcall;
然后將指標傳遞給陣列的第一個元素。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/513244.html
上一篇:如何使TIdStackLocalAddress在Android上作業?
下一篇:DelphiXE8IndyOpenSSL,在Windows11更新后出現錯誤14077410SSL23_GET_SERVER_HELLO
