Partager via


Ciblage de stubs pour des plateformes 32 bits ou 64 bits spécifiques

Certaines fonctionnalités de Microsoft RPC et des compilateurs MIDL versions 3.0 et ultérieures sont spécifiques à la plateforme.

Par précaution, les compilateurs MIDL versions 3.0 et ultérieures génèrent des protections qui facilitent la vérification de la compatibilité pendant la phase de compilation en C. MIDL génère deux types de protections : une protection dépendante de la plateforme (32 bits ou 64 bits) et une protection dépendante de la version (dépendance à un ensemble de fonctionnalités). Par exemple, MIDL génère la protection suivante pour empêcher la compilation en C d’un stub 32 bits pour d’autres plateformes :

#if !defined(__RPC_WIN32__)
#error  Invalid build platform for this stub.
#endif

La protection dépendante de la version est déclenchée par un ensemble de fonctionnalités présentes dans le ou les fichiers IDL traités et par le commutateur /target. Par exemple, si l’interface utilise des fonctionnalités prises en charge uniquement sur Windows 2000 ou ultérieur, MIDL génère une protection avec la macro TARGET_IS_NT50_OR_LATER.

Les macros de protection, définies dans Rpcndr.h, dépendent de la définition de WINVER et de _WIN32_WINNT et sont évaluées par le compilateur C/C++.

Si, au moment de la compilation en C, vous obtenez un message d’erreur indiquant qu’une plateforme spécifique est nécessaire pour exécuter un stub, vérifiez d’abord que vous n’avez pas utilisé une fonctionnalité qui n’est pas disponible sur cette plateforme. Les fonctionnalités qui déclenchent une protection particulière sont répertoriées dans le corps de la protection. Dans l’exemple précédent, le commutateur de compilateur -Oicf a déclenché la protection. Les fonctionnalités notables de ce type incluent le commutateur /robust et l’attribut [async] disponibles sur Windows 2000 et ultérieur, le constructeur de type pipe, l’option de compilateur /Oif ainsi que les attributs [user_marshal] et [wire_marshal]. Les stubs utilisant ces fonctionnalités ne s’exécutent pas sur des systèmes antérieurs.

Si vous savez que votre plateforme cible est adaptée aux fonctionnalités que vous utilisez et que vous recevez toujours une erreur, vous devrez peut-être définir les variables d’environnement de manière appropriée.

Pour cibler Windows 2000 ou versions ultérieures

  • Ajoutez cette ligne à votre makefile :

    CFLAGS = $(CFLAGS) -D_WIN32_WINNT=0x500
    

/target

/robust

async

async_uuid

/Oi

pipe

wire_marshal

user_marshal

Marshaling des types de données OLE