#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 за вашу помощь