2016-10-27 4 views
1

У меня есть 218KB .dll и файл 596KB .so, оба с одинаковыми именами. Я хочу связать с .dll, чтобы избежать ошибки «неразрешенного внешнего символа», которую возвращает компоновщик, но я не могу найти способ ссылки на DLL-файл.Ссылка на DLL в Pelles C

Согласно this Pelles C forum topic, мне нужно использовать файл .def создать .lib ... но у меня нет .def файла. This forum topic показывает, как использовать polink для создания .lib из командной строки, поэтому я запустил polink /?, чтобы получить еще несколько опций. Я заметил параметр /MAKEDEF, но запустив его как с .dll, так и с .so, выдает фатальную ошибку «Нет файла библиотеки».

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

+0

Если у вас нет ни .lib (библиотеки импорта), ни DEF-(вывозимых определение), вам необходимо знать, по крайней мере, какие функции экспортируются (для использования внешним программным обеспечением). Но даже если вы можете генерировать .lib или .def из вашей .dll, вы не можете использовать .dll без заголовка определения (.h в C), где полностью описаны все экспортируемые функции (имя, тип параметров, тип результата ... и вызов конвенции), вы не сможете использовать .dll. –

+0

@ J.Piquard У меня есть файл заголовка. Это просто компоновщик, который не работает. – wizzwizz4

+0

при компиляции исходного кода c, вы добавили этот заголовок? Если да, то какой «неразрешенный внешний символ» вы получили? –

ответ

1

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

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

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

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

In order to confirm the sXPLMRegisterFlightLoopCallbackName , you can use the freeware Dependency Walker and check name and format of the exported functions.

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

Be aware to the calling convention __cdecl or __stdcall

In the current case, the keyword XPLM_API is defined in the XPLMDefs.h as follow:

#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); 
... 
+0

Будет ли это работать, если DLL загружается из * другой DLL *? – wizzwizz4

+0

Использование LoadLibrary не проверяет, была ли DLL еще загружена из другой. Не могли бы вы добавить некоторые подробности об этой другой DLL? Вы использовали его в одном и том же программном обеспечении? –

+0

Я только понял, насколько неоднозначны мои комментарии. Я пишу плагин, который является DLL.Могут быть другие DLL-модули, импортированные одной программой. В документации говорится, чтобы ссылаться на DLL, чтобы не загружать ее напрямую, поэтому я спрашивал, будет ли она работать в этом случае. – wizzwizz4