Newsgroup: it.comp.lang.delphi
Titolo: Ancora Dll scritte in C++ e richiamate da Delphi.

Ho scritto questa funzione di prova di una DLL in c++ che voglio richiamare
da un mio programma Deplhi.
Il C++ usato č il Borland C++ 3.0 e il Delphi
e il 4.0.
#include "vcl.h"
#include "project1.h"
#pragma hdrstop
//-------------------------------------------------------------------------
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
return 1;
}
//-------------------------------------------------------------------------
int prova(int pluto)
{
  return pluto+100;
}
il file project1.h č:
#ifdef __BUILDING_THE_DLL
#define __EXPORT_TYPE __export
#else
#define
__EXPORT_TYPE __import
#endif
void __EXPORT_TYPE prova();
Il
problema č che mi richiede questi componenti quando la richiamo da delphi:
- borlndmm.dll;
- cp3240mt.dll;
- vcl35.bpl;
ed infine non me la trova
come entri point sulla libreria.
Aiuto per favore!!!!!!!!!
--------------------------------
Inviato via 
http://usenet.iol.it

...

Il problema non e` di delphi(almeno credo).Ho avuto lo stesso problema
che fondamentalmente risiede nel codice C++. Dovresti vedere(aprendo
la dll) con un programma  tipo Depends del visualstudio come viene
esportata la tua funzione: mi spiego,se ha il nome decorato o se in
chiaro. Sicuramente la tua ha il nome decorato e devi cercare di
esportarla in chiaro.Per nome decorato intendo una cosa del genere: 
prova@48@yuw. Se non ricordo male per esportarla in chiaro devi dire
al compilatore che la funzione la esporti in C e non in C++.
Spero ti sia stato di aiuto ciao :) elio


compilato con B 5.5
#include <windows.h>
#pragma hdrstop
int WINAPI DllEntryPoint(HINSTANCE /*hinst*/, unsigned long reason, void*)
{
    if (reason == DLL_PROCESS_ATTACH) {
        // inizializzazioni
    }
    else if (reason == DLL_PROCESS_DETACH) {
    }
    return 1;
}
file .h
#include <windows.h>
extern "C"
{
// tue funzioni da esportare
 bool WINAPI foo1()  ;
 const char * WINAPI foo2 () ;
} // extern C
#endif
file.cpp
#pragma hdrstop
#pragma package(smart_init)
__declspec(dllexport)
bool WINAPI foo1 ()
{
}
__declspec(dllexport)
const char * WINAPI foo2 ()
{
}

Il 13 Feb 2002, 08:00, "mskt" <x...@yyy.zz> ha scritto: 
il problema
rimane quello cioč:
mi richiede ancora la libreria vcl35.bpl;
se tolgo
dalla testa l'include <vcl.h> mi dice che ho fatto una multiple declaration
di WINAPI;
dove sbaglio?


 ha scritto nel messaggio
news:217Z58Z46Z90Y1...@usenet.iol.it...

se ti posso essere utile ti mando la unit delphi
unit DllImport;
interface
uses
    Classes ;
const
  nome_DLL = 'd:\Applicazioni\CPP\nome_libreria.dll';
function foo1() : boolean ; stdcall;
function foo2() : pChar; stdcall;
implementation
uses
    SysUtils, Dialogs;
function foo1() : boolean ;  external  nome_DLL;
function foo2() : pChar;  external  nome_DLL;
end.

 Spero ti sia stato di aiuto ciao :) elio
Nota sui nomi "decorati"...
Il C++ permette l'overloading delle funzioni, cioč definire due o piů
funzioni con lo stesso nome ma con argomenti diversi per numero e tipo.
La cosa viene gestita a livello di linking proprio rinominando i nomi di
funzione in base a quali e quanti argomenti accettano (i nomi "decorati").
Per questo motivo devi dichiarare la tua funzione prova come extern "C":
cioč devi dire al compilatore di trattarla come una normale funzione C
non overloaded, in modo che il compi non la rinomini automaticamente.
In alternativa, dovresti prendere nota del nome C++ (quello "decorato")
e usare quello per chiamarla da Delphi...

 Il C++ permette l'overloading delle funzioni,
Nota alla nota: non e' un problema strettamente legato
all'overloading delle funzioni.  I membri di classe
subiscono la stessa cosa, cosi' come le normali funzioni.
E' il meccanismo type-safe tipico del C++.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG