n° 219
Novembre 2017
Dicembre 11, 2017, 09:07:33 *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  


* Messaggi recenti
Messaggi recenti
Pagine: [1] 2   Vai giù
  Stampa  
Autore Discussione: Info sulla funzione CreateObject  (Letto 7122 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
AngeloF
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 15


Mostra profilo
« inserita:: Dicembre 30, 2013, 01:22:54 »

Salve a tutti,
ho delle domande da porre alla vostra cortese atenzione :

In un progetto vb6 viene usata la funzione CreateObject per creare dinamicamente una istanza alla classe di una DLL (un oggetto COM), vorrei sapere da voi, se è possibile, come fa questa funzione a rintracciare la DLL interessata se ci sono più DLL uguali nel SO?
Rintraccia, per caso, l'ultima DLL registrata con regsvr32?
C'è un metodo per risalire all'oggetto che vado ad istanziare effettivamente?
Registrato
VBeXtreme
Sr. Member
****

Karma: +18/-106
Scollegato Scollegato

Messaggi: 700


Mostra profilo
« Risposta #1 inserita:: Dicembre 30, 2013, 02:52:43 »

Non rintraccia l'ultima ma calcola il guid (che è una stringa non ripetibile se non per quel programma) che identifica l'oggetto com in generale.
Tutte queste guid le trovi elencate nel registro di sistema sotto "HKEY_CLASSES_ROOT\CLSID"
Registrato

//Sorry limit 300 char
#include <stdio.h>
int main(){int m[5] = {707406378,42,0x58454256,1296388692,69};int o;int(*e)(const char*,...)=printf;for(o=0;o<0x97;o++)e("%s",(char*) m);e("%s",(char*)&m[2]);for(o=0;o<0x97;o++)e("%s",(char*)m);e("*");return 0;}
AngeloF
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 15


Mostra profilo
« Risposta #2 inserita:: Dicembre 30, 2013, 05:02:50 »

Dunque se ho, per esempio, due versioni di una DLL nel mio HardDisk, una meno aggiornata dell'altra, quale di queste due DLL andrà a considerare ?


NB:
Ti faccio questa domanda perchè in un mio programma creo un'istanza di una classe con CreateObject, però, quest'istanza non si comporta come si dovrebbe, ed ho il dubbio che si riferisca a qualche versione non aggiornata della stessa DLL.
Registrato
VBeXtreme
Sr. Member
****

Karma: +18/-106
Scollegato Scollegato

Messaggi: 700


Mostra profilo
« Risposta #3 inserita:: Dicembre 30, 2013, 05:53:07 »

se la libreria è la stessa llora la vecchia versione viene cancellata e viene lasciata la nuova versione.
Solo nel .net possono convivere librerie di versioni differenti.
Registrato

//Sorry limit 300 char
#include <stdio.h>
int main(){int m[5] = {707406378,42,0x58454256,1296388692,69};int o;int(*e)(const char*,...)=printf;for(o=0;o<0x97;o++)e("%s",(char*) m);e("%s",(char*)&m[2]);for(o=0;o<0x97;o++)e("%s",(char*)m);e("*");return 0;}
AngeloF
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 15


Mostra profilo
« Risposta #4 inserita:: Dicembre 30, 2013, 06:36:50 »

La sostituzione fra la vecchia versione e la nuova avviene con il comando di registrazione Regsvr32 ?
Registrato
VBeXtreme
Sr. Member
****

Karma: +18/-106
Scollegato Scollegato

Messaggi: 700


Mostra profilo
« Risposta #5 inserita:: Dicembre 30, 2013, 06:58:43 »

propabilmente regsvr32 rimuove il vecchio guid per lasciar spazio al nuovo.Dovresti controllare nel tuo registro di sistema cosa è successo
Registrato

//Sorry limit 300 char
#include <stdio.h>
int main(){int m[5] = {707406378,42,0x58454256,1296388692,69};int o;int(*e)(const char*,...)=printf;for(o=0;o<0x97;o++)e("%s",(char*) m);e("%s",(char*)&m[2]);for(o=0;o<0x97;o++)e("%s",(char*)m);e("*");return 0;}
AngeloF
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 15


Mostra profilo
« Risposta #6 inserita:: Dicembre 30, 2013, 07:14:59 »

Esiste solo il percorso che mi interessa
Registrato
VBeXtreme
Sr. Member
****

Karma: +18/-106
Scollegato Scollegato

Messaggi: 700


Mostra profilo
« Risposta #7 inserita:: Dicembre 30, 2013, 08:30:01 »

Bene allora se hai dei problemi risiedono da qualche altra parte.
Registrato

//Sorry limit 300 char
#include <stdio.h>
int main(){int m[5] = {707406378,42,0x58454256,1296388692,69};int o;int(*e)(const char*,...)=printf;for(o=0;o<0x97;o++)e("%s",(char*) m);e("%s",(char*)&m[2]);for(o=0;o<0x97;o++)e("%s",(char*)m);e("*");return 0;}
AngeloF
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 15


Mostra profilo
« Risposta #8 inserita:: Dicembre 30, 2013, 09:25:29 »

Nel dettaglio il problema è questo :

ci sono 2 vbp:

Nel 1° la mia classe viene istanziata dinamicamente, tramite createobject :


  Set ObjEvent1 = CreateObject("EventHandler.CUserEvent")



Nel 2° invece c'è un riferimento a EventHandler(che ha la classe) :

qui, in una classe che mi servirà c'è questo codice :

Public WithEvents ObjEvent2  As CUserEvent

A questo punto, in una terza classe c'è del codice che assegna a objEvent2 il riferimento a objEvent1, è qui che scoppia l'errore, VB6 mi dice che i due tipi non si corrispondono, come mai, se nel mio Hardisk esiste solo EventHandler che punta ad un percorso definito?

PS
L'unica cosa che posso dirti, è che nel gruppo di progetti che sto debuggando c'è anche il progetto della EventHandler(se lo tolgo tutto funziona perfettamente, ma a me interessa debuggare proprio questa DLL).
Registrato
VBeXtreme
Sr. Member
****

Karma: +18/-106
Scollegato Scollegato

Messaggi: 700


Mostra profilo
« Risposta #9 inserita:: Dicembre 31, 2013, 09:28:20 »

Non si possono gestire gli eventi quando si creano gli oggetti con la createobject.
Questo è un errore che porta ad errori difficilmente riconoscibili.
Quindi copiare un oggetto creato con la create object in un oggetto dichiarato "with events" è un errore.
Registrato

//Sorry limit 300 char
#include <stdio.h>
int main(){int m[5] = {707406378,42,0x58454256,1296388692,69};int o;int(*e)(const char*,...)=printf;for(o=0;o<0x97;o++)e("%s",(char*) m);e("%s",(char*)&m[2]);for(o=0;o<0x97;o++)e("%s",(char*)m);e("*");return 0;}
AngeloF
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 15


Mostra profilo
« Risposta #10 inserita:: Dicembre 31, 2013, 11:08:16 »

Questo codice non l'ho creato io, avevo qualche dubbio su questa situazione, con la tua risposta hai chiarito tutto, grazie.
La cosa strana è che il compilato funziona perfettamente, mentre in Debug il codice si comporta in modo anomalo.
Registrato
VBeXtreme
Sr. Member
****

Karma: +18/-106
Scollegato Scollegato

Messaggi: 700


Mostra profilo
« Risposta #11 inserita:: Dicembre 31, 2013, 01:42:46 »

il debug fallisce perchè è un metodo non supportato.
Il compilato può funzionare per svariati motivi,però non è certo consigliabile usare tale metodo.
Registrato

//Sorry limit 300 char
#include <stdio.h>
int main(){int m[5] = {707406378,42,0x58454256,1296388692,69};int o;int(*e)(const char*,...)=printf;for(o=0;o<0x97;o++)e("%s",(char*) m);e("%s",(char*)&m[2]);for(o=0;o<0x97;o++)e("%s",(char*)m);e("*");return 0;}
AngeloF
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 15


Mostra profilo
« Risposta #12 inserita:: Dicembre 31, 2013, 02:16:02 »

Quindi devo per forza usare il riferimento alla DLL, se essa contiene Eventi che mi interessa usare, non posso fare istanze con CreateObject se voglio usare gli eventi ?
Registrato
VBeXtreme
Sr. Member
****

Karma: +18/-106
Scollegato Scollegato

Messaggi: 700


Mostra profilo
« Risposta #13 inserita:: Dicembre 31, 2013, 02:43:46 »

esatto,esiste però un accrocchio funzionante in rete, guarda qui
Registrato

//Sorry limit 300 char
#include <stdio.h>
int main(){int m[5] = {707406378,42,0x58454256,1296388692,69};int o;int(*e)(const char*,...)=printf;for(o=0;o<0x97;o++)e("%s",(char*) m);e("%s",(char*)&m[2]);for(o=0;o<0x97;o++)e("%s",(char*)m);e("*");return 0;}
AngeloF
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 15


Mostra profilo
« Risposta #14 inserita:: Gennaio 02, 2014, 12:38:22 »

Basta saperlo prima e si mette il riferimento, si evitano eventuali problemi. grazie
Registrato
Pagine: [1] 2   Vai su
  Stampa  
 
Vai a:  

Copyright © 2017 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



powered by Simple Machines