2011-07-15 56 views
1

我試圖編寫一個C#包裝winpcap。當我嘗試調試時,它給出警告PInvokeStackImbalance,但是pcap_findalldevs完成它的工作。但我認爲這會導致程序內存泄漏。順便說一句這個代碼是來自networkminer我沒有寫這只是試圖理解winpcap和包裝。

這是WinPcap的方法WinPcap C#包裝pcap_findalldevs()拋出PInvokeStackImbalance

int pcap_findalldevs(pcap_if_t ** alldevsp, char * errbuf) 

這是我在我的計劃

[DllImport("wpcap.dll", CharSet = CharSet.Ansi)] 
internal static extern int pcap_findalldevs(ref IntPtr alldevsp, StringBuilder errbuf); 

i = IntPtr.Zero; 
     StringBuilder stringBuilder; 
     stringBuilder = new StringBuilder(256); 

if (pcap_findalldevs(ref i, stringBuilder) == -1) 
      return null; 

回答

2

你缺少cdecl調用約定寫道:

[DllImport("wpcap.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)] 

默認調用約定對於DllImportstdcall但我敢打賭贏Pcap庫導出爲cdecl

+0

ty很多,但是PInvokeStackImbalance的含義是什麼?它仍在執行其工作 –

+0

stdcall和cdecl都將參數從右向左推入堆棧。他們在清理堆棧方面有所不同。 Called清理了stdcall,調用者清理了cdecl。後者是C中可變參數的功能。您的PInvokeStackImbalance警告檢測到調用程序未清理堆棧,因爲它應該已經清除並警告您。你可能會逃避,因爲堆棧在損壞完成之前會被重新排列。但是你不會總是避開它。你必須讓你的調用約定匹配。 –

+0

ty這麼多信息 –