Bonjour,
En poursuivant mon parcours de l'article de Jeff Glatt concernant la programmation COM en C, j'ai une question concernant un problème de déclaration EXTERN.
En utilisant l'outil de création des GUID, on obtient ces quelques lignes.
Le problème est que le linker butte sur la non résolution de la variable externe Error LNK2001 unresolved external symbol _IID_IExample.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 DEFINE_GUID(IID_IExample , 0x903a37ab, 0x4f59, 0x4030, 0xb8, 0xd3, 0x74, 0x2c, 0xce, 0x97, 0x24, 0xbf);
La définition de la macro DEFINE_GUID, ainsi que la définition de EXTERN_C, dans guiddef.h est la suivante :
EXTERN_C est bien définis comme étant extern et non extern "C". Je ne comprend toutefois pas pourquoi on force la déclaration d'une variable IID comme étant externe.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 #ifndef EXTERN_C #ifdef __cplusplus #define EXTERN_C extern "C" #else #define EXTERN_C extern #endif #endif #ifdef DEFINE_GUID #undef DEFINE_GUID #endif #ifdef INITGUID #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ EXTERN_C const GUID DECLSPEC_SELECTANY name \ = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } #else #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ EXTERN_C const GUID FAR name #endif // INITGUID
Si je redéclare la macro DEFINE_GUID comme suis, au début de mon code (retrait de extern), tout se passe bien.
Toutefois, cela ne me semble pas propre, et je pense que je dois avoir loupé quelque chose.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 #ifdef DEFINE_GUID #undef DEFINE_GUID #endif #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ const GUID FAR name
Pour info, je compile bien en C (fichier en .c, l'option /TC de VS
Merci de vos lumières.
Cdlt
Partager