2009-09-10 2 views
2

.NET 코드에서보다 쉽게 ​​액세스 할 수 있도록 이전 Win32 코드를 C++/CLI 참조 클래스에 캡슐화하려고합니다. 이 클래스는 Win32 스레드를 시작하고 클래스에 대한 포인터를 스레드 매개 변수로 전달해야합니다. 코드는 다음과 유사합니다 :Win32 스레드를 사용하는 C++/CLI 참조 클래스

스레드는 MME 하위 시스템에서 메시지를 받기 때문에 실제로 Win32 스레드 여야합니다. internal_ptr에서 PlayThread 함수 포인터를 래핑하려고 시도했지만 컴파일러는이를 허용하지 않습니다. 또한 스레드 함수를 클래스 메서드로 만들려고했지만 컴파일러는 ref 클래스 메서드에서 _stdcall 수정자를 허용하지 않습니다. 이것을 처리하는 방법을 알고 있습니까?

+0

이 mme 하위 시스템입니까? – deostroll

답변

3

관리되는 클래스는 참조 대신 '핸들'을 사용하여 전달됩니다. 포인터와 같은 관리되는 클래스에 대한 핸들을 처리 할 수 ​​없습니다. 당신이하고자하는 것은 관리되는 클래스에 대한 핸들을 가지고있는 네이티브 헬퍼 클래스를 만드는 것입니다. 그런 다음 네이티브 헬퍼에 대한 포인터를 스레드 시작 함수에 전달합니다. 이와 같이 :

#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; 
} 
관련 문제