這是我試圖調用的方法簽名。努力從本地DLL調用方法使用C#
EXTERN_C
HRESULT
QueryData(
_Outptr_opt_result_bytebuffer_(*SizeOfData) PBYTE * Data,
_Out_opt_ UINT32* SizeOfData,
_In_ BOOL IsDataType
)
上述方法是不是我的代碼,它的供應商代碼,不幸的是我沒有足夠的知識,如何調用此方法。我所知道的是它是想讓我獲得一塊數據。
這是我迄今爲止所做的。
[DllImport("DataGetter.dll")]
internal static extern int QueryData(IntPtr data, UIntPtr sizeOfData, bool isDataType);
IntPtr data= new IntPtr();
UIntPtr sizeOfData= new UIntPtr();
bool isDataType= true;
int hresult = QueryData(data, sizeOfData, isDataType);
我的方法不失敗,但它並沒有在數據返回任何東西。任何想法如何從C#調用這個奇怪的方法?
你嘗試過調用任何更簡單的函數嗎?或者明確地設置調用約定? '[DllImport(「DataGetter.dll」,CallingConvention = CallingConvention.Cdecl)]' –
我以前用簡單的函數使用過P/Invoke,但對於這個DLL,這是它公開的唯一方法。當我添加調用約定時,有趣的是調用失敗,並出現以下錯誤。 「QueryData對棧不平衡,這可能是因爲託管的PInvoke簽名與非託管目標籤名不匹配,請檢查調用約定和PInvoke簽名的參數是否與目標未簽署簽名匹配。 – user1144852
自從我做了任何p/invoke已經很長時間了,但我認爲你的問題是'數據'成員。該函數接受BYTE **(不是BYTE *)。顯然,它在內部分配一個緩衝區,並返回一個指向緩衝區和它的大小的指針。除非你在通話結束後做了一些清理工作,否則可能會導致內存泄漏。 –