Как указать функцию загрузки DLL для mingw32? - PullRequest
3 голосов
/ 21 июня 2011

Я могу правильно скомпилировать библиотеки DLL, используя mingw, и выполнять операции экспорта / импорта.То, что я ищу, это правильно определить функцию dll onload, как в продуктах MS VC.Гугл ничего не нашел.У кого-нибудь есть идеи или ссылка на учебник?

Ответы [ 2 ]

11 голосов
/ 22 июня 2011

Хорошо, так что после некоторой возни ... это работает. Для всех, у кого есть проблемы, вот оно. Мои проблемы не были связаны с компиляцией вместо динамической загрузки. Это была смесь из нескольких уроков / вопросов / инструкций, которые привели меня к этой точке.

dll.c


#include <stdio.h>
#include <windows.h>
#include "dll.h"

//extern "C" BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD Reason, LPVOID LPV) {
//This one was only necessary if you were using a C++ compiler

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {

    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            // Code to run when the DLL is loaded
        printf ("Load working...\n");
            break;

        case DLL_PROCESS_DETACH:
            // Code to run when the DLL is freed
        printf ("Unload working...\n");
            break;

        case DLL_THREAD_ATTACH:
            // Code to run when a thread is created during the DLL's lifetime
        printf ("ThreadLoad working...\n");
            break;

        case DLL_THREAD_DETACH:
            // Code to run when a thread ends normally.
        printf ("ThreadUnload working...\n");
            break;
    }

    return TRUE;
} 

EXPORT void hello(void) {
    printf ("Hello\n");
}

dll.h


#ifndef DLL_H_
#define DLL_H_

#ifdef BUILD_DLL
/* DLL export */
#define EXPORT __declspec(dllexport)
#else
/* EXE import */
#define EXPORT __declspec(dllimport)
#endif

EXPORT void hello(void);

#endif /* DLL_H_ */

hello.c


#include <windows.h>
#include <stdio.h>

int main () {

    /*Typedef the hello function*/
    typedef void (*pfunc)();

    /*Windows handle*/
    HANDLE hdll;

    /*A pointer to a function*/
    pfunc hello;

    /*LoadLibrary*/
    hdll = LoadLibrary("message.dll");

    /*GetProcAddress*/
    hello = (pfunc)GetProcAddress(hdll, "hello");

    /*Call the function*/
    hello();
    return 0;
}

при компиляции с gcc -c -DBUILD_DLL dll.c gcc -shared -o message.dll dll.o -Wl,--out-implib,libmessage.a gcc -c hello.c gcc -o hello.exe hello.o message.dll

производит ожидаемый результат Load working... Hello Unload working...

1 голос
/ 22 июня 2011

Поскольку mingw - это просто порт Windows GCC и связанных инструментов, вы можете использовать Атрибуты конструктора и деструктора GCC .Они работают как с общими, так и со статическими библиотеками и выполняют код до и после запуска main, соответственно.Кроме того, вы можете указать несколько функций конструктора и деструктора для библиотеки.

static void __attribute__((constructor))
your_lib_init(void)
{
    fprintf(stderr, "library init\n");
}

static void __attribute__((destructor))
your_lib_destroy(void)
{
    fprintf(stderr, "library destroy\n");
}
...