Передать указатель управляемой функции как неуправляемый обратный вызов

Я пытаюсь передать указатель на управляемую функциюvoid (*)(void *) в мою неуправляемую библиотеку. Моя неуправляемая библиотека вызывает этот обратный вызов с указателем на фрейм данных, защищенных CriticalSection. Пока работает управляемый обратный вызов, ничто другое не может изменить фрейм данных из-за критического раздела. Тем не менее, я получаю нарушения прав доступа и повреждения кучи, просто введя обратный вызов.

EDIT: Я забыл упомянуть.StartStreaming() крадет нить, которой управляет. Кроме того, он создает отдельный поток для отправки новых данных в данный обратный вызов. Обратный вызов вызывается в этом отдельном потоке.

До сих пор я сделал следующее:

//Start Streaming
streaming_thread_ = gcnew Thread(gcnew ThreadStart(&Form1::WorkerThreadFunc));
streaming_thread_->Start();

Куда:

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;
}
}
I've omitted a lot of pointless code... StartStreaming defaults to a NULL pointer, in this case I get no corruption StartStreaming with the delegated function pointer causes heap corruption RTSPConnection is implemented in native C++ and contains C calls as well (libavcodec) RTSPConnection contains two threads, communication and frame dispatch thread (calls the managed callback)

Кто-нибудь может дать мне крошку? Огромное спасибо заранее.

Ответы на вопрос(2)

Ваш ответ на вопрос