2013-10-04 3 views
0

Im modifiy мои драйверы дисплея, чтобы получить уведомление об обновлении, отправленное с USB-порта. До сих пор так хорошо, но я получил запас на следующем:C++ Измените драйверы, получив ошибку «невозможно преобразовать из перегруженной функции»

GPEFlat::GPEFlat() 
{ 
    PBOOT_ARGS args; 
    ULONG  fbSize; 
    ULONG  fbOffset; 
    ULONG  offsetX; 
    ULONG  offsetY; 
    BOOL  bFoundArgs = FALSE; 

    BOOL  m_MouseDisabled = TRUE; 
    HANDLE  m_hAttachEvent = CreateEvent(NULL, FALSE, FALSE, L"MouseAttached"); 
    HANDLE  m_hDetachEvent = CreateEvent(NULL, FALSE, FALSE, L"MouseDetached"); 
    HANDLE  m_hCursorThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MouseEventThread, NULL, 0, NULL); 

DWORD 
GPEFlat::MouseEventThread(void) 
{ 
    DWORD rc = TRUE; 
    HANDLE handles[2]; 
    handles[0] = m_hAttachEvent; 
    handles[1] = m_hDetachEvent; 

Полученная ошибка: Ошибка 1 Ошибка C2440: «приведение типа»: не удается преобразовать из «перегруженной-функции» водители «LPTHREAD_START_ROUTINE» \ дисплей \ vgaflat

Итак, строка: HANDLE m_hCursorThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) MouseEventThread, NULL, 0, NULL); Dosnt работать. Есть некоторые указания, что это может быть нестационарный метод. Как мне это сделать? Приветствие

+0

Спасибо за быстрый ответ. Однако не могли бы вы подробнее показать, как это сделать? Я буду заменять мою строку, которая возникает с проблемой вашей HANDLE m_hcursorThread .... Как мне продолжить? Код typedef, где я должен писать? – HappySoftwareDeveloper

ответ

0

вещь, чтобы понять, что функции (включая статические методы) и не Статические методы - это разные вещи. CreateEvent ожидает функция. Вы должны это дать, он не будет работать с GPEFlat::MouseEventThread, потому что это метод. Что вы можете сделать, это дать ему функцию, которая вызывает GPEFlat::MouseEventThread. Обычно это делается, как этот

DWORD WINAPI thread_starter(LPVOID that) 
{ 
    return ((GPEFlat*)that)->MouseEventThread(); 
} 

... 

CreateThread(NULL, 0, thread_starter, this, 0, NULL); 

Обратите внимание, что я прохожу this к CreateThread, что очень важно. CreateThread передает его параметру that в thread_starter, в котором используется метод that, чтобы вызвать метод, который вы хотели бы назвать все вместе.

+0

Когда я пытаюсь это сделать, я получаю сообщение об ошибке: 'thread_starter': uneclared identifier - указывая ant и CreaThread ...и redefinitnion; ранее определение было неизвестно неизвестным идентификатором - указав на DWORD WINAPI .. – HappySoftwareDeveloper

+0

@ user2605871 thread_starter - это функция, вы должны прототипировать ее, как и любую другую функцию. Поместите 'DWORD WINAPI thread_starter (LPVOID),' где-то рядом с вашим кодом. – john

+0

Спасибо, без ошибок. Думаю, мне нужно все это построить и посмотреть, как это работает! – HappySoftwareDeveloper

0

MouseEventThread должно быть static функцией, так как указатель функции не такими же, как указатель на функции члена. Статические методы могут использоваться как обычные указатели функций, но нестатические функции-члены не могут.

Если вам нужно ссылаться на члены класса, то одно очень простое решение состоит в том, чтобы иметь статические функции-обертки, которые берут экземпляр объекта (в конструкторе) и затем вызывают действительную функцию-член с помощью указателя этого экземпляра.

Что-то вроде

class GPEFlat 
{ 
    // ... 

private: 
    static DWORD MouseEventThreadWrapper(LPVOID instance) 
     { return reinterpret_cast<GPEFlat*>(instance)->MouseEventThread(); } 

    // ... 
}; 

Создать нить с этой обертке функции вместо этого, передавая this в качестве аргумента к нему:

GPEFlat::GPEFlat() 
{ 
    // ... 

    HANDLE  m_hCursorThread = CreateThread(
     NULL, 0, (LPTHREAD_START_ROUTINE)MouseEventThreadWrapper, this, 0, NULL); 
} 
+0

Я написал вот так: \t DWORD \t \t MouseEventThreadWrapper; // HANDLE \t \t m_hCursorThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) ((MyMethodType) MouseEventThread), NULL, 0, NULL); HANDLE m_hCursorThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) MouseEventThreadWrapper, это 0, NULL); Затем я получаю сообщение об ошибке, и если я не объявлю MouseEvent, я получаю сообщение об ошибке. Если я объявляю, что я получаю генерируемый «no object file» – HappySoftwareDeveloper

+0

@ user2605871 Теперь вы объявляете 'MouseEventThreadWrapper' как локальную * переменную * в конструкторе. Посмотрите еще раз на мой ответ, я объявляю его статическим методом в классе. –