2011-01-04 3 views
7

Je dois supporter une ancienne application écrite en C en utilisant l'ancien compilateur Borland (BC 5).Utilisation d'une DLL Visual C++ dans l'ancien Borland C?

Malheureusement, l'ancienne bibliothèque TCP/IP que nous avions utilisée commence à montrer son âge et rencontre des problèmes avec les machines Win7 de Vista &.

J'ai une nouvelle bibliothèque de fonctions disponibles pour MS Visual C++, et je voudrais l'utiliser pour faire une DLL qui serait appelable de la Borland C

Donc, j'ai 2 questions: 1) comment rendre une DLL Visual C++ appelable à partir d'un programme Borland C, et 2) si elle est appelable, comment appeler les fonctions C++ à partir de C ancien plaine?

Idéalement, l'ensemble du projet devrait être converti en Visual C, mais il y a beaucoup de fonctionnalités qui feront de ce projet une entreprise majeure! Je suis à la recherche d'un patch rapide pour le garder en vie pendant un certain temps plus :)

Steve

+0

Avez-vous toujours le compilateur borland C? Si c'est le cas, vous pouvez essayer de réduire la zone de contact entre l'application et la bibliothèque. –

Répondre

6

Écrire un DLL en utilisant Visual C++ qui expose son interface en tant que fonctions de Windows STDCALL C. Les fonctions de l'API Windows sont similaires. Les fonctions que vous exposez dans l'interface exécuteront les fonctions que vous devez remplacer dans votre programme. Dans la DLL, appelez la nouvelle bibliothèque MS VC++ avec abandon.

Donc, pour obtenir une fonction qui est appelable de C et utilise le protocole de pile STDCALL faire quelque chose comme ceci:

extern "C" int __stdcall foo();

vous devez également ajouter des informations à exporter la fonction de la DLL. Vous pouvez le faire explicitement dans la déclaration en tant que telle:

extern "C" __declspec(dllexport) int __stdcall foo();

Mais vous aurez besoin d'un fichier d'en-tête séparé pour une utilisation dans votre code BorlandC (qui a probablement une syntaxe différente pour spécifier la partie d'importation DLL et STDCALL partie). Dans Visual C++ la déclaration que vous souhaitez utiliser dans le client ressemblerait à quelque chose comme:

extern "C" __declspec(dllimport) int __stdcall foo();

2

Vous pouvez créer Borland OMF à l'importation avec d'abord des bibliothèques utilitaire IMPLIB de Borland: IMPLIB "de whatever.omf" de « whatever.dll ", où le fichier DLL est celui créé par MSVC.

L'option -a est compatible avec Microsoft. Le format OMF (Borland's import library library), combiné avec un fichier d'en-tête qui spécifie les fonctions exportées et leurs conventions d'appel devrait fonctionner ... (je crois que IMPLIB était dans C++ Builder 5.)

http://docs.embarcadero.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate4/EN/html/devwin32/implib_xml.html