Ссылка на DLL в Pelles C

У меня 218КБ .dll и 596 КБ .so файл, оба с одинаковыми именами. Я хочу ссылку на .dll чтобы избежать ошибки "неразрешенный внешний символ", которую возвращает компоновщик, но я не могу найти способ связать файл DLL.

В соответствии с этой темой на форуме Pelles C, мне нужно использовать .def файл для создания .lib... но у меня нет .def файл. В этой теме форума показано, как использовать polink создать .lib из командной строки, поэтому я побежал polink /? чтобы получить еще несколько вариантов. Я заметил /MAKEDEF вариант, но работает с обоими .dll и .so выдает фатальную ошибку "Не указан файл библиотеки".

Я пытался сделать это в течение трех часов, и у меня нет идей. Я дошел до того, что мои поиски в сети приводят к появлению моих запросов о помощи. Там должен быть способ сделать это... Как я могу ссылку на .dll?

1 ответ

Решение

С информацией, найденной в заголовке #include, и вашими данными, вот способ заменить отсутствующую функцию, вызывая их динамически из вашего программного обеспечения. 1- следующий прототип находится в #include:

typedef float (* XPLMFlightLoop_f)(float inElapsedSinceLastCall, float inElapsedTimeSinceLastFlightLoop, int inCounter, void * inRefcon);

2 - некоторые константы, которые вы можете заполнить при необходимости:

const char *sDllPathName = "<Your XPLM_API DLL>.dll";
const char *sXPLMRegisterFlightLoopCallbackName = "XPLMRegisterFlightLoopCallback";

Чтобы подтвердить sXPLMRegisterFlightLoopCallbackNameВы можете использовать бесплатную программу Dependency Walker и проверить имя и формат экспортируемых функций.

3 - объявить прототип внешней функции:

Помните о соглашении о вызовах __cdecl или же __stdcall

В текущем случае ключевое слово XPLM_API определяется в XPLMDefs.h следующим образом:

#define XPLM_API __declspec(dllexport) // meaning __cdecl calling convention

typedef void (__cdecl *XPLMRegisterFlightLoopCallback_PROC)(XPLMFlightLoop_f, float, void *);

4- клонируйте функцию, чтобы вызвать ее в вашем программном обеспечении:

#include <windows.h>

void XPLMRegisterFlightLoopCallback(XPLMFlightLoop_f inFlightLoop, float inInterval, void * inRefcon)
{
    HINSTANCE hInstDLL;
    XPLMRegisterFlightLoopCallback_PROC pMyDynamicProc = NULL;

    // Load your DLL in memory
    hInstDLL = LoadLibrary(sDllPathName);
    if (hInstDLL!=NULL)
    {
        // Search for the XPLM Function
        pMyDynamicProc = (XPLMRegisterFlightLoopCallback_PROC) GetProcAddress(hInstDLL, sXPLMRegisterFlightLoopCallbackName);
        if (pMyDynamicProc != NULL)
        {
            // Call the XPLM Function with the orignal parameter
            (pMyDynamicProc)(inFlightLoop,inInterval,inRefcon);
            return;
        }
    }
    // Do something when DLL is missing or function not found
}

5- просто добавьте описанный вами звонок:

...
XPLMRegisterFlightLoopCallback(callbackfunction, 0, NULL);
...
Другие вопросы по тегам