9

C++アプリケーションから呼び出したい関数がdll内にあります。dllもC++で作成されており、dllに存在する関数を示すdefファイルがあります。Visual Studio 2010を使用しており、リンカーの「追加ライブラリディレクトリ」にdllのディレクトリを追加し、リンカーの「入力」にDLLname.libを追加して、dllファイルを使用するように構成しました。これで、dll内のすべての名前空間が使用可能になりましたが、必要な関数は名前空間の下にないため使用できません。これらの関数にアクセスするにはどうすればよいですか?これらの関数は、dllでそのように宣言されています

#include "stdafx.h"
#include <stdio.h>
__declspec(dllexport) int somefunction()
{
......
            return SomeValue
}

私の質問は、dllを介してC++アプリケーションの一部の機能にアクセスするにはどうすればよいですか。

4

2 に答える 2

20

ここには混乱があるようです。リンカ入力へのファイルの追加は、静的にリンクされたライブラリ(Windowsでは.lib)用です。静的にリンクされたライブラリを使用すると、コードはコンパイル時にプログラムにコピーされます。ダイナミックリンクライブラリ(Windowsでは.dll)は、さまざまなファイル(DLL)に存在し、実行時にプログラムによってロードされます。dll内の関数にアクセスするには、主に2つの方法があります。

  • dllexportを使用して関数をエクスポートしたのと同様に、dllimportを使用します。

  • LoadLibraryを使用してDLLをロードし、GetProcAddressを使用して関数へのポインターを取得します。このメソッドを使用している場合、注意すべきもう1つの点は、名前のマングリングextern "C"を回避するために、エクスポートする関数で使用する必要があることです。で関数を見つけるのに問題がある場合は、 Dependency Walkerを使用してDLL内の関数名を調べることができます。使用する呼び出し規約によっては、関数名が若干変更される場合があります。GetProcAddress

于 2012-11-30T15:32:28.793 に答える
1

ポスターは暗黙のリンクについて助けを求めていると思います。 暗黙的にリンクするMSDNウィキペディアのDLLインポートを使用したダイナミックリンクライブラリ

于 2012-11-30T16:23:22.307 に答える