|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jan 2003
Città: Castellammare di Stabia (NA)
Messaggi: 2031
|
Creare e utilizzare DLL Visual C++
Salve a tutti
mi ritrovo a dover realizzare una DLL, e già qui sono in alto mare.... volevo cmq chiedervi primaditutto una cosa.... creando la DLL, ad esempio con "WIN32 Dynamic Linked Library", e facendo creare al wizard la DllMain, perchè se tento di registrarla con regsvr32, perchè mi dice che nn riesce a trovare il punto di ingresso? la DllMain creata è così (giàla conoscete, ovviamente) Codice:
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } PS: visto che nn ne so molto, conoscete guide/link/siti da consultare per imparare l'ABC? grazie a tutti
__________________
ho fatto affari con: na decina di anime ![]() |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
regsvr32.exe serve solo per registrare/deregistrare i componenti COM/ActiveX. Se devi creare una semplice DLL che esporta funzioni, non serve.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Jan 2003
Città: Castellammare di Stabia (NA)
Messaggi: 2031
|
Quote:
in effetti la mia futura DLL dovrà contenere funzioni e variabili, ma potendo includerei anche un controllo COM (MSComm in particolare) e una ActiveX (stripchart).... però se è molto + difficile n'fa niente, mi bastano già le funzioni. che fo? grazie!!!!!!!!
__________________
ho fatto affari con: na decina di anime ![]() |
|
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Codice:
BOOL WINAPI DllMain (HINSTANCE hInstDLL, DWORD dwReason, LPVOID lpReserved) { .... } __declspec(dllexport) VOID WINAPI NomeFunzione1 (....) { ... } __declspec(dllexport) VOID WINAPI NomeFunzione2 (....) { ... } ...
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jan 2003
Città: Castellammare di Stabia (NA)
Messaggi: 2031
|
ahem.....e per includere un controllo COM?
lascio perdere? PS: dichiarando le funzioni come mi hai mostrato sopra, poi per utilizzare la DLL che fo? devo utilizzare LoadLibrary? te lo chiedo perchè, in una guida per il Visual C++, consigliava di utilizzare la dunzione BOOL WINAPI DllEntryPoint, dichiarare normalmente le funzioni (senza __declspec(***) ) e poi per chiamare le funzioni della DLL, utilizzare un HINSTANCE e un puntatore alla funzione, che riceveva l'indirizzo di quest'ultima mediante GetProcAddress()... che casino!
__________________
ho fatto affari con: na decina di anime ![]() |
![]() |
![]() |
![]() |
#6 | ||
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Se fai qualche ricerca troverai sicuramente molte informazioni. Quote:
Questo è il metodo più diretto (e preferibile nella maggior parte dei casi). La libreria DLL viene caricata in modo dinamico quando l'eseguibile viene caricato dal S.O. L'alternativa è usare LoadLibrary, ma è il programmatore che deve preoccuparsi di caricare la libreria, ottenere i puntatori alle funzioni, ecc... Questo in genere va bene quando si deve gestire, ad esempio, un sistema a "plug-in" o realizzare dei tool specifici per le DLL. Se non usi __declspec(dllexport) devi comunque dichiarare le funzioni da esportare in un file .DEF (da aggiungere al progetto della DLL).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Jan 2003
Città: Castellammare di Stabia (NA)
Messaggi: 2031
|
Quote:
devo dichiarare un oggetto DLL? o mi conviene inserire tutte le funzioni in una classe dichiarata nella DLL e poi istanzio un oggetto della classe? scusa ma ho una gran confusione (come mio solito ![]() byez
__________________
ho fatto affari con: na decina di anime ![]() |
|
![]() |
![]() |
![]() |
#8 | ||
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quote:
Riprendendo l'esempio che ho fatto prima, basta che il compilatore conosca il prototipo della funzione, es: VOID WINAPI NomeFunzione1 (....); e poi la richiami semplicemente con: NomeFunzione1 (...);
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Jan 2003
Città: Castellammare di Stabia (NA)
Messaggi: 2031
|
Quote:
proverò, implementerò, riferirò ![]()
__________________
ho fatto affari con: na decina di anime ![]() |
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Jan 2003
Città: Castellammare di Stabia (NA)
Messaggi: 2031
|
ciao
allora, io per provare ho fatto una cosa del genere. Utilizzando da VC++ 6.0 la modalità "Win32 Dynamic Linked Library", scegliendo la DLL che può esportare variabili e funzioni, ho fatto così file header Codice:
#ifdef DLL1_EXPORTS #define DLL1_API __declspec(dllexport) #else #define DLL1_API __declspec(dllimport) #endif // This class is exported from the DLL1.dll class DLL1_API CDLL1 { public: CDLL1(void); // TODO: add your methods here. int Somma (int a, int b); int risultato; }; extern DLL1_API int prodotto; DLL1_API int Moltiplicazione (int x, int y); Codice:
#include "stdafx.h" #include "DLL1.h" BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } DLL1_API int Moltiplicazione(int x, int y) { int prod; prod = x * y; return prod; } // This is the constructor of a class that has been exported. // see DLL1.h for the class definition CDLL1::CDLL1() { return; } CDLL1::Somma(int a, int b) { risultato = a + b; return risultato; } ho semplicemente incluso il file .h della dll ed aggiunto al progetto il file .lib così facendo, la dll sarà utilizzabile dagli altri ambienti, come VB oppure .NET? ciao e grazie infinitamente!
__________________
ho fatto affari con: na decina di anime ![]() |
![]() |
![]() |
![]() |
#11 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Jan 2003
Città: Castellammare di Stabia (NA)
Messaggi: 2031
|
Quote:
![]() ![]() ho scoperto che ho assoluto bisogno di includere un controllo COM, e forse anche un ActiveX Ho quindi creato un progetto "MFCAppWizard Dll", come una Regular DLL che usa le MFC in modo shared però questa come la uso? se inserisco le funzioni che mi servono nella classe CDLLMFCApp (supponendo che la DLL l'abbia chiamata DLLMFC.dll), come devo usarla in un progetto dell'applicazione? ovviamente (credo) facendo in modo di creare un oggetto CDLLMFCApp nell'applicazione, mi dà errore di link (ho fatto #include "DLLMFC.h" ed inserito il file DLLMFC.lib) help! ![]()
__________________
ho fatto affari con: na decina di anime ![]() |
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Jan 2003
Città: Castellammare di Stabia (NA)
Messaggi: 2031
|
Quote:
non riesco nemmeno a dichiarare un oggetto CString o COleVariant, mi dice C:\RGB\WelchAllynDLL\WelchAllynDLL.h(107) : error C2146: syntax error : missing ';' before identifier 'str1' C:\RGB\WelchAllynDLL\WelchAllynDLL.h(107) : fatal error C1004: unexpected end of file found dove avevo scritto extern WELCHALLYNDLL_API CString str1; se dichiaro solo CString str1; mi dice "missing type specific"
__________________
ho fatto affari con: na decina di anime ![]() |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:43.