Intereting Posts
dynamic_cast void * Разделяют ли UDP-сокеты полученные данные в отдельных сообщениях или читают ли они как можно больше данных одновременно? временная проблема возврата streamа streamstream Пытаясь создать программу, которая читает .txt-файл, отображает его, подсчитывает уникальные слова и отображает уникальные слова рядом с тем, сколько раз использовалось. C ++ Ошибка C ++: отсутствие подходящей функции для вызова Быстрая реализация / аппроксимация функции pow () в C / C ++ Создание нового подвектора C ++? Как проверить, находится ли мышь над элементом управления Возврат строки из c ++-функции Как добраться до основания C ++ Как я могу обернуть std :: wstring в boost :: asio :: buffer? uint24_t и uint48_t в MinGW Как создать файлы в% appdata% с c ++ Разница между исключением C ++ и структурированным исключением Qt 5.4 static build создает ошибку неразрешенного внешнего символа в Visual Studio 2013

Статическая функция члена _beginthreadex

Как создать процедуру streamа для статической функции-члена

class Blah { static void WINAPI Start(); }; // .. // ... // .... hThread = (HANDLE)_beginthreadex(NULL, 0, CBlah::Start, NULL, NULL, NULL); 

Это дает мне следующую ошибку:

 ***error C2664: '_beginthreadex' : cannot convert parameter 3 from 'void (void)' to 'unsigned int (__stdcall *)(void *)'*** 

Что я делаю неправильно?

    Иногда полезно прочитать ошибку, которую вы получаете.

     cannot convert parameter 3 from 'void (void)' to 'unsigned int (__stdcall *)(void *)' 

    Давайте посмотрим, что он говорит. Для параметра три вы даете ему функцию с сигнатурой void(void) , то есть с функцией, которая не принимает аргументов и ничего не возвращает. Он не может преобразовать это в unsigned int (__stdcall *)(void *) , что _beginthreadex ожидает _beginthreadex :

    Он ожидает функцию, которая:

    • Возвращает unsigned int :
    • Использует stdcall вызове stdcall
    • Принимает аргумент void* .

    Поэтому мое предложение было бы «дать ему функцию с подписью, которую она просит».

     class Blah { static unsigned int __stdcall Start(void*); }; 
     class Blah { static unsigned int __stdcall Start(void*); // void* should be here, because _beginthreadex requires it. }; 

    Процедура, переданная _beginthreadex должна использовать __stdcall вызове __stdcall и должна возвращать код выхода streamа .

    Реализация Blah :: Начало:

     unsigned int __stdcall Blah::Start(void*) { // ... some code return 0; // some exit code. 0 will be OK. } 

    Позже в коде вы можете написать любое из следующего:

     hThread = (HANDLE)_beginthreadex(NULL, 0, CBlah::Start, NULL, NULL, NULL); // or hThread = (HANDLE)_beginthreadex(NULL, 0, &CBlah::Start, NULL, NULL, NULL); 

    В первом случае Function-to-pointer conversion будет применяться в соответствии со стандартом C ++ Standard 4.3 / 1. Во втором случае вы будете пропускать указатель на функцию неявно.

     class Blah { public: static DWORD WINAPI Start(void * args); }; 

    Ниже приведена компиляционная версия:

     class CBlah { public: static unsigned int WINAPI Start(void*) { return 0; } }; int main() { HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, &CBlah::Start, NULL, NULL, NULL); return 0; } 

    Ниже приведены необходимые изменения:

    (1). Функция Start () должна возвращать unsigned int

    (2). Он должен принимать значение void *.

    РЕДАКТИРОВАТЬ

    Удаленная точка (3) в соответствии с комментарием

     class Blah { static unsigned int __stdcall Start(void *); };