2010-06-10 12 views
5

Je travaille sur un projet et j'ai besoin de créer une API. J'utilise des sockets pour communiquer entre le serveur (mon application) et les clients (les autres applications utilisant mon API).Comment masquer les fonctions d'assistance de l'API publique dans c

Ce projet est en C++ C ne

Je viens d'un fond de linux et ceci est mon premier projet à l'aide de Windows, Visual Studio 2008, et les bibliothèques dll.

J'ai une communication qui fonctionne entre le client et le serveur, mais j'en ai une qui est dupliquée sur les deux projets. Je voudrais créer une bibliothèque (probablement un fichier dll), que les deux projets peuvent lier afin que je ne dois pas maintenir le code supplémentaire.

Je dois aussi créer la bibliothèque qui a l'API que je dois mettre à la disposition de mes clients. Dans les fonctions de l'API que je veux public sont les appels à ces fonctions auxiliaires qui sont du "code dupliqué", je ne veux pas exposer ces fonctions à mon client, mais je veux que mon serveur puisse utiliser ces fonctions. Comment puis-je faire ceci?

Je vais essayer de clarifier avec un exemple. C'est ce que j'ai commencé avec.

Project Server:

int Server_GetPacket(SOCKET sd); 
int ReceiveAll(SOCKET sd, char *buf, int len); 
int VerifyLen(char *buf); 

Projet Client:

int Client_SendCommand(int command); 
int Client_GetData(int command, char *buf, int len); 
int ReceiveAll(SOCKET sd, char *buf, int len); 
int VerifyLen(char *buf); 

C'est un peu ce que je voudrais terminer par:

//Server Project: 
int Server_GetPacket(SOCKET sd); 

// library with public and private types 
// private API (not exposed to my client) 
int ReceiveAll(SOCKET sd, char *buf, int len); 
int VerifyLen(char *buf); 
// public API (header file available for client) 
int Client_SendCommand(int command); 
int Client_GetData(int command, char *buf, int len); 

Merci toute aide serait appréciée .

Répondre

1

Si vous placez les fonctions «privées» dans une DLL et que vous les appelez de manière externe par des moyens normaux (par exemple appelables par un processus qui charge la bibliothèque), elles seront également «publiques» pour les autres. Il est possible d'obscurcir les noms et les choses de ce genre, mais ce n'est probablement pas une bonne solution.

Il est peut-être préférable de les placer dans une bibliothèque liée statiquement par opposition à une DLL. Notez, cependant, que même dans ce cas, quelqu'un peut désassembler le binaire et accéder au code.

+0

Je suis plus préoccupé par la fourniture d'une API propre qui ne contient que les fonctions publiques. Je veux juste éviter que toutes les fonctions d'aide fassent partie de l'API. Voulez-vous dire que je crée une bibliothèque statique pour les fonctions "privées" et que je mets les fonctions "public API" dans une DLL? – emge

+0

@emge: C'est une possibilité. Cela dépend de votre architecture de développement si cela a du sens. Une solution "plus simple" consisterait simplement à inclure les fichiers source dans votre projet et à les construire directement dans le binaire. Ensuite, créez la DLL API publique en tant que projet distinct avec les fonctions exportées souhaitées. –

+0

Merci, j'aime la solution "plus simple", mais comment contourner le problème d'avoir du code dupliqué si j'inclue juste le fichier source dans mon projet et que la DLL API doit utiliser certaines de ces mêmes fonctions? – emge

5

Utilisez

static int ReceiveAll(SOCKET sd, char *buf, int len); 

etc pour rendre les fonctions locales dans le fichier/unité de compilation.

+0

Si je déclare les fonctions privées comme statiques et les place dans une bibliothèque, serais-je capable de l'appeler à partir de mon projet Server, c'est-à-dire de Server_GetPacket()? – emge

+0

Les fonctions dans le même * fichier * les verront. Les autres ne le feront pas. –

0

Si vous souhaitez exposer uniquement certaines fonctions de votre DLL, vous pouvez créer un fichier d'exportation (nom_dll) que vous attribuez à l'éditeur de liens lors de la génération du projet. Ce fichier d'exportation contient une liste des fonctions que vous souhaitez rendre publiques aux applications utilisant votre DLL.

Voir l'article MSDN here pour plus d'informations à ce sujet.

Je pense que vous pouvez également obtenir des fonctionnalités similaires en utilisant le mot-clé __declspec(dllexport) sur les fonctions que vous souhaitez exporter.