Ссылка на 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);
...