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.

questionAnswers(2)

yourAnswerToTheQuestion