ヘッダー #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";
を確認するには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);
...