2009-09-10 19 views
2

古いWin32コードをC++/CLIのrefクラスにカプセル化して、.NETコードからのアクセスを向上させようとしています。このクラスは、Win32スレッドを開始し、クラスへのポインタをスレッドパラメータとして渡す必要があります。コードは次のようになります。Win32スレッドを使用したC++/CLIリファレンスクラス

スレッドは、MMEサブシステムからメッセージを受け取るため、実際にはWin32スレッドである必要があります。私はinterior_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; 
} 
関連する問題