неразрешенный внешний символ _CLSID_VdsLoader

Я пытаюсь написать программу, которая может управлять жесткими дисками / томами / разделами в системе 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-объектов? Если это не так, что еще это может быть?

4

Решение

Это объясняется здесь: Как избежать ошибки «LNK2001 unresolved external» с помощью DEFINE_GUID, вам просто нужно, например, добавить #include <InitGuid.h> в вашем файле stdafx.h.

4

Другие решения

У меня была похожая проблема с нерешенным внешним гидом. Я не определила _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 ++.

0

По вопросам рекламы [email protected]