Смешивание PInvoke с IAsyncOperation вызывает Crash / Exception / BufferOverflow - PullRequest
1 голос
/ 30 мая 2019

Я все еще работаю над UWP VpnPlugin. Без использования. Он успешно подключается к моему тестовому vpn-серверу на компьютере с Debian Hyper-V. На втором этапе мне нужно использовать стороннюю C / C ++ dll / lib. Как только я использую простой C ++ WinRT-компонент с C # BackgroundTask WinRT-компонентом, происходит сбой приложения при вызове (первого) асинхронного метода C #. Проблемы начинают появляться, как только PInvoke используется. Таким образом, PInvoke плохо ладит с асинхронным C # -компонентом в компоненте WinRT.

Любая помощь в этом вопросе очень ценится.

Я думал об использовании управляемых классов в компоненте c ++, но не был уверен, что это может решить проблему. Найдите полный исходный код проекта здесь: https://github.com/marcusrunge/ToyVpn/tree/extern

Сообщения об ошибках:

ntdll.dll!_NtWaitForAlertByThreadId@8()
ntdll.dll!@RtlpWaitOnAddressWithTimeout@16()
ntdll.dll!RtlpWaitOnCriticalSection()
ntdll.dll!_RtlpEnterCriticalSectionContended@4()
ntdll.dll!_RtlEnterCriticalSection@4()
ntdll.dll!ExecuteHandler2@20()
ntdll.dll!ExecuteHandler@20()
ntdll.dll!_KiUserExceptionDispatcher@8()
Windows.Networking.dll!
Windows::Internal::AsyncBaseFTM<Windows::Foundation::IAsyncActionCompletedHandler,1,Microsoft::WRL::AsyncCausalityOptions<&DatagramSocketConnectAsyncOperationName,&GUID_CAUSALITY_WINDOWS_PLATFORM_ID,2> >::FireCompletion() Zeile 162 C++
Windows.Networking.dll!
SocketOperationBase<Windows::Foundation::IAsyncActionCompletedHandler,Microsoft::WRL::AsyncCausalityOptions<&DatagramSocketConnectAsyncOperationName,&GUID_CAUSALITY_WINDOWS_PLATFORM_ID,2> >::FireCompletionAndReleaseOperation() Zeile 46 C++
Windows.Networking.dll!    
SocketOperationBase<Windows::Foundation::IAsyncActionCompletedHandler,Microsoft::WRL::AsyncCausalityOptions<&DatagramSocketConnectAsyncOperationName,&GUID_CAUSALITY_WINDOWS_PLATFORM_ID,2> >::CompleteAsyncOperation(HRESULT hr) Zeile 35  C++
Windows.Networking.dll
SocketNameResolver::GetAddrInfoCompleteHandler<DatagramSocketConnectOperationServer>(void * context, HRESULT hr, addrinfoexW * addrInfoList) Zeile 165  C++
Windows.Networking.dll!SocketNameResolver::CompleteGetAddrInfoEx(HRESULT hrStatus) Zeile 489    C++
Windows.Networking.dll!
SocketNameResolver::GetAddrInfoExWaitCallback(_TP_CALLBACK_INSTANCE * instance, void * context, _TP_WAIT * wait, long waitResult) Zeile 292 C++
ntdll.dll!TppExecuteWaitCallback()
ntdll.dll!TppWaitCompletion()
ntdll.dll!_TppWorkerThread@4()
kernel32.dll!@BaseThreadInitThunk@12()
ntdll.dll!__RtlUserThreadStart()
ntdll.dll!__RtlUserThreadStart@8()
...