2011-01-04 6 views
7

Devo supportare una vecchia app scritta in C usando il vecchio Borland Compiler (BC 5).Utilizzo di una DLL di Visual C++ nel vecchio Borland C?

Sfortunatamente la vecchia libreria TCP/IP che abbiamo usato sta iniziando a mostrare la sua età e sta avendo problemi con le macchine Vista & Win7.

Ho una nuova libreria di funzioni disponibili per MS Visual C++, e mi piacerebbe utilizzare che per fare una DLL che sarebbe richiamabile dal Borland C.

Così, ho 2 problemi: 1) come rendere una DLL di Visual C++ richiamabile da un programma Borland C, e 2) se è callable, come chiamare le funzioni C++ da plain old C?

Idealmente, l'intero progetto dovrebbe essere convertito in Visual C, ma ci sono molte funzionalità legacy che renderanno questo progetto un'impresa importante! Sto cercando un rapido patch per tenerlo in vita per un po ':)

Steve

+0

Hai ancora il compilatore C Borland? In tal caso, puoi provare a ridurre l'area di contatto tra l'app e la libreria. –

risposta

6

Scrivi una DLL utilizzando Visual C++ che espone la sua interfaccia di funzioni di Windows STDCALL C. Le funzioni dell'API di Windows vengono eseguite in modo simile. Quelle funzioni che esponi nell'interfaccia eseguiranno le funzioni che devi sostituire nel tuo programma. All'interno della DLL, chiamare la nuova libreria MS VC++ con l'abbandono.

in modo da ottenere una funzione che è richiamabile da C e usa stack di protocollo STDCALL fare qualcosa di simile:

extern "C" int __stdcall foo();

si dovrà anche aggiungere informazioni a esportare la funzione dalla DLL. Si potrebbe fare questo in modo esplicito nella dichiarazione in quanto tale:

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

ma avrete bisogno di un file di intestazione separato per l'uso nel codice BorlandC (che probabilmente ha sintassi diversa per specificare la parte DLL importazione e l'STDCALL parte). In Visual C++ la dichiarazione usereste nel client sarebbe simile:

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

2

È possibile creare Borland OMF libaries di importazione con l'utility IMPLIB di Borland: IMPLIB -a "whatever.omf" "whatever.dll ", dove il file DLL è quello creato da MSVC.

L'opzione -a è per la compatibilità Microsoft. L'OMF generato (il formato di file di libreria di importazione di Borland), combinato con un file di intestazione che specifica le funzioni esportate e le relative convenzioni di chiamata dovrebbero funzionare ... (Credo che IMPLIB fosse in C++ Builder 5.)

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