2013-11-04 189 views
3

我在編寫一個程序,可以管理Windows系統中的硬盤/卷/分區。這似乎是一個好主意,使用Windows的虛擬磁盤服務來實現這一點。無法解析的外部符號_CLSID_VdsLoader

我編寫了一段代碼,嘗試一下,但鏈接時,我得到以下錯誤:error LNK2001: unresolved external symbol _CLSID_VdsLoader

微軟sample code表明我有鏈接到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)

正如你所看到的,前面提到的庫都包括在內。

我正在嘗試所有這些在Windows桌面2013年的Visual C++ Express。請問這是問題嗎?也許快車版本不支持100%的可用COM對象?如果不是這樣,那還有什麼呢?

回答

0

我有類似的問題與未解決的外部guid。我沒有定義_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名稱裝飾,而guids定義文件定義了const IID iid與內部鏈接和C名稱裝飾。鏈接不匹配,因此鏈接器將它們視爲不同的實體。在這種情況下,帶有外部鏈接的const IID iid未定義,稍後在相同的翻譯單元中使用。

當您添加預定義_MIDL_USE_GUIDDEF_宏觀的GUID定義文件將包含:

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

所以,你需要以明確的代碼編譯爲C++添加預定義_MIDL_USE_GUIDDEF_宏。