1

218KB.dllと 596KB の.soファイルがあり、どちらも同じ名前です。.dllリンカーが返す「未解決の外部シンボル」エラーを回避するために にリンクしたいのですが、DLL ファイルにリンクする方法が見つかりません。

この Pelles C フォーラムのトピックによると、.defファイルを使用して ... を作成する必要があります.libが、ファイルがありません.defこのフォーラム トピックでは、コマンド ラインからpolinkを作成する方法が示されているので、さらにオプションを取得するために実行しました。オプションに気付きましたが、これを との両方で実行すると、「ライブラリ ファイルが指定されていません」という致命的なエラーが発生します。.libpolink /?/MAKEDEF.dll.so

私はこれを3時間やろうとしてきましたが、アイデアがありません。Web 検索で自分のヘルプ リクエストが表示されるところまで来ました。これを行う方法があるはずです...どうすればリンクでき.dllますか?

4

1 に答える 1

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";

を確認するには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);
...
于 2016-10-27T22:03:31.050 に答える