1

わかりましたので、ここで危険なほど再投稿に近づいていますが、私の状況は、この機能に関する他の多くのポスターとは少し異なります. 私は昔に書かれた DLL とやり取りしていますが、私が持っているのはファイルだけです。私は .lib ファイルを持っていないので、LoadLibrary および GetProcessAddress 関数を使用しています。MSDN Web サイトのチュートリアルに従って、基本的な構造を取得しました。DLL はプロジェクト フォルダにあります。コンパイルします。実行時に「hinstLib」の数値を取得しているので、DLL が見つかったと想定しています。「ProcAdd」変数の null 値を取得しています。他の投稿者は、extern C を DLL 関数に入れることで問題を解決しましたが、実際にはそのオプションはありません。言うまでもなく、私の知る限り、この DLL はプレーンな C で書かれています。私はインターフェイス ドキュメントを持っており、関数名が正しいことを確信しています (これらの目的のために一般的な例に置き換えました)。ProcAdd 割り当てが NULL になったため、正直なところ何も実行しませんでした。なぜこれが関数の割り当てに0の値を与えているのかについての考えは大歓迎です。注: 残念ながら、さまざまな理由により、DLL をアップロードできません。

    #include <iostream>
    #include "stdafx.h"
    #include "Windows.h"
    #include <stdio.h> 

    typedef int(__cdecl *MYPROC)(LPWSTR);

    using namespace std;

    int main()
    {
      HINSTANCE hinstLib;
      MYPROC ProcAdd;
      BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;

      hinstLib = LoadLibrary(TEXT("dllName.dll"));
      if (hinstLib != NULL) 
    { 
    ProcAdd = (MYPROC) GetProcAddress(hinstLib, "funcName"); 

    // If the function address is valid, call the function.

    if (NULL != ProcAdd) 
    {
        fRunTimeLinkSuccess = TRUE;
        //(ProcAdd) (L"Message sent to the DLL function\n"); 
    }
    // Free the DLL module.

    fFreeResult = FreeLibrary(hinstLib); 
} 

// If unable to call the DLL function, use an alternative.
if (! fRunTimeLinkSuccess) 
    printf("Message printed from executable\n"); 

return 0;

}

4

1 に答える 1

1

コンパイラは通常、関数名をマングルします。次に、名前付きの関数funcNameが DLL 内に name で表示funcName@16される場合があります。呼び出し規約には、おそらく:-)__cdeclが必要です。_funcName

于 2014-05-21T20:33:13.520 に答える