奇異的Pinvoke呼叫

2021-09-06 03:49:15 字數 716 閱讀 8555

我們的乙個c#專案需要呼叫c++的dll,通過pinvoke進行方法呼叫。其中的乙個方法及其引數的定義是這樣的:

[structlayoutattribute    

(layoutkind

.sequential)]

public

struct

xvid_gbl_info_t        

[dllimportattribute(

"xvidcore

", entrypoint ="

xvid_global")]

public

static

extern

intxvid_global(

intptr 

handle, 

intopt, 

refxvid_gbl_info_t

param1, 

intptr

param2); 

在做demo時,一切正常,而且在測試的7臺電腦上均能正常執行。

但到正式專案中,完全一樣的呼叫模式,卻有3臺電腦正常執行,4臺電腦執行到該方法時就報錯:「有未處理的異常,堆已損壞。」

昨天晚上搞到半夜,仍然是如此,奇怪!希望有大俠能指教一二,感激不盡。

注:問題已經解決,原因是不能呼叫靜態方法和成員,如果先呼叫了靜態方法和成員,再呼叫pinvoke上面的方法,在某些機器上就會丟擲異常。但是為何會這樣奇怪了?不得其解。

使用平台呼叫(P Invoke)

使用平台呼叫 p invoke,它的全名叫平台呼叫 platform invoke 用於呼叫dll 中實現的非託管的單調 flat 程式設計介面,被稱為使用c或c 呼叫約定 calling conventions 最有名的例子是win32 程式設計介面,這是乙個巨大的庫,它公開了windows 所有...

平台呼叫P INVOKE 一 基礎篇

平台呼叫技術 p invoke 主要用於處理在託管 中呼叫c c 庫函式及win32 api函式等非託管函式的情形 一 基本要素 乙個簡單例子 c 宣告 extern c declspec dllexport int multiply int factora,int factorb 實現 int m...

C 高階與初心 (二)P Invoke平台呼叫

最近某個專案要採集交易終端的資訊用於監管,主要廠商給出了api,c 版的。開啟hard模式!c 呼叫c 的dll基本就兩種方法 加乙個vc 專案包一層,或者使用p invoke 平台呼叫 前者對於純c 的客戶端來說,增加了複雜性。那就只剩下平台呼叫了。使用平台呼叫的過程比較艱辛,主要遇到了兩個問題 ...