代码之家  ›  专栏  ›  技术社区  ›  Han

使用Win32线程的C++/CLI REF类

  •  2
  • Han  · 技术社区  · 15 年前

    我试图在C++/CLI REF类中封装一些较旧的Win32代码,以便更好地从.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子系统接收消息。我试过将playthread函数指针包装在内部处理器中,但编译器不允许这样做。 此外,我试图使线程函数成为类方法,但编译器不允许ref类方法上的stdcall修饰符。 你知道怎么处理这件事吗?

    1 回复  |  直到 15 年前
        1
  •  3
  •   Mark P Neyer    15 年前

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

    #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;
    }