Вопрос

Я пытаюсь инкапсулировать некоторый старый код win32 в класс ссылок C ++ / CLI, чтобы сделать его более доступным из кода .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 в interior_ptr, но компилятор не позволил бы это. Кроме того, я пытался сделать функцию потока методом класса, но компилятор не разрешает модификатор _stdcall в методах класса ref. Вы знаете способ справиться с этим?

Это было полезно?

Решение

Управляемые классы передаются с использованием «дескрипторов» вместо ссылок. Вы не можете обрабатывать дескриптор управляемого класса как указатель. То, что вы хотите сделать, это создать собственный вспомогательный класс, который содержит дескриптор управляемого класса. Затем вы передаете указатель на нативный помощник в функцию запуска потока. Вот так:

#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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top