Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio
Grazie ad un mocio rotante che viene costantemente bagnato e pulito, Narwal Flow assicura un completo e capillare lavaggio dei pavimenti di casa. La logica di intellignza artificiale integrata guida nella pulizia tra i diversi locali, sfruttando un motore di aspirazione molto potente e un sistema basculante per la spazzola molto efficace sui tappeti di casa
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi
Con un prezzo di 2.999 euro, il Panasonic Z95BEG entra nella fascia ultra-premium dei TV OLED: pannello Primary RGB Tandem, sistema di raffreddamento ThermalFlow, audio Technics integrato e funzioni gaming avanzate lo pongono come un punto di riferimento
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione
Abbiamo provato per diverse settimane il nuovo Magic V5 di HONOR, uno smartphone pieghevole che ci ha davvero stupito. Il device è il più sottile (solo 4.1mm) ma non gli manca praticamente nulla. Potenza garantita dallo Snapdragon 8 Elite, fotocamere di ottima qualità e batteria in silicio-carbonio che garantisce un'ottima autonomia. E il Prezzo? Vi diciamo tutto nella nostra recensione completa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 29-06-2006, 09:28   #1
swarm
Senior Member
 
L'Avatar di swarm
 
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;
}
che devo fare in più?

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
swarm è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2006, 10:17   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da swarm
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?
Ma devi sviluppare una DLL "normale" (che esporta solo funzioni) o una DLL che contiene componenti COM/ActiveX???

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%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2006, 10:21   #3
swarm
Senior Member
 
L'Avatar di swarm
 
Iscritto dal: Jan 2003
Città: Castellammare di Stabia (NA)
Messaggi: 2031
Quote:
Originariamente inviato da andbin
Ma devi sviluppare una DLL "normale" (che esporta solo funzioni) o una DLL che contiene componenti COM/ActiveX???

regsvr32.exe serve solo per registrare/deregistrare i componenti COM/ActiveX. Se devi creare una semplice DLL che esporta funzioni, non serve.
grazie, mi hai chiarito un primo dubbio...

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
swarm è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2006, 10:38   #4
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da swarm
però se è molto + difficile n'fa niente, mi bastano già le funzioni.

che fo?
Per esportare solo funzioni in genere si fa così (esempio):
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%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2006, 10:58   #5
swarm
Senior Member
 
L'Avatar di swarm
 
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
swarm è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2006, 11:16   #6
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da swarm
ahem.....e per includere un controllo COM?
Beh, la cosa è un po' più complicata ... comunque io non sono esperto di COM e ActiveX e quindi non so dirti più di tanto.
Se fai qualche ricerca troverai sicuramente molte informazioni.

Quote:
Originariamente inviato da swarm
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!
Quando viene creata una DLL, il linker dovrebbe anche crearti un file .LIB che è la "import library" cioè una piccola libreria statica che dovrai usare, in fase di link, negli altri progetti in cui vuoi usare la DLL.
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%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2006, 13:00   #7
swarm
Senior Member
 
L'Avatar di swarm
 
Iscritto dal: Jan 2003
Città: Castellammare di Stabia (NA)
Messaggi: 2031
Quote:
Quando viene creata una DLL, il linker dovrebbe anche crearti un file .LIB che è la "import library" cioè una piccola libreria statica che dovrai usare, in fase di link, negli altri progetti in cui vuoi usare la DLL.
in pratica faccio le stesse cose come se fosse una libreria statica?

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
swarm è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2006, 13:23   #8
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da swarm
in pratica faccio le stesse cose come se fosse una libreria statica?
Più o meno .... la import library non contiene del codice ma solo i simboli e le informazioni che permetteno al linker di creare un eseguibile in modo tale che al suo avvio, possa poi caricare le DLL necessarie.

Quote:
Originariamente inviato da swarm
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
No, non serve fare cose così complicate. Se in tuo altro progetto utilizzi la import library che hai creato, devi richiamare le funzioni nel modo normale, come per qualunque altra funzione!

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%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2006, 13:42   #9
swarm
Senior Member
 
L'Avatar di swarm
 
Iscritto dal: Jan 2003
Città: Castellammare di Stabia (NA)
Messaggi: 2031
Quote:
Originariamente inviato da andbin
Più o meno .... la import library non contiene del codice ma solo i simboli e le informazioni che permetteno al linker di creare un eseguibile in modo tale che al suo avvio, possa poi caricare le DLL necessarie.

No, non serve fare cose così complicate. Se in tuo altro progetto utilizzi la import library che hai creato, devi richiamare le funzioni nel modo normale, come per qualunque altra funzione!

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 (...);
grazie!

proverò, implementerò, riferirò
__________________
ho fatto affari con: na decina di anime
swarm è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2006, 14:55   #10
swarm
Senior Member
 
L'Avatar di swarm
 
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);
mentre il file cpp è

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 provato in un'applicazione dialog e funziona tutto, sia usando semplicemente le funzioni esportate, sia dichiarando un oggetto della classe creata.

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
swarm è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2006, 15:39   #11
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da swarm
così facendo, la dll sarà utilizzabile dagli altri ambienti, come VB oppure .NET?
si, è una normalissima DLL
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2006, 16:02   #12
swarm
Senior Member
 
L'Avatar di swarm
 
Iscritto dal: Jan 2003
Città: Castellammare di Stabia (NA)
Messaggi: 2031
Quote:
Originariamente inviato da 71104
si, è una normalissima DLL
me tapino!

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
swarm è offline   Rispondi citando il messaggio o parte di esso
Old 30-06-2006, 12:08   #13
swarm
Senior Member
 
L'Avatar di swarm
 
Iscritto dal: Jan 2003
Città: Castellammare di Stabia (NA)
Messaggi: 2031
Quote:
Originariamente inviato da swarm
me tapino!

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!
raga vi prego aiutatemi!

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
swarm è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio Narwal Flow: con il mocio orizzontale lava i pav...
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi Panasonic 55Z95BEG cala gli assi: pannello Tande...
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione HONOR Magic V5: il pieghevole ultra sottile e co...
Recensione Google Pixel 10 Pro XL: uno zoom 100x assurdo sempre in tasca (e molto altro) Recensione Google Pixel 10 Pro XL: uno zoom 100x...
Lenovo IdeaPad Slim 3: un notebook Snapdragon X economico Lenovo IdeaPad Slim 3: un notebook Snapdragon X ...
Nuova immagine della cometa interstellar...
Router TP-Link compromessi da vulnerabil...
Google aggiorna Cerchia e Cerca: traduzi...
Anker protagonista a IFA 2025 con robot ...
I computer classici sono multi-core, e l...
Google Foto anima i tuoi scatti: arriva ...
Street Fighter: svelato il cast completo...
Microsoft rinvia le ISO di Windows 11 25...
TCL presenta NXTPAPER 60 Ultra e MOVETIM...
Il ritorno di Honda Prelude in chiave el...
Windows 11: disponibile finalmente lo st...
Oggi su Amazon ci sono 27 articoli super...
Ecco qui le migliori offerte sugli smart...
Mark Zuckerberg contro Mark Zuckerberg: ...
Amazon Seconda Mano (ex Warehouse): scon...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 13:43.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v