C/Visual C - usar Clase de c++ en visual basic

 
Vista:

usar Clase de c++ en visual basic

Publicado por Amit (1 intervención) el 05/04/2005 07:11:54
Hola, Quisiera saber como hacer para exportar una clase de visual c++ y usarla en visual basic. Con el visual studio 6.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:usar Clase de c++ en visual basic (1)

Publicado por fernando.gomez (1603 intervenciones) el 06/04/2005 18:41:49
¿Por qué alguien en su sano juicio querría emplear VB6? En fin... te explico. VB6 no tiene lo que propiamente conocemos como clases. Aunque al desarrollador de VB así le parezca, en realidad lo que éste ve no es otra cosa más que un componente COM. De forma muy, pero muy sutil, VB6 envuelve la implementación de interfaces IUnknown, IDispatch, IClassFactory et. al., de tal suerte que el programador no vea el proceso por detrás. Por ejemplo, el siguiente código:

Rem CMiClase es una clase hecha en vb
Dim obj As CMiClase
Dim str As String
Set obj = new CMiClase
obj.MiMetodo();
obj.Prop1 = "HOLA"
str = obj.Prop1
Set obj = Nothing

tendría el siguiente equivalente en C++:

CLSID clsidMiClase;
IMiClase* pMiClase;

CoInitialize(NULL);
_bstr_t bstrProgID = _T("MiLib.MiClase.1");
_bstr_t bstrHola;
CLSIDFromProgID(bstrProgID, &clsidMiClase);

CoCreateInstance(clsidMiClase /* identificador del componente*/,
NULL /* null = no%
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:usar Clase de c++ en visual basic (2)

Publicado por fernando.gomez (1603 intervenciones) el 06/04/2005 18:44:15
CoCreateInstance(clsidMiClase /* identificador del componente*/,
NULL /* null = no agregación*/,
CLSCTX_INPROC_SERVER /* componente dentro de libreria*/,
IID_IMICLASE,
(void**)&pMiClase
)
// suponiendo que todo fue bien...
HRESULT hRes;
hRes = pMiClase->Metodo();
if (FAILED(hRes)) { /* manejar el error */ }
hRes = pMiClase->put_Prop1(_bstr_t("HOLA"));
if (FAILED(hRes)) { /* manejar el error */ }
hRes = pMiClase->get_Prop1(&bstrHola);
if (FAILED(hRes)) { /* manejar el error */ }

/* ¿terminamos de emplear el componente? ¡TONZ LIBERALO! */
pMiClase->Release();

Qué diferencia ¿no? Claro, suponemos que IMiClase es una clase que sólo contiene métodos públicos y virtualmente puros. Además, suponemos que hay una clase que implementa, a lo menos, esta interfaz e IUnknown. Tanto la clase de implementación como la interfaz a implementar, de
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:usar Clase de c++ en visual basic (3)

Publicado por fernando.gomez (1603 intervenciones) el 06/04/2005 18:45:11
Tanto la clase de implementación como la interfaz a implementar, deberán tener sendos identificadores (CLSID, IID, etc). Además, debes exportar cuatro métodos de la DLL, (Register, CanUnloadNow, GetClassObject...) que serán llamados por CoCreateInstance... ¡Ah! Además, deberás contar con una clase que implemente IClassFactory, la cuál será la encargada de crear las instancias de la interfaz solicitada...

Un rollo enorme, ¿no? Pues así es. Ciertamente, C++ puede exportar clases normales y descentes, pero VB no las entendería, debido a sus propias limitaciones. Así, si puedes evitar el empleo de clases desde C++ a VB (o mejor aún, evitar el empleo de VB), mejor. Si no, tendrás que aprender el Component Object Model, información que podrás obtener en google y en www.msdn.microsoft.com, pero que en su parte más básica se asemeja a lo que acabo de esbozar.

NOTA: VB Net viene ya mucho más potente (entre comillas) que VB6 y hace uso de la plataforma .NET, la cuál a su vez integra COM de forma sencilla. %2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar