質問

私は簡単な例を輸出する機能から、C++はwindows DLL.

様を見たいのですが、ヘッダ、cppファイルは、defファイルが必要です。)

私の輸出に関する名称 装飾を持たな.お使いに最も標準的な呼び出し規約(__stdcall?).私の使用 __declspec(dllexport) において使用DEFファイルです。

例えば:

  //header
  extern "C"
  {
   __declspec(dllexport) int __stdcall foo(long bar);
  }

  //cpp
  int __stdcall foo(long bar)
  {
    return 0;
  }

私の手続きを避けるためのリンカーを追加字数(半角数は?) の名前です。

丈夫だと思いサポートしておりませんdllimportとdllexport同じヘッダを表します。してほしくない情報を輸出についてC++クラスメソッドは、cスタイルのグローバルで機能する。

更新

を含まない呼び出し規約(利用extern"C")を与えてくれている輸出の名前ですが、そうするとどうなるでしょうか。でもデフォルトの呼び出し規約もしかしたら何pinvoke(.純ることを宣言します(vb6、GetProcAddressい?(かたGetProcAddressいは関数によって異なりますポインタの呼び出し側が作成され、作成され

私は、このDLLにまとめることなく使用することはできヘッダーファイルでは不要なのかもしれませんので多くのオススメ#定のヘッダの使用による発信者の負担となります。

丈夫だと思い答えとして今まで使っていた、DEFファイルです。

役に立ちましたか?

解決

したい場合はCでの輸出は、CプロジェクトはC++.C++のDllに依存名の難号化のためのすべてのC++isms(名前空間など)です。できるコードのコンパイルとしてのCによるも兼ね備えておりますのでプロジェクトの設定の下でのC/C++>がありますがオプション"をコンパイルとしての"coorespondsコンパイラにスイッチ/TPおよび/TCです。

輸出/輸入DLL Lib VC++

だいたいいを定義する条件付きのマクロのヘッダが含まれるすべてのソースファイルのDLLプロジェクト:

#ifdef LIBRARY_EXPORTS
#    define LIBRARY_API __declspec(dllexport)
#else
#    define LIBRARY_API __declspec(dllimport)
#endif

そして機能する輸出に使用 LIBRARY_API:

LIBRARY_API int GetCoolInteger();

ご図書館の構築プロジェクトを定義 LIBRARY_EXPORTS な機能をエクスポートするためのおDLL。

以降 LIBRARY_EXPORTS な定義されたプロジェクトを消費は、DLL、このプロジェクトのヘッダファイルの図書館のすべての機能がインポートされます。

れている場合はクロスプラットフォームを定義しておくことができまLIBRARY_APIしていない場合はWindowsの場合:

#ifdef _WIN32
#    ifdef LIBRARY_EXPORTS
#        define LIBRARY_API __declspec(dllexport)
#    else
#        define LIBRARY_API __declspec(dllimport)
#    endif
#elif
#    define LIBRARY_API
#endif

使用時dllexport/dllimportすを使用する必要はありませんDEFファイルをご利用の場合DEFファイルを使用する必要はありませんdllexport/dllimport.の方達と同じタスクの異なる方法であると思いdllexport/dllimportの推奨方法ではない。

輸出unmangled機能から、C++のDLLのためのLoadLibrary/PInvoke

が必要な場合はこの使用LoadLibraryとGetProcAddressもっPInvokeます。当期純利用できる extern "C" インラインおdllexport.また、弊社は利用GetProcAddressの代わりにdllimportはないと思いますのifdefダンスから上だけのシンプルなdllexport:

コード:

#define EXTERN_DLL_EXPORT extern "C" __declspec(dllexport)

EXTERN_DLL_EXPORT int getEngineVersion() {
  return 1;
}

EXTERN_DLL_EXPORT void registerPlugin(Kernel &K) {
  K.getGraphicsServer().addGraphicsDriver(
    auto_ptr<GraphicsServer::GraphicsDriver>(new OpenGLGraphicsDriver())
  );
}

というの輸出を見ようとDumpbin/輸出:

  Dump of file opengl_plugin.dll

  File Type: DLL

  Section contains the following exports for opengl_plugin.dll

    00000000 characteristics
    49866068 time date stamp Sun Feb 01 19:54:32 2009
        0.00 version
           1 ordinal base
           2 number of functions
           2 number of names

    ordinal hint RVA      name

          1    0 0001110E getEngineVersion = @ILT+265(_getEngineVersion)
          2    1 00011028 registerPlugin = @ILT+35(_registerPlugin)

このコードの動作:

m_hDLL = ::LoadLibrary(T"opengl_plugin.dll");

m_pfnGetEngineVersion = reinterpret_cast<fnGetEngineVersion *>(
  ::GetProcAddress(m_hDLL, "getEngineVersion")
);
m_pfnRegisterPlugin = reinterpret_cast<fnRegisterPlugin *>(
  ::GetProcAddress(m_hDLL, "registerPlugin")
);

他のヒント

C++:

私が抱えるとともに、同誌掲載号の注目のようなものだったのでしょうも問題が出てきた時の使用 __stdcallWINAPI) extern "C":

としてい extern "C" を削除し、その装飾う:

__declspec(dllexport) int Test(void)                        --> dumpbin : ?Test@@YaHXZ

する装飾を持たなシンボル名:

extern "C" __declspec(dllexport) int Test(void)             --> dumpbin : Test

しかし、 _stdcall (=マクロする変更の呼び出し規約でも飾名になる場合に利用した取得した:

   extern "C" __declspec(dllexport) int WINAPI Test(void)   --> dumpbin : _Test@0

の効果 extern "C" で失われたシンボルが飾られ(_@バイト)

なお、この のみ が発生したときはx86アーキテクチャで の __stdcall コンベンションは無視されますx64(msdn : にx64の建築規則にしたがって、引数に渡された登録可能な場合には、その後の引数が渡され、スタック.).

これは特に、トリッキーを対象としている場合もx86およびx64ます。


  1. 使用定義ファイルです。この勢いを維持する状態にdefファイルです。

  2. 最も簡単な方法:を定義するマクロを参照 msdn) :

#define輸出コメント(リンカー"/エクスポート:"__機能__"=" __FUNCDNAME__)

そのpragmaの機能本体:

#pragma EXPORT

例:

 int WINAPI Test(void)
{
    #pragma EXPORT
    return 1;
}

これは輸出の機能が装飾を持たなものx86およびx64の目標を守りながら __stdcall 条約x86.の __declspec(dllexport) ではない 必要です。

私は同じ問題で、私の溶液を使用モジュール定義ファイル(.def)の代わりに __declspec(dllexport) を定義する輸出http://msdn.microsoft.com/en-us/library/d91k01sh.aspx).わからないのはなぜこの作品にするものではあ

と思い_nakedがたいものでも""どこでもコンパイラの作成から、スタックネージメントコードの機能です。extern"C"の原因Cスタイルの名前も飾られています。削除することになるべくご_'s.リンカーなの追加、強調、コンパイラます。stdcall原因は、引数をスタックサイズに追加される。

に戻ります:http://en.wikipedia.org/wiki/X86_calling_conventions http://www.codeproject.com/KB/cpp/calling_conventions_demystified.aspx

の大きな問題はなぜださい。何が悪いの難号化した。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top