Newsgroup: it.comp.programmare.win32
Titolo: Usare DLL in Borland

Ciao a tutti,
ho creato una semplice dll in Borland RAD studio 2007, contenente due 
funzioni:
int somma(int);
double sqr(double);
ma poi quando cerco di utilizzare le funzioni esportate dalla dll 
ottengo dal compilatore "Call to undefined function somma" e "Call to 
undefined function sqr". Qualcuno sa dirmi perchè?
Grazie.
Riporto di seguito i sorgenti.
//---------------------------------------------------------------------------
//ProvaDll.cpp
#pragma hdrstop
#include <cstdlib>
#include <iostream>
#include <windows.h>
#pragma argsused
typedef double __stdcall (*f1)(double);
typedef int __stdcall (*f2)(int);
int main(int argc, char* argv[])
{
f1 funz1;
f2 funz2;
HINSTANCE mlib = LoadLibrary("DllTemplate.dll");
funz1 = (f1)GetProcAddress(mlib,"sqr");
funz2 = (f2)GetProcAddress(mlib,"somma");
sqr(2.5);
somma(3);
system("PAUSE");
return EXIT_SUCCESS;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//DllMain.cpp
#pragma argsused
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
	return 1;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//dll.cpp
#pragma hdrstop
#include "dll.h"
int somma(int a) {return (a+2);}
double sqr(double x){return (x*2.5);}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//dll.h
#ifndef dllH
#define dllH
#endif
#define EXPORT _declspec(dllexport)
#define extEXPORT extern "C" __declspec(dllexport)
int EXPORT somma(int a);
double extEXPORT sqr(double x);
//---------------------------------------------------------------------------

Chiedo scusa in dll.h è
extEXPORT double sqr(double x);
non
double extEXPORT sqr(double x);
in ogni caso l'errore permane.
Aspidus ha scritto:


 somma(3);
Non ho tempo per provare al momento, ma forse dovrebbe essere:
funz1(2.5);
funz2(3);
Perchè è chiaro che sqr() e somma() non sono definite...
Inoltre, controlla i valori di ritorno di LoadLibrary e 
GetProcAddress!
HTH,
-- 
Stefano Frosio
www.esse-effe.com

undefined function sqr". Qualcuno sa dirmi perchč?
Le funzioni vanno dichiarate extern "C" ,a memoria non ricordo se in
entrambi i casi cioe sia nella dichiarazione che nella definizione,
tu ne hai dichiarata solo una e in ogni caso mi sembra che il
compilatore Borland includa per default un underscore davanti ai nome
delle funzioni esportate.
Per superare ambiguita circa i nomi delle funzioni puoi usare gli
ordinal value.

Grazie Stefano e grazie xnoise,
in effetti con i vostri due appunti ho risolto il problema e riesco a 
richiamare le funzioni esportate dalla Dll di test creata da un 
programma esterno.
E' doveroso precisare inoltre che
extern "C" __declspec(dllexport)
va specificato solo nella definizione mentre non serve nella dichiarazione.
La soluzione (in codice)per chi fosse interessato č:
//dll.h
#define EXPORT extern "C" __declspec(dllexport)
EXPORT int somma(int a);
EXPORT double sqr(double x);
Ora perň mi chiedevo un'altra cosa:
Se volessi inglobare nella dll una classe ed esportarne i metodi come 
dovrei fare?
E' corretto scrivere
//dll.h
#define classEXPORT _declspec(dllexport)
class classEXPORT Matematica
{
private:
	int constante
public:
	float multiplica(float);
};

 ordinal value.
Io utilizzerei un file di definizioni. Cosa che a mio parere 
andrebbe sempre fatta quando si crea una DLL.
-- 
Stefano Frosio
www.esse-effe.com

 metodi come dovrei fare?
Qui trovi una traccia: 
http://dn.codegear.com/article/20165
.
Però, per evitare problemi di compatibilità tra compilatori 
diversi, penso (e non lo penso solo io) sia meglio esportare 
funzioni "C pure" che fungano da wrapper verso le chiamate vere 
e proprie ai metodi delle classi all'interno della DLL. Ci sono 
anche altre tecniche, ma sono comunque dei workaround.
-- 
Stefano Frosio
www.esse-effe.com