Ошибка в подписи P Invoke

#vb.net #pinvoke

#vb.net #pinvoke

Вопрос:

Я получаю сообщение об ошибке, когда я пытался использовать функцию, используя p invoke со следующей функцией

объявление

 extern "C" __declspec(dllexport) HRESULT Get_GetLastHR(HANDLE);
 

определение

 HRESULT Get_GetLastHR(HANDLE _xmlParser ){
return ((FCEXMLParser*)_xmlParser)->GetLastHR();
}
 

подпись p Invoke, используемая в VB.Net

 Public Shared Function Get_GetLastHR(ByVal param0 As System.IntPtr) As Integer
 

* ОШИБКА *

* Вызов функции PInvoke ‘FeeCalculator!FeeCalculator.FeeEngine.FeeEngineMethods::Get_GetLastHR’ разбалансировал стек. Вероятно, это связано с тем, что управляемая подпись PInvoke не соответствует неуправляемой целевой подписи. Убедитесь, что соглашение о вызове и параметры подписи PInvoke соответствуют целевой неуправляемой подписи.*

Есть ли какие-либо проблемы с используемой подписью?

Комментарии:

1. Как говорится в сообщении об исключении, неправильное соглашение о вызове. Cdecl, а не Stdcall. Вы должны использовать <DllImport> вместо объявления.

2. я использую <dllimport>, но он не работает. Я не могу передать какой-либо параметр неуправляемым функциям, но функции без параметра и только возвращаемого типа работают правильно.

3. У меня сейчас нет веб-камеры. я вставляю часть объявления <DllImport(«FeeEngineDll.dll «)> _ Общедоступная общая функция Get_GetLastHR(ByVal param0 как System. IntPtr) Как целое число

4. Я изменил код на <DllImport(«FeeEngineDll.dll «, CallingConvention:=CallingConvention. Cdecl)>. Теперь он работает. Спасибо @hans за вашу помощь