Я пытаюсь написать программу, которая может управлять жесткими дисками / томами / разделами в системе Windows. Казалось бы, хорошей идеей было использовать Windows Virtual Service Service для этого.
Я написал немного кода, чтобы попробовать его, но при связывании я получаю следующую ошибку: error LNK2001: unresolved external symbol _CLSID_VdsLoader
Microsofts образец кода указывает на то, что я должен ссылаться на 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 для Windows Desktop 2013. Может ли это быть проблемой? Возможно, экспресс-версия не поддерживает 100% доступных COM-объектов? Если это не так, что еще это может быть?
Это объясняется здесь: Как избежать ошибки «LNK2001 unresolved external» с помощью DEFINE_GUID, вам просто нужно, например, добавить #include <InitGuid.h>
в вашем файле stdafx.h.
У меня была похожая проблема с нерешенным внешним гидом. Я не определила _MIDL_USE_GUIDDEF_
макрос и попытался скомпилировать код как код C ++.
Поскольку компилятор MIDL генерирует исходный файл C для определения направляющих, он компилируется как код C, пока вы явно не скажете Visual Studio скомпилировать код как код C ++.
Генерируемый MIDL файл заголовка содержит (при компиляции в C ++):
extern "C"{
extern "C" const IID iid; // extern "C" is redundant, extern would be enough
}
Генерируемый MIDL файл определения guids содержит (при компиляции в 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_
файл определения макро-guids будет содержать:
extern "C"{
extern "C" const IID iid = { ... }; // extern "C" is redundant, extern would be enough
}
Так что вам нужно добавить предопределенный _MIDL_USE_GUIDDEF_
макрос для явной компиляции кода как C ++.