2008-10-17 6 views
4

Dans xp 32bit cette ligne compile avec pas le problème mais dans vista 64bit cette ligne:overdrive stdcall par visual studio?

m_FuncAddr = ::GetProcAddress (somthing); 

donne l'erreur suivante

erreur C2440: '=': ne peut pas convertir 'FARPROC' à 'int (__cdecl *) (void)'

GetProcAddress est défini comme

WINBASEAPI FARPROC WINAPI GetProcAddress (somthing) 

Et m_FuncAddr comme

int (WINAPI *m_FuncAddr)(); 

D'après ce que je comprends les deux sont des années stdcall.

Pour éviter l'erreur que je devais mettre

m_FuncAddr = (int (__cdecl *)(void))::GetProcAddress(somthing); 

Ma question:

Si les deux m_FuncAddr et GetProcAddress ont la convention d'appel stdcall pourquoi dois-je « rappel » avec cdecl?

Est-il possible que le projet VS réglage « par défaut de convention d'appel (qui est définie à CDECL) sur-surfe sur la statment de assignemet ci-dessus?

Merci d'avance!

[Modifier]

Pour clerfiy la question:

D'un côté de l'équation (disons côté 1) j'ai

int __stdcall * m_FuncAddr 

De l'autre côté (côté 2)

INT_PTR far __stdcall GetProcAddress 

Alors, comment est-ce que je dois jeter côté 2 avec cdecl si les deux sont stdcalls? Ou est-ce que je ne reçois pas quelque chose?

+0

Ma réponse est toujours debout après votre édition, int et INT_PTR sont très différents dans les versions 64 bits! –

+0

Dans le cas où vous vérifiez seulement l'onglet "réponses", s'il vous plaît voir mon édition ci-dessous. –

Répondre

3

Le type de retour doit être INT_PTR (valeur de 64 bits dans les versions 64-bit). Vous ne devriez pas contourner cette erreur - le compilateur essaie de vous dire que quelque chose ne va pas.

De WinDef.h:

#ifdef _WIN64 
typedef INT_PTR (FAR WINAPI *FARPROC)(); 

Ainsi, la déclaration de m_FuncAddr devrait être:

INT_PTR (WINAPI *m_FuncAddr)(); 
+0

Adam votre réponse est juste, mais s'il vous plaît modifier un peu, une chose utile que j'ai trouvé est cette erreur n'a pas vraiment à faire avec les conventions d'appel comme je l'ai d'abord pensé. Tout ce que j'ai fait est de changer le type de retour m_FuncAddr en INT_PTR et le problème s'est résolu. Alors s'il vous plaît faites votre réponse plus complète. –

+0

Modifié ... laissez-moi savoir si ce n'est toujours pas clair. –

2

C'est une coïncidence qu'il compile correctement dans 32bit; la syntaxe correcte est:

typedef int (WINAPI *FFuncType)(); 
FFuncType m_FuncAddr; 
m_FuncAddr = (FFuncType)::GetProcAddress (somthing); 

Vous devez jeter explicitement le résultat de GetProcAddress :: à la signature de son bon fonctionnement. En 32 bits, FARPROC arrive à fonctionner avec la signature que vous avez, mais probablement pas en 64 bits.

Edit: Oui, en fait, regarder Windef.h, le type de retour est INT_PTR à 64 bits, c'est pourquoi vous avez obtenu l'erreur du compilateur. Cependant, vous devrez toujours convertir la signature de la fonction comme indiqué ci-dessus pour toute fonction qui ne correspond pas à l'espace réservé pour FARPROC, donc vous devriez le faire comme ci-dessus en général.

+0

Mais la chose que FFuncType est stdcall et je la mets en cdecl, ou est-ce que je ne reçois rien? –

+0

Rappelez-vous que int est en 32 bits, même dans les versions 64 bits. –

+0

La convention d'appel peut être spécifique à la DLL, de sorte que le seul moyen "sûr" est de transtyper vers le typedef défini par l'en-tête. Il se peut que toutes les DLL utilisent la même convention, mais je ne le sais pas pour un fait. – Nick