Visual C ++ DLLからアンマネージクラスをエクスポートしますか?
-
05-07-2019 - |
質問
Visual C ++ 2008でDLLを作成するとき、いくつかの選択肢があります。 "クラスライブラリ" を作成できます。実際には、C ++のCLI(マネージド)拡張を使用する.Netライブラリが提供されます。
それは望ましくないので、別のVisual C ++ Windows実行可能プロジェクトにリンクするには静的.LIBファイルが必要だと想定したため、代わりに" Win32 Project"を選択します。そして、[アプリケーション設定]パネルで、C ++(MFCなし)DLLを指定します。
これにより、.cppファイルを使用してプロジェクトが作成されます。このファイルは、" DLLアプリケーション用にエクスポートされた関数" を定義する場所です。
これも私が望むものではないようです。基本的に、私が探しているのは、C#.NETでクラスライブラリアセンブリになるものに相当するネイティブC ++です。いくつかのクラスをDLLにパッケージし、DLLプロジェクトヘッダーファイルを含めて.EXEプロジェクトに DLLのクラスを使用させ、参照を解決するために.LIBにリンクします。
これを行う通常の方法は何ですか?
解決
あなたは正しくやっています。必要なのは、クラスを __declspec(dllexport)プロジェクトの外部から利用できるようにします。プロジェクトをビルドすると、.DLLと.LIBの両方が生成されます。
他のヒント
- 新しいプロジェクトを作成
- Visual C ++:Win32:Win32プロジェクト
- アプリケーション設定でDLLを選択し、「シンボルのエクスポート」をチェックします
プロジェクトを生成すると、通常はC {MyLib}という名前のエクスポートされたクラスがスタブされます。
C ++(MFCなし)DLLを作成する権利があります。クラスを作成できます。定義したエントリポイントは、他のC ++コード(たとえば、C ++で記述されたWin32アプリケーション)で使用するためにそのDLLからエクスポートされます。
C ++の名前はコンパイラーによって奇妙で素晴らしい値に自動的にマングルされるため、DLLのクライアントがたとえばCプログラムである場合、そのままエクスポートすることは実用的ではありません。ただし、すべてがC ++である場合は、大丈夫です。
いくつかのクラスを作成する場合、それらを動的に(DLLとして)リンクすることを選択できますが、DLLのシンボル定義を含むインポートライブラリ(自動的に作成される)が必要になります。また、アプリケーションからコードに静的にリンクすることもできます。この場合、DLLのシンボルではなく、クラスの実際のオブジェクトコードを含む静的ライブラリ(.LIB)になります。
DLLの利点は、もちろん、ライブラリを使用して複数のアプリケーションを作成する場合、すべてのDLLを共有できることです。静的ライブラリの場合、ライブラリコードのコピーがそれぞれ含まれます。
この記事では、あなたがやろうとしていることを説明していると思います。 http://www.codeproject.com/KB/mcpp/usingcppdll.aspx
個人的には、コンパイラ固有のメソッド名の装飾やコンパイラ生成関数の公開を気にする必要がないように、このポインタを明示的にするC関数(C ++ではなく)をエクスポートすることも好みます。