1

VSS SDK の C++ プロジェクトをコンパイルしようとすると、このリンカー エラーが発生します。

Error   1   error LNK2019: unresolved external symbol "long __stdcall ShouldBlockRevert(wchar_t const *,bool *)" (?ShouldBlockRevert@@YGJPB_WPA_N@Z) referenced in function "public: void __thiscall VssClient::RevertToSnapshot(struct _GUID)" (?RevertToSnapshot@VssClient@@QAEXU_GUID@@@Z)   revert.obj  vshadow

ShouldBlockRevert は、最初に宣言するときと実際に使用するときの 2 回使用されます。

ここで宣言:

HRESULT APIENTRY ShouldBlockRevert(IN LPCWSTR wszVolumeName, OUT bool* pbBlock);

ここで使用されます:

CHECK_COM(::ShouldBlockRevert(Snap.m_pwszOriginalVolumeName, &bBlock));
    if (bBlock)
    {
        ft.WriteLine(L"Revert is disabled on the volume %s because of writers",
                Snap.m_pwszOriginalVolumeName);
        return;
    }

申し訳ありませんが、私はC ++が得意ではありません。

4

1 に答える 1

2

このブログ投稿によると:

たまたま、vssapi.lib で dumpbin /exports を実行したところ、ShouldBlockRevert をエクスポートすることがわかりましたが、C++ の名前マングリングのおかげで、マングルされた名前が異なります。なぜ違うのですか?vssapi.lib では、ShouldBlockRevert の最初の引数が wchar_t ではないため、unsigned short です。「だから何」、「それらは同等だ」とあなたは考えています。同意しませんが、コンパイラは名前管理の目的でそれらを異なるタイプとして扱います。修正は何ですか?プロジェクト プロパティの [C/C++ 言語] プロパティ ページで、組み込みの wchar_t 型を無効にします (メイクファイルを使用して Visual C++ プロジェクトをビルドする地球上の 2 人のうちの 1 人であれば、/Zc:wchar_t- スイッチに相当します)。

それが完了すると、LPCWSTR マクロが unsigned short に定義され、名前マングリングが一致し、惑星が整列し、リンクできるようになります。QED。

于 2009-04-04T20:32:12.837 に答える