Newsgroup: it.comp.programmare.win32
Titolo: Creare e usare una dll (Borland C++ Compiler 5.6)

Sto cercando di creare e usare una dll con il Borland C++
Compiler 5.6 (quello del C++Builder 6, ma a linea di comando,
per intenderci)
Allora... faccio questo:
// file "provadll1.cpp"
extern "C" __declspec(dllexport) int somma(int x, int y)
{
    return (x+y);
};
extern "C" __declspec(dllexport) int prodotto(int x, int y)
{
    return (x*y);
};
lo compilo con il comando:
"bcc32 -P -WD provadll1.cpp"
e ne ottengo il file "provadll1.dll"
A questo punto con i comandi:
"impdef -acf provadll1.def provadll1.dll"
e
"implib -acf provadll1.lib provadll1.dll"
creo i due file .lib e .def
Bene...
Adesso vorrei usarla, la DLL.
// file "usadll1.cpp"
#include <iostream>
using std::cout;
__declspec(dllimport) int somma(int X, int Y);
int main()
{
    int a = 2;
    int b = 3;
    int c;
    c = somma(a,b);
    cout << c;
}
lo compilo con il comando
"bcc32 usadll1.cpp provadll1.lib"
ma mi dice che:
"Error: Unresolved external '_somma(int, int)' referenced from
E:\PROGRAMMAZIONE\C++\DLL\USADLL1.OBJ"
dove sbaglio?
Ultima domanda: i __declspec(...) sono una sintassi della Borland
o li prendono anche gli altri compilatori per Windows?
(insomma... questo è il metodo generale per la creazone di dll?)
grazie anticipate per le risposte.
--
Gerolamo

"Gerolamo" ha scritto
: Sto cercando di creare e usare una dll con il Borland C++
: Compiler 5.6 (quello del C++Builder 6, ma a linea di comando,
: per intenderci)
:
: Allora... faccio questo:
:
: // file "provadll1.cpp"
:
: extern "C" __declspec(dllexport) int somma(int x, int y)
: {
:     return (x+y);
: };
:
...
: __declspec(dllimport) int somma(int X, int Y);
: int main()
: {
:     int a = 2;
:     int b = 3;
:     int c;
:     c = somma(a,b);
:     cout << c;
: }
:
: lo compilo con il comando
: "bcc32 usadll1.cpp provadll1.lib"
: ma mi dice che:
: "Error: Unresolved external '_somma(int, int)' referenced from
: E:\PROGRAMMAZIONE\C++\DLL\USADLL1.OBJ"
:
: dove sbaglio?
Non sono sicuro, ma mi pare che nel codice della dll dichiari somma come
una funzione C, mentre nel main la dichiari, implicitamente, come C++ e
quindi il linker la cerca decorata. Devi usare sempre la stessa naming
convention, calling convention etc. Non conoscendo gli switch da linea
di comando potrebbe essere un altro l'errore. Ad ogni modo, io preferisco
specificare esplicitamente sia la naming che la calling convention, in modo
che non venga modificata con qualche opzione di compilazione.
Considera che si usa extern "C", soprattutto perche` si vuole usare la dll
non solo da codice C++, per cui di solito si prepara un header apposito
in cui si testa #ifdef __cplusplus, #ifdef __DLL__ etc. Per esempio potresti
fare qualcosa tipo:
#ifndef FILE_H
#define FILE_H
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __DLL__ // Questo puo` dipendere dai compilatori
#define MY_EXPORT __declspec(dllexport) __stdcall
#else
#define MY_EXPORT __stdcall
#endif
int MY_EXPORT somma(int x, int y);
int MY_EXPORT prodotto(int x, int y);
#ifdef __cplusplus
}
#endif
#endif
ed includerlo sia quando compili la dll che l'exe che la usa, e cosi`
facendo, dovrebbe andare bene anche se vuoi includerla in programmi C,
L'uso della stdcall dovrebbe permetterti di chiamarla anche da VB, etc.
il .cpp diventera` (+ o -):
#include "file.h"
int MY_EXPORT somma(int x, int y)
{
    return (x+y);
}
:
: Ultima domanda: i __declspec(...) sono una sintassi della Borland
: o li prendono anche gli altri compilatori per Windows?
: (insomma... questo è il metodo generale per la creazone di dll?)
mi sembra che __declspec sia abbastanza generale, semmai e` quello che
ci metti dentro che puo` essere particolare, ma questo e` un campo dove
c'e` ampia liberta` di innovare e rinnovare ...
ciao
Massimo

 convention, calling convention etc.
EUREKA!
era proprio quello l'errore!
Ti ringrazio anche per gli altri utilissimi suggerimenti che mi hai dato!
Saluti
--
Gerolamo
"Pongo X = Y    =>    X = Y / Pongo"
(Anonimo su un banco del Politecnico di Milano)