无法解析的外部符号_CLSID_VdsLoader

问题描述 投票:0回答:2

我正在尝试编写一个可以管理Windows系统中的硬盘/卷/分区的程序。使用 Windows 的虚拟磁盘服务来完成此任务似乎是个好主意。

我写了一些代码来尝试一下,但是在链接它时出现以下错误:

error LNK2001: unresolved external symbol _CLSID_VdsLoader

微软的示例代码表明我必须链接到ole32.lib,并且通过谷歌搜索我了解到uuid.lib也参与其中。我的项目设置中的“附加依赖项”行如下:

kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)

如您所见,前面提到的两个库都包含在内。

我正在 Visual C++ Express for Windows Desktop 2013 上尝试所有这些操作。这可能是问题所在吗?也许 Express 版本不支持 100% 的可用 COM 对象?如果不是这样,那还能是什么?

c++ windows com vds visual-c++-2013
2个回答
5
投票

这在这里解释:如何使用 DEFINE_GUID 避免错误“LNK2001 unresolved external”,您只需在 stdafx.h 文件中添加

#include <InitGuid.h>
即可。


0
投票

我也遇到了类似的未解决的外部指南问题。我没有定义

_MIDL_USE_GUIDDEF_
宏并尝试将代码编译为 C++ 代码。

由于 MIDL 编译器生成 C 源文件来定义 guid,因此它被编译为 C 代码,直到您明确告诉 Visual Studio 将代码编译为 C++ 代码。

MIDL 生成的头文件包含(编译为 C++ 时):

extern "C"
{
    extern "C" const IID iid;   // extern "C" is redundant, extern would be enough
}

MIDL 生成的 guid 定义文件包含(当编译为 C++ 时):

extern "C"
{
    const IID iid = { ... };    // _MIDL_USE_GUIDDEF_ macro is not defined
}

我们需要记住:

extern "C" block implies C name decoration; e.g.
  extern "C" { int a; }

extern "C" singleton implies C name decoration AND extern semantics; e.g.
  extern "C" int a;

in C++ non-extern namespace-scope const object implies internal linkage; e.g.
  const int a;         // internal linkage
  extern const int b;  // external linkage

考虑到这一点,我们可以看到头文件声明

const IID iid
具有外部链接和 C 名称修饰,而 guid 定义文件定义
const IID iid
具有内部链接和 C 名称修饰。链接不匹配,因此它们被链接器视为不同的实体。在这种情况下,具有外部链接的
const IID iid
未定义,稍后在同一翻译单元中使用。

当您添加预定义的

_MIDL_USE_GUIDDEF_
宏向导定义文件将包含:

extern "C"
{
    extern "C" const IID iid = { ... };    // extern "C" is redundant, extern would be enough
}

因此您需要添加预定义的

_MIDL_USE_GUIDDEF_
宏才能将代码显式编译为 C++。

© www.soinside.com 2019 - 2024. All rights reserved.