未解决的外部符号_CLSID_VdsLoader

4
我正在尝试编写一个程序,可以管理Windows系统中的硬盘/卷/分区。使用Windows的虚拟磁盘服务似乎是一个不错的选择。
我写了一些代码来尝试它,但在链接时出现以下错误:error LNK2001: unresolved external symbol _CLSID_VdsLoader Microsoft的示例代码表明我必须链接到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对象?如果不是这样,还可能是什么问题呢?
2个回答

4

1
刚刚尝试了包含它,但我仍然得到相同的错误。感谢您的尝试。 - Jehjoa
重点是必须将其添加到 stdafx.h 文件中,而不是其他任何地方(您的 .cpp 或 .h 文件)。谢谢 @Simon - Mahdi

0

我遇到了未解决的外部GUID问题。我没有定义_MIDL_USE_GUIDDEF_宏并尝试将代码编译为C++代码。

由于MIDL编译器生成C源文件来定义GUID,因此在您明确告诉Visual Studio将代码编译为C++代码之前,它将被编译为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

考虑到这一点,我们可以看到头文件声明了具有外部链接和C名称修饰的const IID iid,而guids-definition文件定义了具有内部链接和C名称修饰的const IID iid。链接不匹配,因此链接器将它们视为不同的实体。在这种情况下,具有外部链接的const IID iid未定义,并且稍后在同一翻译单元中使用。

当您添加预定义的_MIDL_USE_GUIDDEF_宏时,guids-definition文件将包含:

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

所以你需要添加预定义的_MIDL_USE_GUIDDEF_宏,以便明确地将代码编译为C++。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接