Динамический вызов функций Openh264 приводит к сбою приложения - PullRequest
1 голос
/ 13 июня 2019

В основном я пытаюсь использовать предварительно собранные библиотеки Openh264 с их веб-страницы.

Использование LoadLibrary и GetProcaddress работает, пока я не вызову требуемый WelsCreateEncoder ().

Ошибка VSговорит мне, что ESP не был сохранен правильно.

В отладчике я могу просто продолжать работать, и все работает нормально.Я хорошо отлаживал, и у меня есть все для работы.но как отдельное приложение оно просто падает.

Я предполагаю, потому что это библиотека C, а мое приложение c ++, что мои соглашения о вызовах неверны?

https://github.com/cisco/openh264

Я добавил ASM для начала и конца WelsCreateDecoder.Это я или похоже, что он забывает 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               |

1 Ответ

1 голос
/ 13 июня 2019
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 смутила меня.

...