1

私は、コンソールアプリケーションが複数のDLLから関数にアクセスする、複数のプロジェクト設定でテストを行ってきました。

DLLのヘッダーをコンソールアプリケーションに含める方法を考えました。私の現在の実装は次のとおりですが、管理するのが頭痛の種であり、エラーが発生することもあります。

  • 各DLLプロジェクトには、「インクルード」というフォルダーがあります。
  • コンソールアプリケーションプロジェクトは、各DLLプロジェクトのインクルードフォルダーを参照します(DLLの操作に関するmsdnガイドで提案されています)
  • 各DLLプロジェクトには、その1つのプロジェクトのすべてのヘッダーを含む単一のヘッダーが含まれています
  • 次に、コンソールアプリケーションはこれらの「マスターヘッダー」を#includeします
  • すべてのプロジェクトはプリコンパイル済みヘッダー「stdafx」を使用し、各ファイルにはそれが含まれています。

演算子のオーバーロードを開始するまでは問題なく動作しました。悲しみは、プリコンパイル済みヘッダーが原因であると思います。これが、現在のstdafxの使用例です。

#define DLL // Found in every DLL, not in the console project

#ifdef DLL
#define DLLEI   __declspec(dllexport)
#else
#define DLLEI   __declspec(dllimport)
#endif

#include <iostream>
#include <vector>

#include "Include\Engine.h"

using namespace std;

これにより、「マスターヘッダー」からヘッダーを除外し、コンソールアプリにトラブルメーカーを個別に含めることで、ハック修正できる無関係なランダムコンパイラエラーが発生することがあります。

何がもっとうまくできるかという提案?

4

2 に答える 2

4

__declspec(dllexport)__declspec(dllimport)定義は、すべてのパブリック Dll インクルード ファイル、または少なくとも他のすべてのファイルを含むメインの Dll パブリック インクルード ファイルに配置する必要があります。これらの定義は にあってはなりませんstdafx.h

#define DLL // Found in every DLL, not in the console project

これは正しくありません。すべての Dll に固有のプリプロセッサ定義が必要です。あなたの場合、あるDllが別のDllに依存しているため、常に別のDll関数を次のようにコンパイルします__declspec(dllexport)

#pragma onceすべてのヘッダーが先頭にあることを確認してください。

すべてのプロジェクトに共通Includeのディレクトリを使用することを検討してください。

コメントで既に述べたように、using namespaceソース ファイルでのみ使用できます。

于 2013-03-12T13:33:20.133 に答える
0

この記事は、私の疑問のかなりの数に答えました。

http://www.codeproject.com/Articles/6351/Regular-DLL-Tutor-For-Beginners

于 2013-03-12T14:12:11.023 に答える