C++ 未解析的外部符号\u CLSID\u VdsLoader

C++ 未解析的外部符号\u CLSID\u VdsLoader,c++,windows,com,vds,visual-c++-2013,C++,Windows,Com,Vds,Visual C++ 2013,我正在尝试编写一个程序,可以在Windows系统中管理硬盘/卷/分区。使用Windows的虚拟磁盘服务来实现这一点似乎是个好主意 我编写了一些代码来尝试它,但是当链接它时,我得到了以下错误:error LNK2001:unresolved external symbol\u CLSID\u VdsLoader 微软表示我必须链接到ole32.lib,通过谷歌搜索我了解到uuid.lib也涉及其中。“我的项目设置”中的“其他依赖项”行如下所示: kernel32.lib;user32.lib;gd

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

我编写了一些代码来尝试它,但是当链接它时,我得到了以下错误:
error LNK2001:unresolved external symbol\u CLSID\u 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;%(附加依赖项)

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


我在Windows桌面2013的Visual C++快门上尝试这一切。这可能是问题所在吗?也许express版本不支持100%的可用COM对象?如果不是这样,还会是什么?

这里解释如下:,例如,您只需要在stdafx.h文件中添加
\include

对于未解析的外部guid,我也有类似的问题。我没有定义<代码>μMIDLUIXUGIDGUDFID<宏,并尝试编译代码作为C++代码。

由于MIDL编译器生成C源文件定义GUID,它被编译成C代码,直到您明确地告诉VisualStudio编译代码为C++代码。 MIDL生成的头文件包含(编译为C++时):

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

我们需要记住:

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
,而GUID定义文件定义带有内部链接和C名称修饰的
const IID IID
。链接不匹配,因此链接器将它们视为不同的实体。在这种情况下,带有外部链接的
常量IID IID
未定义,随后在同一翻译单元中使用

添加预定义的
\u MIDL\u USE\u GUIDDEF\u时
宏guids定义文件将包含:

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

<> P>所以需要添加预定义的<代码> .MIDLIUSEGUIDGDEFFIG宏,以便显式编译代码为C++。感谢您的尝试。关键是它必须添加到
stdafx.h
文件中,而不是添加到其他任何地方(您的.cpp或.h文件)。谢谢@Simon
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
extern "C"
{
    extern "C" const IID iid = { ... };    // extern "C" is redundant, extern would be enough
}