errore del linker durante la compilazione vshadow, parte del Volume Shadow Copy Service SDK
-
23-08-2019 - |
Domanda
sto ottenendo questo errore di linker quando si tenta di compilare il progetto C ++ per il VSS SDK
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
Lo ShouldBlockRevert viene utilizzato due volte, una volta quando viene dichiarata in alto, e una volta quando viene effettivamente utilizzato.
Dichiarato qui:
HRESULT APIENTRY ShouldBlockRevert(IN LPCWSTR wszVolumeName, OUT bool* pbBlock);
e utilizzato qui:
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;
}
Mi dispiace, non sono così bravo con C ++.
Soluzione
Si dà il caso, mi sono imbattuto dumpbin / export su vssapi.lib, e ha scoperto che lo fa esportare ShouldBlockRevert, ma grazie al C ++ nome pressare il nome storpiato è diverso. Perché è diverso? Perché in vssapi.lib, il primo argomento di ShouldBlockRevert non è wchar_t, è unsigned short. “So What”, stai pensando, “sono equivalenti”. E io non sono d'accordo, ma il compilatore li tratta come tipi diversi per scopi nome manging. Qual è la correzione? Beh, disattivare il tipo wchar_t intrinseca nella pagina delle proprietà C / C ++ linguaggio nelle proprietà del progetto (equivalente al / Zc: wchar_t- passare se sei una delle due persone sul pianeta che costruiscono progetti di Visual C ++ con makefile).
Una volta fatto, la macro LPCWSTR è definito per unsigned short, nome mangling partite, i pianeti si allineano, e si può collegare. QED.