Utilizzare DLL VB6 in VC++.NET

mercoledì 19 aprile 2006 - 19.20

pakone Profilo | Newbie

Salve a tutti!!!
Ho creato una DLL ActiveX in VB6, che mette a disposizione una classe, ed ho bisogno di utilizzare questa classe in un progetto VC++.NET. Premesso che non conosco quasi per niente il C++, ho provato ad aggiungere il riferimento scegliendo dall'albero della solution Add Reference, poi fra gli oggetti COM ho trovato la mia DLL ed ho aggiunto il riferimento (visibile sempre sull'albero). Adesso come faccio ad usare questo riferimento?
Sono sicuro che è una cosa banale, ma sto diventando matto tra guide e forum, non riesco a venirne a capo! Non sono riuscito a trovare la soluzione neanche in questo forum.
Qualcuno mi può aiutare???

Grazie a tutti!

Brainkiller Profilo | Guru

>Salve a tutti!!!
>Ho creato una DLL ActiveX in VB6, che mette a disposizione una
>classe, ed ho bisogno di utilizzare questa classe in un progetto
>VC++.NET. Premesso che non conosco quasi per niente il C++,

Se non conosc per niente il C++ dove vuoi andare ?
Non è un linguaggio per niente banale. Se poi aggiungi che stai lavorando con un oggetto COM... buona notte al secchio.

>Sono sicuro che è una cosa banale, ma sto diventando matto tra
>guide e forum, non riesco a venirne a capo! Non sono riuscito
>a trovare la soluzione neanche in questo forum.
>Qualcuno mi può aiutare???

Dalla mia esperienza per lavorare con COM sotto Visual C++ bisogna chiamare funzioni quali la CoInitializeEx() e poi la CoCreateInstanceEx() prova a vedere le documentazione e ti accorgerai che non è per niente banale:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/html/ffb79c0f-aeda-4ea1-aea8-afb79109837f.asp
http://msdn.microsoft.com/library/en-us/com/html/3b414b95-e8d2-42e8-b4f2-5cc5189a3d08.asp

ciao

David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/

pakone Profilo | Newbie

Ciao e grazie per l'attenzione!!!
Mi hai spaventato un pò, con la tua risposta
Ora vado a dare un'occhiata a quegli articoli che mi hai indicato, però prima volevo chiederti una cosa, visto che sei così gentile e che sei MVP: stavo smanettando un pò per cercare di capirci qualcosa, ed ero arrivato ad importare la DLL nel C++ con
#import "MyDll.dll"
a questo punto mi fa vedere MyDll come namespace, e se provo a dichiarare una variabile scrivendo
MyDll::
l'intellisense mi va vedere la classe che volevo (però c'è un underscore, non so che vuol dire... MyDll::_MyClass).
Fin qui tutto ok (tutto ok?), ma se lancio il software mi dice che non posso istanziare una classe astratta, quindi non funziona in nessuno dei seguenti modi:
MyDll::_MyClass MyVar
MyDll::_MyClass *MyVar ... MyVar = new MyDll::_MyClass
Ti viene in mente qualcosa?

Grazie infinite!!!



E' passato un pò di tempo, ho provato a seguire gli articoli, ma in realtà non ci capisco molto, perchè non riportano esempi di nessun tipo...

Brainkiller Profilo | Guru

Ciao,
purtroppo non so darti nessun altro aiuto perchè come anticipavo il mondo del VC++ non è assolutamente banale e neanche io conosco bene. Ho fatto alcune cose in passato con molta fatica. Il linguaggio C/C++ ANSI è decisamente più facile. Ma VC++ è decisamente più complesso.

Ciao


David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/

pakone Profilo | Newbie

Ciao a tutti!!!
Se vi può interessare, ho risolto il problema.
In fondo il VC++ è complicatissimo, è vero, però bisogna anche dire che ci sono degli strumentini a disposizione niente male... basta poi aggiungere un pò di bravura... e il gioco è fatto!
Credo che questa soluzione funzioni anche con gli ocx, non dovrebbero esserci grosse differenze.
Allora, per cominciare bisogna aggiungere una classe al nostro progetto VC++ cliccando col destro sull'albero della Solution e scegliendo Add Class. A questo punto abbiamo a disposizione una serie di scelte abbastanza ampia. Bisogna selezionare Add Class From TypeLib e dalla maschera che segue, cercare la DLL maledetta (deve essere registrata!) e selezionare le interfacce che si vogliono utilizzare. Ora il VC++ crea un header che contiene una mini classe che si chiama come la classe della DLL e ha gli stessi metodi (non ho provato ad aggiungere un evento, ma credo che funzioni comunque). Fino a qui niente di speciale, credo. Bastava smanettare un pò.
Ora il difficile (x me...) è utilizzare questa classe, perchè se è vero che la genera da solo, è anche vero che non funziona così com'è. Bisogna chiamare il metodo CreateDispatch per utilizzarla veramente (che poi forse è banale, ma x me non lo è stato!).
Es:
#include "MyClass.h" //MyClass.h è il file generato dall'Add Class
...
MyClass MyVar;
if (!MyVar.CreateDispatch("MyDll.MyClass"){
//non è stato possibile generare l'interfaccia
return FALSE;
}else{
//è stata correttamente generata l'interfaccia
return TRUE;
}
A questo punto possiamo utilizzare la nostra classe senza alcun problema.
Spero che questo post possa far risparmiare un pò di tempo a qualcuno, io ne ho perso tantissimo!

Ciao!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5