Visual C++ .NET - Problema con conversion de llamadas

 
Vista:

Problema con conversion de llamadas

Publicado por ezequiel (1 intervención) el 24/11/2008 23:16:26
Hola por favor les agradecería muchísimo si me pudiesen ayudar con este problema...
Bueno resulta que estoy implentando una dll en c++.net que encapsula llamados a una dll win32, desarrollada en C++ estándar.
Dicha dll tiene una función:

__declspec(dllexport) int APIENTRY Funcion(int x, int (*progressFunc)(UINT64 *tamanoTotal,UINT64 *tamanoRestaurado))


Ahora dentro de C++.net tengo una clase con una funcion:
Int MyFunc(UIN64* xval, UINT64* yval){
//do something
}

Necesito invocar en C++.net la Funcion de la dll win32:

Int i = Funcion(25, MyFunc);

Pero me da el siguiente palo:
Error 1 error C2664: 'Funcion' : cannot convert parameter 2 from 'int (__clrcall *)(UINT64 *,UINT64 *)' to 'int (__cdecl *)(UINT64 *,UINT64 *)'


Me gustaría por favor me dieran una solución para este problema, atentamente.
Ezequiel.
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

Solución para la conversión de punteros de función entre DLL Win32 y C++/CLI

Publicado por Alejandro (265 intervenciones) el 06/02/2024 21:16:37
¡Hola Ezequiel!

Entiendo tu problema. Parece que estás enfrentando un problema de compatibilidad de tipos de punteros de función entre la DLL de Win32 y tu código en C++/CLI. Para resolver esto, puedes utilizar un `delegate` para envolver la función de C++/CLI y luego convertirlo a un puntero de función estándar de C++ en la llamada a `Funcion`. Aquí te dejo un ejemplo de cómo podrías hacerlo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <vcclr.h>
 
// Declaración del delegate en C++/CLI
delegate int ProgressDelegate(UINT64* tamanoTotal, UINT64* tamanoRestaurado);
 
public ref class MyWrapperClass
{
public:
    // Función que será utilizada como método de la clase y que se asocia al delegate
    int MyFuncWrapper(UINT64* xval, UINT64* yval)
    {
        // Hacer algo en C++/CLI
        // ...
 
        return 0; // Retorna un valor por ejemplo
    }
};
 
// Función de la DLL de Win32
extern "C" __declspec(dllexport) int APIENTRY Funcion(int x, int (*progressFunc)(UINT64 *tamanoTotal, UINT64 *tamanoRestaurado))
{
    // Llamada a la función de la DLL de Win32
    // Se utiliza el delegate como adaptador
    return progressFunc(nullptr, nullptr);
}
 
int main()
{
    // Crear una instancia de la clase envoltorio
    MyWrapperClass^ wrapperInstance = gcnew MyWrapperClass();
 
    // Crear un delegate que apunta al método de la clase
    ProgressDelegate^ progressDelegate = gcnew ProgressDelegate(wrapperInstance, &MyWrapperClass::MyFuncWrapper);
 
    // Convertir el delegate a un puntero de función estándar de C++
    int (*progressFunc)(UINT64*, UINT64*) = static_cast<int (*)(UINT64*, UINT64*)>(Marshal::GetFunctionPointerForDelegate(progressDelegate).ToPointer());
 
    // Llamada a Funcion con el puntero de función convertido
    int result = Funcion(25, progressFunc);
 
    // Hacer algo con el resultado
    // ...
 
    return 0;
}

Este ejemplo utiliza un `delegate` para envolver la función `MyFuncWrapper` de la clase `MyWrapperClass`. Luego, convierte ese delegate a un puntero de función estándar de C++ antes de pasarlo a la función `Funcion` de la DLL de Win32.

Espero que esto resuelva tu problema.
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