动态调用Openh264函数会导致我的应用崩溃

时间:2019-06-13 08:20:00

标签: c++ loadlibrary openh264

基本上,我正在尝试使用其网页中的预构建Openh264 DLL。

使用LoadLibrary和GetProcaddress可以正常工作,直到我调用所需的WelsCreateEncoder()。

VS错误告诉我ESP的保存不正确。

在调试器中,我可以继续运行,一切正常。 我一直在调试,一切正常。但作为独立应用程序,它只会崩溃。

我假设是因为它是一个C库,而我的应用是c ++,所以我的调用约定是错误的?

https://github.com/cisco/openh264

我为WelsCreateDecoder的开头和结尾添加了ASM。是我还是看起来忘记了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               |

1 个答案:

答案 0 :(得分:1)

typedef int(* _pWelsCreateSVCEncoder)(ISVCEncoder** ppEncoder);
typedef void(* _pWelsDestroySVCEncoder)(ISVCEncoder* ppEncoder);

原来这是缺乏通话习惯的。不需要WINAPI。

尽管https://github.com/cisco/openh264/blob/8533dd9daaaf3d7a51d9295686c31718ec3c946e/codec/decoder/plus/src/welsDecoderExt.cpp#L1052这行使我感到困惑。