0

プロジェクトから dll を作成し、以下のコードのように extern "C" を使用して関数をエクスポートします。

main.cpp

extern "C" __declspec(dllexport) void __cdecl  VectorOfMarker(char*     InAdd,vector<NewMarker>& VectorMarkers)
 {
    DetectSeg d;
    d.VectorOfMarker(InAdd,VectorMarkers);
 }

プロジェクトをビルドし、.dll ファイルと .lib ファイルを正常に作成します。次に、新しいビジュアル C++ プロジェクトを作成し、この dll と言及された関数を使用しようとしました。.dll ファイルと .lib ファイルを同じディレクトリにコピーしましたが、extern "C" を使用して関数を 2 番目のプロジェクトにインポートすることはできません。関数を使用するには、Visual Studio 2010 でいくつかの設定を変更する必要があると思います。エクスポートした関数を使用するにはどうすればよいですか?

事前に感謝します

4

1 に答える 1

0

ビルドしているdllのタイプについて混乱していると思います。

動的リンクには、暗黙的および明示的な 2 つのタイプがあります。dll を暗黙的に動的にリンクするには、いくつかの関数や変数をエクスポートする dll を作成します。これにより、DLL モジュールと .lib インポート ライブラリが作成されます。このタイプの dll を使用しているモジュールには、関数プロトタイプを含むヘッダー ファイルが必要であり、.lib インポート ライブラリにリンクされている必要があります。したがって、コンパイル時にリンクしています。エクスポートは __declspec(dllexport) および __declspec(dlleimport) を使用して行われるため、エクスポートされた関数名は修飾 (マングル) されます。?ExportedTest@@YAXPAD@Z のように見えます。

別のタイプは明示的なリンクであり、それはあなたがしていることである可能性が最も高いです。通常、このタイプの DLL 関数は、装飾されていない関数名を生成するために .def ファイルを使用してエクスポートされます。これは、extern "C" 修飾子を使用して C++ コンパイラに関数を C スタイルとしてコンパイルするように指示することによっても実現できます。したがって、エクスポートされた関数は装飾されず、_ (アンダースコア) を使用します。

このタイプの DLL を使用するには、関数の型とパラメーターを宣言し、ライブラリをロードし、GetProcAddress を呼び出して関数ポインターを取得する必要があります。その後、次のように電話をかけることができます。

typedef void (*DLLVectorOfMarker)(char*, vector<int>&);

HMODULE hMod = LoadLibrary(_T("ExportTest.dll")); // your lib name goes here

DLLVectorOfMarker pfnVectorOfMarker = (DLLVectorOfMarker)GetProcAddress(hMod, "VectorOfMarker");


vector <int> VectorMarkers;

pfnVectorOfMarker("some string", VectorMarkers);
于 2013-01-10T14:02:02.890 に答える