c++ - 动态调用 Openh264 函数导致我的应用程序崩溃
问题描述
基本上我正在尝试使用他们网页中预先构建的 Openh264 DLL。
使用 LoadLibrary 和 GetProcaddress 有效,直到我调用所需的 WelsCreateEncoder()。
VS 错误告诉我 ESP 未正确保存。
在调试器中,我可以继续运行,一切正常。我一直在调试它,一切正常。但作为一个独立的应用程序它只是崩溃。
我假设因为它是一个 C 库并且我的应用程序是 c++,所以我的调用约定是错误的?
https://github.com/cisco/openh264
我为 WelsCreateDecoder 的开头和结尾添加了 ASM。是我还是它看起来忘记了 sub esp, 4 ?
typedef int(WINAPI * _pWelsCreateSVCEncoder)(ISVCEncoder** ppEncoder);
typedef void(WINAPI * _pWelsDestroySVCEncoder)(ISVCEncoder* ppEncoder);
0F3B8BF0 | 55 | push ebp |
0F3B8BF1 | 8BEC | mov ebp,esp |
...
0F3B8C0F | 33C0 | xor eax,eax |
0F3B8C11 | 85C9 | test ecx,ecx |
0F3B8C13 | 0F94C0 | sete al |
0F3B8C16 | 5D | pop ebp |
0F3B8C17 | C3 | ret |
解决方案
typedef int(* _pWelsCreateSVCEncoder)(ISVCEncoder** ppEncoder);
typedef void(* _pWelsDestroySVCEncoder)(ISVCEncoder* ppEncoder);
事实证明这是缺乏调用约定。不需要WINAPI。
推荐阅读
- python - 在python中增加列表的大小
- c# - .net 检查 api 响应数据 c# post request
- html - HTML和数据分析有什么关系?
- angularjs - 如何从 URL、SpringBoot 和 AngularJs 应用程序中删除 #?
- javascript - glDrawElements:绘制的源纹理和目标纹理相同
- html - 如何在不拉伸内容的情况下居中内容?
- wordpress - MAMP 上的 WordPress 通过互联网连接给出“错误 500”
- node.js - 获取用户 Google 日历的权限以从服务器使用它们
- r - 隐藏在图的分箱区域后面的几何回归线
- javascript - 反应,循环对象,显示列表,并在选择时抓取该对象