Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Polestar 3 Performance, test drive: comodità e potenza possono convivere
Polestar 3 Performance, test drive: comodità e potenza possono convivere
Abbiamo passato diversi giorni alla guida di Polestar 3, usata in tutti i contesti. Come auto di tutti i giorni è comodissima, ma se si libera tutta la potenza è stupefacente
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
In occasione del proprio Architecture Deep Dive 2025 Qualcomm ha mostrato in dettaglio l'architettura della propria prossima generazione di SoC destinati ai notebook Windows for ARM di prossima generazione. Snapdragon X2 Elite si candida, con sistemi in commercio nella prima metà del 2026, a portare nuove soluzioni nel mondo dei notebook sottili con grande autonomia
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
DJI Mini 5 Pro porta nella serie Mini il primo sensore CMOS da 1 pollice, unendo qualità d'immagine professionale alla portabilità estrema tipica di tutti i prodotti della famiglia. È un drone C0, quindi in un peso estremamente contenuto e che non richiede patentino, propone un gimbal rotabile a 225 gradi, rilevamento ostacoli anche notturno e autonomia fino a 36 minuti. Caratteristiche che rendono il nuovo drone un riferimento per creator e appassionati
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 29-06-2006, 10: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, 11: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, 11: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, 11: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, 11: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, 12: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, 14: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, 14: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, 14: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, 15: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, 16: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, 17: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, 13: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


Polestar 3 Performance, test drive: comodità e potenza possono convivere Polestar 3 Performance, test drive: comodit&agra...
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026 Qualcomm Snapdragon X2 Elite: l'architettura del...
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice Recensione DJI Mini 5 Pro: il drone C0 ultra-leg...
ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
LG UltraFine evo 6K: il primo monitor al...
DJI cambia direzione: investe in Elegoo ...
Black Friday Narwal 2025: risparmi da ca...
Phishing evoluto contro Apple ID: caso f...
Prestazioni in discesa nei giochi? NVIDI...
Addio ai banner dei cookie? L'UE spinge ...
Le offerte Black Friday per gli smartpho...
Il controllo qualità degli iPhone...
Qualcomm Snapdragon X Elite vola con il ...
A2RL Season 2: storia, innovazione e sor...
Core Ultra Series 3: Intel conferma l'ev...
Black Friday Amazon: la GeForce RTX 5070...
EcoFlow, il Black Friday porta grande ri...
Gli sconti più pesanti del Black ...
Smart #5 BRABUS segna il nuovo record di...
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: 19:20.


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