1

基本上我正在尝试使用他们网页中预先构建的 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               |
4

1 回答 1

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让我很困惑。

于 2019-06-13T18:49:37.437 回答