2009-09-10 6 views
2

J'essaye d'encapsuler du code win32 plus ancien dans une classe ref C++/CLI pour le rendre plus accessible depuis le code .NET. Cette classe doit démarrer un thread Win32 et transmettre un pointeur à la classe en tant que paramètre thread. Le code ressemble à ceci:Classe ref C++/CLI utilisant un thread 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; 
} 

Le fil doit vraiment être un fil Win32 car il reçoit des messages du sous-système MADAME. J'ai essayé d'encapsuler le pointeur de fonction PlayThread dans un interior_ptr, mais le compilateur ne l'aurait pas autorisé. En outre, j'ai essayé de faire de la fonction thread une méthode de classe, mais le compilateur n'autorise pas le modificateur _stdcall sur les méthodes de classe ref. Connaissez-vous un moyen de gérer cela?

+0

quel est un sous-système? – deostroll

Répondre

3

Les classes managées sont transmises en utilisant 'handles' au lieu de références. Vous ne pouvez pas traiter une poignée d'une classe managée comme un pointeur. Ce que vous allez faire est de créer une classe d'assistance native qui contient un descripteur de la classe gérée. Ensuite, vous passez un pointeur vers l'assistant natif dans la fonction de démarrage du thread. Comme ceci:

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