WinPcap С# Обертка pcap_findalldevs() выдает PInvokeStackImbalance

Я пытаюсь написать оболочку С# для winpcap. Он выдает предупреждение PInvokeStackImbalance при попытке отладки, но pcap_findalldevs выполняет свою работу. Но я думаю, что это вызовет утечку памяти в программе. Кстати, этот код взят из networkminer. Я не писал его, просто пытался понять winpcap и упаковку.

Это метод в WinPcap.

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; 

person Emre Erisgen    schedule 15.07.2011    source источник


Ответы (1)


Вам не хватает соглашения о вызовах cdecl:

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

Соглашение о вызовах по умолчанию для DllImportstdcall, но могу поспорить, что библиотека WinPcap экспортируется как cdecl.

person David Heffernan    schedule 15.07.2011
comment
Ты так много, но что означает PInvokeStackImbalance? он все еще делал свою работу - person Emre Erisgen; 16.07.2011
comment
И stdcall, и cdecl помещают параметры в стек справа налево. Они отличаются тем, кто очищает стек. Вызываемый очищается от stdcall, а вызывающий очищается от cdecl. Последнее — это то, что включает вариативные функции в C. Ваше предупреждение PInvokeStackImbalance обнаруживает, что стек не был очищен вызывающей стороной, как это должно было быть, и предупреждает вас. Вероятно, вам это сойдет с рук, потому что стек перестраивается до того, как будет нанесен ущерб. Но вам не всегда это сойдет с рук. Вы должны привести свои соглашения о вызовах в соответствие. - person David Heffernan; 16.07.2011