2010-12-20 4 views
1

invalid conversion from 'DWORD (*)(void*)' to 'DWORD (*)(void*)'. gâteau == mensonge 1 == 0conversion invalide de 'DWORD (*) (void *)' à 'DWORD (*) (void *)'

Je ne sais pas ce que cela veut dire ... je reçois dans ce code

HANDLE CPlugin::CreateWinampThread() || 
{         __VVVVVVVV__ 
    hWinampThreadHandle = (HANDLE)CreateThread(NULL, 0, StartWinampThread, (void*)this, 0, &dwWinampThreadID); 
    if (!hWinampThreadHandle) 
     return 0; 

    CloseHandle(hWinampThreadHandle); 
    return hWinampThreadHandle; 
} 

. 

DWORD WINAPI CPlugin::StartWinampThread(void* lpParam)[...] 
+1

Est-CPlugin :: StartWinampThread statique? Vous ne pouvez pas passer une fonction de membre non statique en tant que rappel, bien que je m'attendrais à ce que le compilateur mentionne quelque chose à propos de "thiscall" si vous essayez (mais peut-être que votre compilateur ne le fait pas?). –

+0

Pourquoi ne nous dites-vous pas le * type * des variables que vous utilisez dans CreateThread()? aussi, dans quelle ligne vous obtenez cette erreur? – Nawaz

+0

Nope ce n'est pas ... oh stupide moi .... donc je suppose malade faire une fonction proxy pour cela ... – n00b

Répondre

5

StartWinampThread doit être statique si elle est fonction de membre.

+0

vrai, mais cela ne se débarrasse pas de l'erreur o0 – n00b

+0

parce que cela souligne une défaillance sur uber mon côté je l'accepte comme réponse mais la chose qui a résolu l'erreur est l'ajout d'un cast (LPTHREAD_START_ROUTINE) – n00b

+0

Ne pas lancer, cela cache juste un problème. Peu importe ce que ça pourrait être. –

0

Est-il faire avec des objets - il y a un implicite « ceci » paramter à la méthode StartWinampThread de votre objet, car il est un membre d'une classe.

Qu'est-ce qui se passe si vous changez pour une méthode autonome mais garder la même signature-à-dire de

DWORD WINAPI CPlugin::StartWinampThread(void* lpParam)[...] 

à DWORD WINAPI StartWinampThread (void * lpParam) [...]

(I savent ne fonctionnera pas pour vous, je suis curieux de voir si elle supprime

+0

a changé pour DWORD WINAPI StartWinampThreadProxy (void * param) { CPlugin * ths = (CPlugin *) param; ths-> StartWinampThread (param); } même erreur – n00b

2

la plainte) le compilateur voir ici: in-c-is-it-safe-portable-to-use-static-member-function-pointer-for-c-api-callb pourquoi vous avez besoin d'utiliser un extern « C »

La bonne façon serait somthing comme ceci:

HANDLE CPlugin::CreateWinampThread() || 
{         __VVVVVVVV__ 
    hWinampThreadHandle = (HANDLE)CreateThread(NULL, 0, ::StartWinampThread, (void*)this, 0, &dwWinampThreadID); 
    if (!hWinampThreadHandle) 
     return 0; 

    CloseHandle(hWinampThreadHandle); 
    return hWinampThreadHandle; 
} 

. 

// A callback function for C code must have C linkage. 
// That is not possable for C++ static member functions. 
extern "C" DWORD WINAPI StartWinampThread(void* lpParam) 
{ 
    // You can always call your static member function here. 
    CPlugin::StartWinampThread(lpParam) 
} 
Questions connexes