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.
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);
Le problème est que le linker butte sur la non résolution de la variable externe Error LNK2001 unresolved external symbol _IID_IExample.
La définition de la macro DEFINE_GUID, ainsi que la définition de EXTERN_C, dans guiddef.h est la suivante :
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
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.

Si je redéclare la macro DEFINE_GUID comme suis, au début de mon code (retrait de extern), tout se passe bien.
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
Toutefois, cela ne me semble pas propre, et je pense que je dois avoir loupé quelque chose.
Pour info, je compile bien en C (fichier en .c, l'option /TC de VS

Merci de vos lumières.
Cdlt