31

「GetName」という関数をエクスポートする DLL を作成しようとしています。マングルされた関数名を知らなくても、他のコードでこの関数を呼び出せるようにしたいと思います。

私のヘッダーファイルは次のようになります。

#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif

EXPORT TCHAR * CALLBACK GetName();

私のコードは次のようになります。

#include <windows.h>
#include "PluginOne.h"

int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
{
     return TRUE ;
}

EXPORT TCHAR * CALLBACK GetName()
{
    return TEXT("Test Name");
}

ビルドすると、DLL は引き続き "_GetName@0" という名前の関数をエクスポートします。

私は何を間違っていますか?

4

4 に答える 4

27

小さな修正 - クリネによる名前解決を成功させるため

extern "C"

インポート時と同様にエクスポート側である必要があります。

extern "C" は、proc の名前を "_GetName" に減らします。

さらに、.def ファイルのセクション EXPORTS を使用して、任意の名前を強制できます。

于 2009-09-23T16:35:22.807 に答える
9

__stdcallこれは、慣習のある DLL エクスポートでは正常です。は@N 、関数が引数に取るバイト数を示します。あなたの場合はゼロです。

DLL からのエクスポートに関する MSDN ページでは、「関数の定義でキーワード __declspec(dllexport) を使用する場合」に「__stdcall 呼び出し規約を使用する」ように具体的に述べられていることに注意してください。

于 2009-09-23T16:35:32.977 に答える
4

「-Wl,--kill-at」リンカー スイッチを使用して、名前マングリングを無効にすることができます。

たとえば、Code::Blocks のカスタム リンカー設定で、-Wl,--kill-at を追加します。

于 2014-02-12T00:11:25.867 に答える