12

Visual Studio 2010 で多くの関数とクラスを含む .dll ライブラリを作成しました。ファイルの内容を見ると、次のようになります。

dumpbin.exe /EXPORTS myDll.dll

ある種の関数ロケーション ポインターを含む長い関数名を取得します。これは次のようになります (.dll の 2 番目のエントリ)。

          2    1 0001100A ?Initialize@codec@codecX@@SANNN@Z = @ILT+5(?Initialize@codec@codecX@@SANNN@Z)

これはなんとなく読みにくいですが、次のように、他の.dll-sからの「より良い」プロシージャ/関数リストを見ました。

141   8C 00002A08 PogoDbWriteValueProbeInfo

その .dll リストをそのように見せるにはどうすればよいですか?

PS: 私の dll ソース コードは次のようになります。

namespace codecX
{
   class codec
   {
      public:
      static __declspec(dllexport) double Initialize(double a, double b);
      ...
4

3 に答える 3

10

You need to pull those static member functions into the global address space and then wrap them with extern "C". This will suppress the C++ name mangling and instead give you C name mangling which is less ugly:

extern "C" __declspec(dllexport) Initialize(double a, double b)
{
    codec::Initialize(a, b);
}

and then remove the __declspec(dllexport) on your static member functions:

class codec
{
    public:
        static double Initialize(double a, double b);
}
于 2013-02-26T13:27:45.383 に答える
4

これは名前マングリングと呼ばれ、C++コンパイラを使用してC++をコンパイルするときに発生します。「人が読める」名前を保持するにはextern "C"、クラスと関数を宣言および定義するときに使用する必要があります。すなわち

extern "C" void myFunction(int, int); 

こことグーグルも参照してくださいmixing C and C++

于 2013-02-26T13:28:16.383 に答える