Multithreading C++/使用win32线程的CLI ref类

Multithreading C++/使用win32线程的CLI ref类,multithreading,interop,c++-cli,Multithreading,Interop,C++ Cli,我试图将一些较旧的win32代码封装在C++/CLI ref类中,以便更好地从.NET代码访问它。此类需要启动Win32线程并将指向该类的指针作为线程参数传递。代码如下所示: ref class MmePlayer { int StartPlayback() { hPlayThread = CreateThread(NULL, 0, PlayThread, this, 0, &PlayThreadId); } }; static DWORD WI

我试图将一些较旧的win32代码封装在C++/CLI ref类中,以便更好地从.NET代码访问它。此类需要启动Win32线程并将指向该类的指针作为线程参数传递。代码如下所示:

ref class MmePlayer
{
    int StartPlayback()
    {
        hPlayThread = CreateThread(NULL, 0, PlayThread, this, 0, &PlayThreadId);
    }
};

static DWORD WINAPI PlayThread(LPVOID pThreadParam)
{
    // Get a pointer to the object that started the thread
    MmePlayer^ Me = pThreadParam;
}
该线程实际上需要是Win32线程,因为它从MME子系统接收消息。我曾尝试将PlaySThread函数指针包装在一个内部ptr中,但编译器不允许这样做。 此外,我还尝试将线程函数设置为类方法,但编译器不允许在ref类方法上使用_stdcall修饰符。
你知道怎么处理吗

托管类使用“句柄”而不是引用进行传递。不能将托管类的句柄视为指针。您要做的是创建一个本机帮助器类,该类包含托管类的句柄。然后将指向本机帮助程序的指针传递到线程启动函数中。像这样:

#include <msclr/auto_gcroot.h>
using msclr::auto_gcroot;

ref class MmePlayer;

class MmeHelper 
{
     auto_gcroot<MmePlayer^> myPlayer;
};

ref class MmePlayer
{
    int StartPlayback()
    {
        myHelper = new MmeHelper();
        myHelper->myPlayer = this;
        hPlayThread = CreateThread(NULL, 0, PlayThread, myHelper, 0, &PlayThreadId);
    }

    MmeHelper * myHelper;
};

static DWORD WINAPI PlayThread(LPVOID pThreadParam)
{
    // Get a pointer to the object that started the thread
    MmeHelper* helper = pThreadParam;
}
#包括
使用msclr::auto_gcroot;
裁判级球员;
类帮助器
{
自动根播放器;
};
裁判级球员
{
int StartPlayback()
{
myHelper=新的MMEHeloper();
myHelper->myPlayer=这个;
hPlayThread=CreateThread(NULL、0、PlayThread、myHelper、0和playthreaid);
}
mmeheloper*myHelper;
};
静态DWORD WINAPI播放线程(LPVOID pthread param)
{
//获取指向启动线程的对象的指针
mmeheloper*helper=pThreadParam;
}