Passar ponteiro de função gerenciada como retorno de chamada não gerenciado
Eu estou tentando passar um ponteiro de função gerenciadavoid (*)(void *)
para minha biblioteca não gerenciada. Minha biblioteca não gerenciada chama esse retorno de chamada com um ponteiro para um quadro de dados protegido por uma CriticalSection. Enquanto o retorno de chamada gerenciado está em execução, nada mais pode modificar o quadro de dados devido à Seção Crítica. No entanto, estou recebendo violações de acesso e corrupção de heap apenas inserindo o retorno de chamada.
EDITAR: Eu esqueci de mencionar. oStartStreaming()
rouba o fio que ele gerencia. Além disso, cria um thread separado para despachar novos dados para o retorno de chamada fornecido. O retorno de chamada é chamado neste thread separado.
Até agora eu fiz o seguinte:
//Start Streaming
streaming_thread_ = gcnew Thread(gcnew ThreadStart(&Form1::WorkerThreadFunc));
streaming_thread_->Start();
Onde:
extern "C" {
#include "libavcodec\avcodec.h"
#include "libavutil\avutil.h"
}
namespace TEST_OCU {
delegate void myCallbackDelegate(void * usr_data); //Declare a delegate for my unmanaged code
public ref class Form1 : public System::Windows::Forms::Form
{
public:
static void WorkerThreadFunc()
{
myCallbackDelegate^ del = gcnew myCallbackDelegate(&Form1::frame_callback);
MessageBox::Show("Starting to Streaming", "Streaming Info");
if(rtsp_connection_ != NULL)
rtsp_connection_->StartStreaming();
//rtsp_connection_->StartStreaming((void (*)(void *)) System::Runtime::InteropServices::Marshal::GetFunctionPointerForDelegate(del).ToPointer() );
MessageBox::Show("Done Streaming", "Streaming Info");
}
static void __cdecl frame_callback(void * frame)
{
AVFrame * casted_frame = (AVFrame *)frame;
}
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e)
{
if(rtsp_connection_ == NULL)
rtsp_connection_ = new NeyaSystems::RTSPConnection("rtsp://url");
}
private: static RTSPConnection * rtsp_connection_ = NULL;
}
}
Eu omiti muitos códigos sem sentido ...StartStreaming
O padrão é um ponteiro NULL, neste caso eu não obtenho corrupçãoStartStreaming
com o ponteiro de função delegada causa danos na pilhaRTSPConnection
é implementado em C ++ nativo e contém também chamadas C (libavcodec)RTSPConnection
contém dois encadeamentos, comunicação e encadeamento de envio de quadros (chama o retorno de chamada gerenciado)Alguém poderia me dar uma migalha? Muito obrigado antecipadamente.