2016-09-29 1 views
0

VS2012 프로젝트에서 COM 개체를 사용하고 싶습니다. 이 목적을 위해 나는 그 물체를 묘사하는 IDL 파일을 받았다. 이 같은 (부분적으로) 보이는 헤더 파일 생성에 관한을 사용하고 있습니다 : 내 프로젝트에이 헤더를 포함 그러나IDL로 만든 COM 개체를 사용하는 동안 링커 오류가 발생했습니다.

EXTERN_C const CLSID CLSID_COComponent; 

#ifdef __cplusplus 

class DECLSPEC_UUID("bla bla bla") 
COComponent; 
#endif 

을하고 CoCreateInstance 호출 CLSID_COComponent를 사용하려고 :. 내가 __uuidof(COComponent)를 사용하는 경우

Error 123 error LNK2001: unresolved external symbol _CLSID_COComponent 

그러나, 그것은 잘 작동 :

CComPtr<IModelService> m_IModelService; 

hRes = m_IModelService.CoCreateInstance(CLSID_COComponent, NULL, CLSCTX_ALL); 

가 나는 링커 오류가 발생합니다. 또한 생성 된 코드에서 EXTERN_C을 제거하면 컴파일됩니다.

정확히 동일한 코드가 다른 프로젝트에서 사용되었습니다. 어디에서 작동하는지 보았습니다. 내 질문은 내가 뭘 잘못 할 수 있니?

+1

일반적으로 MIDL은 GUID 정의 인/iid 명령 줄 옵션이 포함 된 .c 파일도 생성합니다. 프로젝트에 포함시키지 않은 것 같습니다. __uuid 키워드를 사용하는 것은 실제로 간단하고 완전히 유효한 해결 방법입니다. –

+1

[인터페이스 UUID 파일] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa367283.aspx) 대개 형식은 * _i.c *입니다. 최종 실행 이미지로 컴파일하고 링크해야합니다. – IInspectable

+0

정말 대단 했어! 답으로 게시하면 받아 들일 수 있습니다. – Frank

답변

2

The exact same code has been used in a different project, where I have seen it work. My question is, what could I be doing wrong?

즉, 코드 자체에는 아무런 문제가 없습니다. 그것은 코드의 외부에 있어야합니다. 전체 문장 유형 const CLSIDCLSID_COComponent라는 기호가 있음을 컴파일러를 말하고 있도록

EXTERN_C const CLSID CLSID_COComponent; 

EXTERN_Cextern "C"로 확장,하지만 다른 곳을 정의한다 : 힌트는 CLSID 선언입니다. 그것을 찾으려고하지 말고 나중에 링커가 함께 조각들을 꿰매 게하십시오.

CLSID에 대한 정의도 MIDL에 의해 생성됩니다. Interface UUID File에 있습니다. 이 파일의 기본 이름은 < idl 기본 이름 > _i.c (/iid MIDL 스위치로 덮어 쓸 수 있음)입니다. 링커가 기호를 찾을 수 있도록 해당 파일을 프로젝트에 포함해야합니다.

또는 Interface UUID File이 필요없는 __uuidof 연산자를 사용할 수 있습니다. 나는 말할 수 없다. 어떤 컴파일러 마술이 이것을 만든다. 그러나 Hans Passant가 "valid workaround"이라고 부르는 경우, 나는 그것에 대해 질문하지 않을 것입니다. EXTERN_C 분리


1 는이 심볼을 정의 으로 컴파일 할 수있다. CLSID은 올바른 값을 저장하지 않기 때문에 런타임에 오류가 발생합니다.

관련 문제