0

Visual Studio 2012 のマネージ C++ を使用して、サード パーティの SDK と C# で記述されたシステムとの間のブリッジを作成しています。上記の SDK からいくつかの関数を正常にラップして使用しました。1 つを除いて、未解決の外部エラーのみが発生します。

SDK のヘッダー ファイルは、関数のシグネチャを定義します。

#if defined WIN32
    #if defined BUILD_ADS_SHARED_LIB
        #define ADS_LINK_SPEC __declspec (dllexport)
        #define ADS_CALLING_CONVENTION __stdcall
    #elif defined USE_ADS_SHARED_LIB
        #define ADS_LINK_SPEC __declspec (dllimport)
        #define ADS_CALLING_CONVENTION __stdcall
    #else
        #define ADS_LINK_SPEC
        #define ADS_CALLING_CONVENTION
    #endif
#else
    #define ADS_LINK_SPEC
    #define ADS_CALLING_CONVENTION
#endif

DatabaseResult ADS_LINK_SPEC ADS_CALLING_CONVENTION
createDatabase(
    const Settings& settings, Artec::SdkDatabase::iDatabase *& instance);

エラーは言う:

Error   10  error LNK2028: unresolved token (0A000089) "enum Artec::SdkDatabase::DatabaseResult __cdecl Artec::SdkDatabase::createDatabase(class Artec::SdkDatabase::Settings const &,class Artec::SdkDatabase::iDatabase * &)" (?createDatabase@SdkDatabase@Artec@@$$FYA?AW4DatabaseResult@12@ABVSettings@12@AAPAViDatabase@12@@Z) referenced in function "private: static enum Artec::SdkDatabase::DatabaseResult __clrcall Broadway3dWrapper::Broadway3dWrapper::GetConn(wchar_t const *,wchar_t const *,wchar_t const *,wchar_t const *,char const *,class Artec::SdkDatabase::iDatabase * &)" (?GetConn@Broadway3dWrapper@1@$$FCM?AW4DatabaseResult@SdkDatabase@Artec@@PB_W000PBDAAPAViDatabase@34@@Z) C:\bioap\tfs\Identitum\Dev\src\BA.Identitum.Devices.Broadway3d\Broadway3dWrapper.obj    BA.Identitum.Devices.Brodway3D

したがって、マングルされた名前を探しています。

?createDatabase@SdkDatabase@Artec@@$$FYA?AW4DatabaseResult@12@ABVSettings@12@AAPAViDatabase@12@@Z

参照されたdllで小さなダンプビンを作成すると、実際にはエクスポートされたように呼び出される関数があることがわかりました。名前がわずかに異なっています。

?createDatabase@SdkDatabase@Artec@@YG?AW4DatabaseResult@12@ABVSettings@12@AAPAViDatabase@12@@Z

誰でもここで私を助けることができますか? SDK ベンダーに連絡できず、ここで完全に迷っています。

4

2 に答える 2

5

これら 2 つの違いは、呼び出し規約のセクションにあります。

createDatabase@SdkDatabase@Artec@@YG?AW4DatabaseResult@12@ABVSettings@12@AAPAViDatabase@12@@Zstdcall:enum Artec::SdkDatabase::DatabaseResult __stdcall Artec::SdkDatabase::createDatabase(class Artec::SdkDatabase::Settings const &,class Artec::SdkDatabase::iDatabase * &)

私が使用したデマングラーは を理解していません?createDatabase@SdkDatabase@Artec@@$$FYA?AW4DatabaseResult@12@ABVSettings@12@AAPAViDatabase@12@@Zが、それらが異なる部分 ( @@$$FYA?vs @@YG?) は呼び出し規約です ( に変更YGするYFと、呼び出し規約が変更され、他は何もしません)。

関数の宣言を に変更しますreturn-type __stdcall function-name[(argument-list)]

ヘッダー ファイルをインクルードしたとき、#define USE_ADS_SHARED_LIB明示的に、またはコンパイラ コマンド ラインでインクルードしましたか? 32 ビット Windows をターゲットにしていますか?

于 2013-03-12T18:44:26.083 に答える
3

名前の装飾を解除するには、undname.exe ユーティリティを使用します。それは探しています:

enum Artec::SdkDatabase::DatabaseResult 
__cdecl 
Artec::SdkDatabase::createDatabase(
    class Artec::SdkDatabase::Settings const &,
    class Artec::SdkDatabase::iDatabase * &
)

あなたが見つけたものは次のとおりです。

enum Artec::SdkDatabase::DatabaseResult 
__stdcall 
Artec::SdkDatabase::createDatabase(
    class Artec::SdkDatabase::Settings const &,
    class Artec::SdkDatabase::iDatabase * &
)

呼び出し規約 __cdecl と __stdcall を除いて、すべてが一致します。SDK ヘッダーがこれをどのように許可しているかに注意してください。BUILD_ADS_SHARED_LIB も USE_ADS_SHARED_LIB も #defined でない場合、問題は発生しません。そして、__cdecl 関数が生成されます。ところで悪い考え。

非常に高い可能性があるため、USE_ADS_SHARED_LIB を定義するのを単に忘れてしまいました。プロジェクト + プロパティ、C/C++、プリプロセッサ、プリプロセッサ定義の設定。

于 2013-03-12T18:59:15.427 に答える