2013-11-04 7 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)

가 모두 앞서 언급 한 라이브러리가 포함되어 있습니다.

나는이 모든 것을 Visual C++ Express for Windows Desktop 2013에서 시도하고 있습니다. 이것이 문제가 될 수 있습니까? Express 버전은 사용 가능한 COM 개체의 100 %를 지원하지 않을 수 있습니까? 그렇지 않다면 또 무엇이있을 수 있습니까?

답변

4

여기에 설명되어 있습니다 : How to avoid error "LNK2001 unresolved external" by using DEFINE_GUID, 예를 들어 #include <InitGuid.h>을 stdafx.h 파일에 추가해야합니다.

+0

그냥 포함 시키려고 했는데도 여전히 같은 오류가 발생합니다. 시도해 줘서 고마워. – Jehjoa

+0

그에 따라 대답을 업데이트했습니다 –

+0

그리고 이제 작동합니다! 고마워요! – Jehjoa

0

미해결 외부 GUID와 비슷한 문제가 있습니다. 난 _MIDL_USE_GUIDDEF_ 매크로를 정의하지 않았고 C++ 코드로 코드를 컴파일하려고 시도했다.

MIDL 컴파일러는 guids를 정의하기 위해 C 소스 파일을 생성하므로 Visual Studio에 명시 적으로 C++ 코드로 코드를 컴파일 할 때까지 C 코드로 컴파일됩니다. (C++로 컴파일 할 때)

에 관한 생성 된 헤더 파일이 포함되어

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

에 관한 생성 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 정의 파일은 내부 링키지와 C 이름 데코레이션이있는 const IID iid을 정의합니다. 링키지가 일치하지 않으므로 링커에서 다른 엔터티로 처리됩니다. 이 경우 외부 링크가 포함 된 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_ 매크로를 추가해야합니다.