C/Visual C - Uso de componentes cOM

 
Vista:

Uso de componentes cOM

Publicado por Antonio (2 intervenciones) el 13/03/2003 22:42:20
He hecho una DLL Com con Visual Basic para llamarla desde Visual C.
Con la directiva #import unicamente tengo acceso a los procedimientos mediante Clase::Procedimiento, el compilador me da un error por ser una llamda ilegal a una funcion no estatica.
Con Load Library y GetProcAddress , esta no me reconoce el nombre de la funcion.
Alguien puede indicarme por donde ir.
Gracias Antonio
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
Imágen de perfil de Alejandro

Problemas al llamar funciones de una DLL COM desde Visual C++

Publicado por Alejandro (1153 intervenciones) el 09/05/2025 20:20:07
Cuando trabajas con una DLL COM creada en Visual Basic y deseas llamarla desde Visual C++, hay varios aspectos a considerar. Aquí te dejo algunos pasos y recomendaciones para solucionar los problemas que mencionas:

1. Verifica la exportación de funciones en la DLL COM



Asegúrate de que las funciones que deseas llamar desde Visual C++ están correctamente exportadas en tu DLL COM. En Visual Basic, las funciones deben ser declaradas como `Public` para que sean accesibles. Además, asegúrate de que estás utilizando la sintaxis correcta para la exportación.

2. Uso de `#import`



Cuando utilizas `#import`, asegúrate de que estás importando correctamente la biblioteca de tipos (TLB) generada por tu DLL COM. La sintaxis básica es:

1
#import "ruta_a_tu_dll.tlb" no_namespace

Después de importar, puedes acceder a las clases y métodos de la DLL. Si el compilador te da un error sobre funciones no estáticas, verifica que estás llamando a los métodos de la clase correctamente. Por ejemplo:

1
2
3
4
5
6
7
8
// Crear una instancia de la clase
CComPtr<IMyClass> pMyClass;
HRESULT hr = pMyClass.CoCreateInstance(__uuidof(MyClass));
 
// Llamar a un método
if (SUCCEEDED(hr)) {
    pMyClass->MyMethod();
}

3. Uso de `LoadLibrary` y `GetProcAddress`



Si decides usar `LoadLibrary` y `GetProcAddress`, ten en cuenta que estas funciones son más adecuadas para DLLs no COM. Para DLLs COM, es mejor usar `CoCreateInstance` para crear instancias de las clases. Sin embargo, si necesitas usar `GetProcAddress`, asegúrate de que las funciones están exportadas correctamente y que estás utilizando el nombre correcto.

Para exportar funciones en una DLL, puedes usar un archivo de definición (.def) o la directiva `__declspec(dllexport)` en el código de la DLL.

4. Ejemplo de uso de `CoCreateInstance`



Aquí tienes un ejemplo básico de cómo crear una instancia de una clase COM y llamar a un método:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <windows.h>
#include <comdef.h>
#include "tu_dll.tlh" // Archivo generado por #import
 
int main() {
    CoInitialize(NULL); // Inicializa COM
 
    // Crear una instancia de la clase
    IMyClassPtr pMyClass;
    HRESULT hr = pMyClass.CreateInstance(__uuidof(MyClass));
 
    if (SUCCEEDED(hr)) {
        // Llamar a un método
        pMyClass->MyMethod();
    } else {
        // Manejo de errores
        _com_error err(hr);
        MessageBox(NULL, err.ErrorMessage(), L"Error", MB_OK);
    }
 
    CoUninitialize(); // Desinicializa COM
    return 0;
}

5. Depuración y verificación



- Asegúrate de que la DLL está registrada correctamente en el sistema. Puedes usar `regsvr32` para registrar la DLL si es necesario.
- Verifica que la versión de la DLL que estás utilizando es la correcta y que no hay conflictos de versiones.
- Si sigues teniendo problemas, considera usar herramientas como `Dependency Walker` para verificar las dependencias de la DLL y asegurarte de que todas están presentes.

Espero que estas recomendaciones te ayuden a resolver los problemas que estás enfrentando al llamar a tu DLL COM desde Visual C++. ¡Buena suerte, Antonio!
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