编译 vshadow(卷影复制服务 SDK 的一部分)时出现链接器错误

发布于 2024-07-16 22:22:30 字数 862 浏览 15 评论 0原文

当尝试为 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 使用了两次,一次是在顶部声明时,一次是实际使用时。

在这里声明:

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++。

I am getting this linker error when trying to compile the c++ project for the 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

The ShouldBlockRevert is used twice, once when it is declared at the top, and once when it is actually used.

Declared here:

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

and used here:

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;
    }

Sorry, I'm not that good with c++.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

明媚如初 2024-07-23 22:22:30

根据这篇博客文章:

碰巧,我在 vssapi.lib 上运行 dumpbin /exports,发现它确实导出 ShouldBlockRevert,但由于 C++ 名称损坏,损坏的名称有所不同。 为什么不一样呢? 因为在 vssapi.lib 中,ShouldBlockRevert 的第一个参数不是 wchar_t,它是 unsigned Short。 “那又怎样”,你会想,“它们是等价的”。 我并不反对,但出于名称管理的目的,编译器将它们视为不同的类型。 有什么解决办法吗? 那么,在项目属性的 C/C++ 语言属性页中禁用固有的 wchar_t 类型(如果您是地球上使用 makefile 构建 Visual C++ 项目的两个人之一,则相当于 /Zc:wchar_t- 开关)。

完成后,LPCWSTR 宏被定义为无符号短、名称修改匹配、行星对齐,并且您可以链接。 量子ED。

According to this blog post:

As it happens, I ran dumpbin /exports on vssapi.lib, and found that it does export ShouldBlockRevert, but thanks to C++ name mangling the mangled name is different. Why is it different? Because in vssapi.lib, the first argument to ShouldBlockRevert isn’t wchar_t, it’s unsigned short. “So what”, you’re thinking, “they’re equivalent”. And I don’t disagree, but the compiler treats them as different types for name manging purposes. What’s the fix? Well, disable the intrinsic wchar_t type in the C/C++ Language property page in the project properties (equivalent to the /Zc:wchar_t- switch if you’re one of the two people on the planet who build Visual C++ projects with makefiles).

Once that’s done, the LPCWSTR macro is defined to unsigned short, name mangling matches, planets align, and you can link. QED.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文