Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare
Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare
Realizzato da Lenovo e installato presso il Cineca di Casalecchio di Reno, Pitagora offre circa 44 PFlop/s di potenza di calcolo ed è dedicato alla simulazione della fisica del plasma e allo studio dei materiali avanzati per la fusione, integrandosi nell’ecosistema del Tecnopolo di Bologna come infrastruttura strategica finanziata da EUROfusion e gestita in collaborazione con ENEA
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA
Rullo di lavaggio dei pavimenti abbinato a un potente motore da 28.000 Pa e a bracci esterni che si estendono: queste, e molte altre, le caratteristiche tecniche di Z60 Ultra Roller Complete, l'ultimo robot di Mova che pulisce secondo le nostre preferenze oppure lasciando far tutto alla ricca logica di intelligenza artificiale integrata
Renault Twingo E-Tech Electric: che prezzo!
Renault Twingo E-Tech Electric: che prezzo!
Renault annuncia la nuova vettura compatta del segmento A, che strizza l'occhio alla tradizione del modello abbinandovi una motorizzazione completamente elettrica e caratteristiche ideali per i tragitti urbani. Renault Twingo E-Tech Electric punta su abitabilità, per una lunghezza di meno di 3,8 metri, abbinata a un prezzo di lancio senza incentivi di 20.000€
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 26-07-2005, 23:17   #1
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
importazione classi da DLL

in un header ho dichiarato alcune classi astratte, contenenti solo metodi puri virtuali (virtual bla bla bla = 0); questo header l'ho incluso sia in un certo eseguibile, sia in una certa DLL; la DLL naturalmente avrà le sue classi derivate da quelle astratte contenute in questo header che forniranno le rispettive implementazioni, ed esporterà delle opportune funzioni che, chiamate dall'eseguibile, serviranno ad istanziare queste classi.

ora io mi chiedevo: è possibile fare in modo che di una certa classe una parte venga implementata dalla DLL e una parte dall'eseguibile? in pratica alcune funzioni di una certa classe non sono pure virtuali, ma sono normali funzioni (virtuali volendo, ma non è necessario e non credo nemmeno sia possibile nel mio caso) implementate dall'eseguibile; il codice di queste funzioni dunque nella DLL non appare, e questo già temo che sia un problema perché impedirebbe il linking, dico bene?

altrimenti pensavo di creare una classe derivata anche all'interno dell'eseguibile, in maniera tale da poter implementare alcune funzioni, solo che la rispettiva funzione esportata dalla DLL mi istanzierebbe la *sua* classe derivata, non la mia... :\

come posso risolvere? è possibile quello che chiedo? o andrebbe fatto necessariamente in maniera "manuale", cioè lavorando di puntatori a funzioni in runtime?

thx.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 26-07-2005, 23:42   #2
okay
Senior Member
 
Iscritto dal: Feb 2002
Messaggi: 906
Quote:
Originariamente inviato da 71104
in un header ho dichiarato alcune classi astratte, contenenti solo metodi puri virtuali (virtual bla bla bla = 0); questo header l'ho incluso sia in un certo eseguibile, sia in una certa DLL; la DLL naturalmente avrà le sue classi derivate da quelle astratte contenute in questo header che forniranno le rispettive implementazioni, ed esporterà delle opportune funzioni che, chiamate dall'eseguibile, serviranno ad istanziare queste classi.

ora io mi chiedevo: è possibile fare in modo che di una certa classe una parte venga implementata dalla DLL e una parte dall'eseguibile? in pratica alcune funzioni di una certa classe non sono pure virtuali, ma sono normali funzioni (virtuali volendo, ma non è necessario e non credo nemmeno sia possibile nel mio caso) implementate dall'eseguibile; il codice di queste funzioni dunque nella DLL non appare, e questo già temo che sia un problema perché impedirebbe il linking, dico bene?

altrimenti pensavo di creare una classe derivata anche all'interno dell'eseguibile, in maniera tale da poter implementare alcune funzioni, solo che la rispettiva funzione esportata dalla DLL mi istanzierebbe la *sua* classe derivata, non la mia... :\

come posso risolvere? è possibile quello che chiedo? o andrebbe fatto necessariamente in maniera "manuale", cioè lavorando di puntatori a funzioni in runtime?

thx.

qualsiasi dll è un'eseguibile a parte ed è estraneo all'exe principale nei metodi e classi.
La dll può essere chiamata dall'exe dalle funzioni che vengono esportate.

Per esempio se crei un oggetto nel progetto che richiama la dll per far vedere l'oggetto alla dll devi passare il puntatore dell'oggetto tramite funzione alla dll e magari renderlo globale nella dll. Se per esempio nei calcoli della dll l'oggetto perde il focus (lost device per esempio) dal progetto chiamante bisogna fare in modo di ripassare il puntatore dell'oggetto alla dll.

Un'altro esempio è un oggetto creato invece dalla dll esso non è visto dal progetto chiamate se non con un ritorno del suo indirizzo e opportunamente inizializzato cioè non a NULL per le operazioni da fare intendo.

L'exe principale (chiamante) ha un suo ciclo di vita mentre la dll ne ha un'altro.
La dll (se viene passato l'oggetto da progetto principale e il suo indirizzo) la dll può accederci.

Le classi non possono essere viste dalla dll e le classi della dll non hanno influenza sull'exe chiamante
okay è offline   Rispondi citando il messaggio o parte di esso
Old 27-07-2005, 11:05   #3
The3DProgrammer
Senior Member
 
Iscritto dal: May 2000
Messaggi: 1459
uhm

secondo me, se la DLL usa le funzioni nn definite nella sua dichiarazione di classe, ovviamente ci sono problemi di link (correggo, + che di link di undeclared identifier, in quanto la funzione proprio nn esiste) come hai detto tu. Se invece nn usa queste funzioni e viene implementata una funzione che ritorna un puntatore ad un'istanza di quella classe, potrebbero cmq esserci problemi di type conversion, questo xkè anke se hanno lo stesso nome, alla fine sono due classi diverse. Anche se il compilatore nn si accorgerebbe del problema in quanto il linking con la DLL è dinamico ( e il puntatore che avrai definito alla funzione nella DLL avrà come tipo di ritorno un puntatore alla classe presente nell'eseguibile, il che è perfettamente lecito) nn so cosa potrebbe succedere a runtime (potresti fare una bella prova usando dynamic_cast).

ciauz
The3DProgrammer è offline   Rispondi citando il messaggio o parte di esso
Old 27-07-2005, 11:08   #4
The3DProgrammer
Senior Member
 
Iscritto dal: May 2000
Messaggi: 1459
tra l'altro, ma xkè vuoi rovinarti la vita facendoti ste domande?

skerzo ciauz
The3DProgrammer è offline   Rispondi citando il messaggio o parte di esso
Old 27-07-2005, 11:15   #5
The3DProgrammer
Senior Member
 
Iscritto dal: May 2000
Messaggi: 1459
cancella i primi 2 post

nn avevo capito bene la domanda

quindi tu dici che la dichiarazione della classe è identica per eseguibile e DLL (quindi le funzioni dichiarate ci sono tutte) ma mancano alcune definizioni di funzioni, che viceversa sono presenti nell'eseguibile? Se si, allora secondo me potrebbe anke funzionare, a patto ke la DLL nn usi le funzioni non definite (cosa ke porterebbe a problemi di linkage). Il tutto, sempre col beneficio del dubbio

scusa, ma mi sono appena alzato e ho avuto una brutta notizia ( ho preseo un brutto voto a basi di dati )

ciauz
The3DProgrammer è offline   Rispondi citando il messaggio o parte di esso
Old 27-07-2005, 11:40   #6
The3DProgrammer
Senior Member
 
Iscritto dal: May 2000
Messaggi: 1459
mi ha pigliato sta cosa

appena provato, e funziona perfettamente

ora metto il codice del progetto
The3DProgrammer è offline   Rispondi citando il messaggio o parte di esso
Old 27-07-2005, 11:51   #7
The3DProgrammer
Senior Member
 
Iscritto dal: May 2000
Messaggi: 1459
ecco il progetto, scritto in 5 minuti quindi potrei aver fatto qualke baggianata

cmq, secondo me funziona xkè come saprai, le funzioni di una classe, una volta compilate, sono funzioni standard con calling convention __thiscall (quindi con push di this in cima allo stack prima della chiamata). Di conseguenza, alla chiamata del metodo, viene chiamata la funzione presente nell'eseguibile, passando come this l'oggetto creato dalla DLL. Spero di aver kapito quello ke intendevi e di nn aver detto un mare di baggianate

ciauz
Allegati
File Type: zip prova.zip (7.1 KB, 5 visite)
The3DProgrammer è offline   Rispondi citando il messaggio o parte di esso
Old 27-07-2005, 12:52   #8
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
dunque, si, funziona, però la DLL non implementa nulla della classe A; era proprio questo il mio problema: l'eseguibile deve implementare alcune funzioni, la DLL ne deve implementare altre; ora faccio delle prove sul tuo progetto (cmq grazie per l'aiuto, sei stato molto gentile ).

PS, x okay: ma che hai detto?!?
hai scritto cose per metà non inerenti e per l'altra metà apparentemente errate...
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 27-07-2005, 13:03   #9
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
nah, non ci riesco, non linka, come supponevo; e se lavoro con le funzioni pure virtuali poi non posso manco istanziare la classe derivata perché la DLL non implementa alcune delle funzioni pure virtuali (appunto).
non c'è un modo di risolvere questo problema? o devo necessariamente applicare un altro design?

un altro design che mi viene in mente è il seguente: eliminare dalla classe originale (chiamiamola A) le funzioni che devono essere implementate nell'eseguibile, e metterle in un altra classe (facciamo B) la quale ha anche come variabile membro un puntatore a un'istanza di A ottenuta dalla DLL.

unico contro: la DLL non può chiamare le funzioni implementate dall'exe; non che mi serva a dir la verità, però insomma, potrebbe sempre rivelarsi una limitazione... non esistono design migliori?

thx
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 27-07-2005, 13:42   #10
okay
Senior Member
 
Iscritto dal: Feb 2002
Messaggi: 906
si rileggendo il mio post noto che è scritto alla buona, comunque intendevo come uso io dll e lib e cioè funzioni esterne chiamate e gestite da altri exe o progetti senza riscrivere lo stesso codice è per questo che sono nati tali moduli. Oppure celare funzioni e quindi algoritmi da non far vedere a chi usa tale dll e lib nei propri progetti ecc. ecc.

Ho capito che vuoi leggere le classi e i metodi dell'exe dalla dll e/o viceversa.

1. per fare questo non servono moduli esterni dll o lib in quanto implementi tutto sul progetto principale.
2. Il programma chiamante non può accedere alla dll o lib nelle sue classi e o metodi e viceversa in quanto sono 2 circuiti chiusi, di comunicazione il chiamante non ha l'entry point della dll o lib che è un'altro programma appartenente solo a se stesso la dll o lib ha il suo entry point e le varie tabelle delle funzioni esportate a cui può accedere il chiamante solo per passare argomenti o variabili che nella funzione verranno elaborate.
3. Io pure per un pò ci persi tempo ma non è possibile non ci sono riuscito (certo che se ci riesci fammelo sapere)

Per questo motivo tratto dll e lib per il lavoro a cui sono dedicate e cioè chiamo le funzioni della dll e lib e ritorno al chiamante.

ciao
okay è offline   Rispondi citando il messaggio o parte di esso
Old 27-07-2005, 21:29   #11
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
ehm... ti capisco sempre meno...

Quote:
Originariamente inviato da okay
si rileggendo il mio post noto che è scritto alla buona, comunque intendevo come uso io dll e lib e cioè funzioni esterne chiamate e gestite da altri exe o progetti senza riscrivere lo stesso codice è per questo che sono nati tali moduli.
ma che c'entra... -.-'
i file che condivido tra il progetto della DLL e quello dell'eseguibile sono solo headers, mica sorgenti...

Quote:
1. per fare questo non servono moduli esterni dll o lib in quanto implementi tutto sul progetto principale.
scusa tu che ne sai del mio progetto... a me serve che quelle classi siano implementate in librerie esterne perché non devo essere io ad implementarle; o meglio, io ne implemento una versione, ma devo prevedere la futura possibilità che altre persone (o anche io stesso) possano implementarne altre e aggiornare il programma senza riavviarlo (te la faccio breve: si tratta di un server con dei plugins che potranno essere installati e rimossi dinamicamente).
quindi il fatto che quelle classi stiano in librerie a parte a me serve eccome...

Quote:
2. Il programma chiamante non può accedere alla dll o lib nelle sue classi e o metodi e viceversa in quanto sono 2 circuiti chiusi di comunicazione,
questo discorso non ha senso...
a parte il fatto che una volta caricato il modulo nel mio processo nessuno mi impedisce di andare a smanazzare nella sua sezione di dati, pur non conoscendone il suo layout e il significato di ogni singolo byte (infatti i dangling pointers "intra-process" a volte sono pericolosi anche in modalità protetta, non c'è niente da fare...); ma a parte questo non vedo perché una DLL non possa esportare una classe... i moduli possono esportare i simboli che vogliono.

Quote:
il chiamante non ha l'entry point della dll o lib
leggiti le specifiche del formato PE: l'offset dell'entry point sta scritto nell'Optional Header (opzionale dei file obj ma richiesto in qualsiasi immagine) e lo puoi leggere direttamente dalla RAM quando ti pare; sommandolo all'HMODULE del modulo hai l'indirizzo paro paro.

Quote:
che è un'altro programma appartenente solo a se stesso
delirio...
deja vu: una frase del genere l'ho scritta una volta anche a un'altra persona, ma giuro che questo adesso è molto peggio...

Quote:
la dll o lib ha il suo entry point e le varie tabelle delle funzioni esportate
dico, vabbè che in teoria in un file PE possono esserci fino a 96 sezioni, ma ora non montiamoci la testa... qualsiasi linker mi genera una sola sezione .edata...

Quote:
a cui può accedere il chiamante solo per passare argomenti o variabili che nella funzione verranno elaborate.
e se a quella mente bacata di chiamante venisse tante volte in mente di cancellare queste 700000 tabelle chi gli impedirebbe di farlo?
e se volesse riscriverle a suo piacimento in maniera tale da dirottare le chiamate di funzioni (tecnica peraltro molto usata da alcuni tipi di virus)?

Quote:
3. Io pure per un pò ci persi tempo ma non è possibile non ci sono riuscito (certo che se ci riesci fammelo sapere)
se ti riferisci all'esportare classi ci sono riuscito 1000 volte; se ti riferisci all'esportare classi implementate solo parzialmente non ci riesco manco io (bisogna necessariamente lavorare di puntatori a funzioni in runtime).

Quote:
Per questo motivo tratto dll e lib per il lavoro a cui sono dedicate e cioè chiamo le funzioni della dll e lib e ritorno al chiamante.
scusa, ma a parte tutto, tu sai cos'è un lib?

Ultima modifica di 71104 : 27-07-2005 alle 21:33.
71104 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare Cineca inaugura Pitagora, il supercomputer Lenov...
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA Mova Z60 Ultra Roller Complete: pulisce bene gra...
Renault Twingo E-Tech Electric: che prezzo! Renault Twingo E-Tech Electric: che prezzo!
Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media Il cuore digitale di F1 a Biggin Hill: l'infrast...
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica DJI Osmo Mobile 8: lo stabilizzatore per smartph...
Lo compri una volta, lo giochi dove vuoi...
Qiantinuum annuncia Helios, "il com...
Samsung Galaxy S26 Ultra: una sola novit...
Google prepara Gemini 3 Pro e Nano Banan...
TVS non è solo moto e scooter: ec...
Alexa+ arriva su BMW: gli automobilisti ...
Gemini Deep Research arriva su Google Fi...
Rinvii a catena, Marvel 1943: Rise of Hy...
Xiaomi inaugura uno spazio dedicato ai f...
Rilasciate le specifiche di Bluetooth 6....
L'obiettivo che mette tutto a fuoco: la ...
Meta avrebbe raccolto fino al 10% dei ri...
NVIDIA DGX Spark e videogiochi? Una pess...
Serie Oppo Reno15 confermata: arriva il ...
UPDF 2025: l'editor PDF che fa (quasi) t...
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: 01:24.


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