С информацией, находящейся в заголовке #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);
...
Если у вас нет ни .lib (библиотеки импорта), ни DEF-(вывозимых определение), вам необходимо знать, по крайней мере, какие функции экспортируются (для использования внешним программным обеспечением). Но даже если вы можете генерировать .lib или .def из вашей .dll, вы не можете использовать .dll без заголовка определения (.h в C), где полностью описаны все экспортируемые функции (имя, тип параметров, тип результата ... и вызов конвенции), вы не сможете использовать .dll. –
@ J.Piquard У меня есть файл заголовка. Это просто компоновщик, который не работает. – wizzwizz4
при компиляции исходного кода c, вы добавили этот заголовок? Если да, то какой «неразрешенный внешний символ» вы получили? –