carga dinámicamente un dll que utiliza los métodos de aplicaciones

Quiero cambiar y probar mi función dll construir para una aplicación sin cerrar y comenzar constantemente la aplicación misma, que toma mucho tiempo. Por lo tanto Construyo un dll de llamada para la aplicación a cargar, y otro dll de pruebas (que carga dinámicamente), donde puedo cambiar mi función de prueba en tiempo real, sin cerrar la aplicación. La aplicación carga automáticamente la llamada dll, donde puedo cargar dinámicamente mi prueba dll y llamar a una función vacía con éxito:

llamando a Dll:

typedef void(__stdcall *test_func)(void);
HINSTANCE hdl = LoadLibraryA("C:\\testingfunction.dll");
test_func func = (test_func) GetProcAddress(hdl, "?testingfunc@@YAXXZ");
func();

En la función de prueba dll tengo: función de prueba.h

#define DLL_API _declspec(dllexport)
DLL_API void __stdcall testingfunc();

función de prueba.cpp

DLL_API void __stdcall testingfunc()
{
    double a = 3 * 4.2;
    //PlugIn::gResultOut << "  ...I am alive... " << std::endl;

return;
}

Así que si se comenta la línea de impresión, la función funciona en la aplicación, lo que significa que no se bloquea. Pero cuando descomiendo la línea de impresión, la aplicación se bloquea. Parece que no puedo utilizar los métodos y funciones de la aplicación misma. ¿Cómo arreglaría esto? ¿Necesito usar __declspec(dllimport)Y si es así, ¿cómo?

¡Gracias!

Pregunta hecha hace 3 años, 4 meses, 29 días - Por logiclinguist


2 Respuestas:

  • El problema que estás experimentando está relacionado con la forma en que estás tratando de interactuar con los métodos y funciones de la aplicación principal desde tu DLL de prueba. La razón por la que tu aplicación se bloquea cuando descomentas la línea de impresión es probablemente porque estás tratando de acceder a un recurso compartido de la aplicación principal de una manera que causa conflictos.

    Para resolver este problema, te recomendaría usar __declspec(dllimport) en lugar de __declspec(dllexport) en la definición de tus funciones en el DLL de prueba. La directiva __declspec(dllimport) se utiliza para importar símbolos de una DLL en una aplicación, lo que te permitirá acceder a funciones y métodos de la aplicación principal de manera segura.

    Aquí hay un ejemplo de cómo puedes modificar tu código para usar __declspec(dllimport):

    En la función de prueba.h del DLL de prueba, cambia la definición de la función testingfunc() a la siguiente forma:

    cpp
    define DLL_API _declspec(dllimport)DLL_API void __stdcall testingfunc();
    

    Con este cambio, el compilador sabrá que la función testingfunc() se encuentra en otra DLL y se importará correctamente, evitando posibles conflictos al intentar acceder a funciones y métodos de la aplicación principal.

    Espero que esta solución te ayude a resolver el problema y puedas seguir probando tu función de prueba dinámicamente sin que la aplicación se bloquee. ¡Déjame saber si tienes más preguntas!

    Respondida el Dec 19, 2020 a las 19:30 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para permitir que tu DLL de prueba acceda a los métodos y funciones de la aplicación principal, debes utilizar __declspec(dllimport) en las declaraciones de función dentro de tu DLL de prueba. Esto indicará al compilador que las funciones que estás llamando están definidas en la aplicación principal.

    Aquí tienes cómo puedes modificar tu código de DLL de prueba para utilizar __declspec(dllimport):

    función de prueba.h

    
    define DLL_API __declspec(dllexport)define DLL_IMPORT __declspec(dllimport)
    DLL_IMPORT void __stdcall gResultOut(const char msg);
    
    DLL_API void __stdcall testingfunc();
    

    función de prueba.cpp

    
    DLL_API void __stdcall testingfunc()
    {
        double a = 3  4.2;
        gResultOut("  ...I am alive... ");
    
        return;
    }
    

    Ahora, cuando cargues dinámicamente tu DLL de prueba en la aplicación principal, debería poder acceder a la función gResultOut definida en la aplicación principal. Asegúrate de que la aplicación principal expone la función gResultOut usando __declspec(dllexport) en su declaración de función.

    Ten en cuenta que también necesitarás vincular tu DLL de prueba con la biblioteca de vinculación de la aplicación principal (*.lib) para resolver las referencias externas a las funciones importadas.

    Respondida el Dec 19, 2020 a las 19:37 - por Gemini

    Votos positivos: 0 | Votos negativos: 0