2013-04-16 5 views
1

J'écris une DLL qui va exporter des fonctions et des classes. Mais pour l'instant j'ai une question sur les fonctions d'exportation.Win32 DLL Export Fonction Paramètre Best Practice

Si ma signature de la fonction ressemble:

__declspec(dllexport) int fn1(FILE *theFile); 

Dois-je inclure il définit FILE? Quelle est la meilleure pratique ici? Et si je veux exporter une fonction qui prend ou renvoie un type personnalisé, le fichier d'en-tête de ces types doit-il être également inclus dans le fichier d'en-tête exporté?

+1

Cela ressemble plus à une question sur les meilleures pratiques pour les fichiers d'en-tête en général et n'a pas vraiment quelque chose à voir avec les DLL ou avec Windows. – jamesdlin

+0

Notez que si vous utilisez un FICHIER * sur plusieurs modules, vous devez vous assurer que tous ces modules utilisent la même DLL CRT. –

Répondre

5

Ne pas rediriger les types et les fonctions de bibliothèque standard. C'est ce que les en-têtes de bibliothèque sont prévus. Votre fichier doit être aménagé comme:

#ifndef MYLIBRARY_H 
#define MYLIBRARY_H 

#ifdef MYLIBRARY_EXPORTS 
#define MYLIBRARY_EXPORT __declspec(dllexport) 
#else 
#define MYLIBRARY_EXPORT __declspec(dllimport) 
#endif 

// required headers 
#include <stdio.h> 

// exported/imported functions 
MYLIBRARY_EXPORT int fn1(FILE *theFile); 

#endif 

Votre projet DLL est construit avec MYLIBRARY_EXPORTS défini dans le cadre ou les macros préprocesseur définies (configurable de plusieurs façons), et les consommateurs de votre DLL ne pas définir.

Ceci est la disposition commune que MS utilise pour ses générateurs de projets DLL en boîte. Pensez à faire de même dans vos projets. Surtout, incluez les en-têtes standard requis pour votre bibliothèque afin de définir correctement ce dont elle a besoin et ce qu'elle fournit.

+0

Qu'en est-il d'un type personnalisé comme la question posée? –

2

Un fichier d'en-tête doit généralement être autonome. Les clients qui consomment votre fichier d'en-tête ne doivent pas savoir qu'ils ont besoin d'une ligne #include "xyz.h" avant d'inclure votre propre en-tête. (Et imaginez si cet autre en-tête xyz.h faisait la même chose, et ainsi de suite.Vous devriez connaître une commande stricte pour tous les fichiers d'en-tête, ce qui serait un cauchemar.)

Cependant, vous n'avez pas nécessairement besoin de #include en-têtes pour certains types que vous utilisez. Par exemple, vous pourriez peut-être utiliser des déclarations directes à la place.