현재 작업중인 MFC 확장 DLL에서 GDI+를 사용할 필요가 있어 사용하게 되었다. 그런데 GDI+ 관련 함수들에 문자열을 넘겨줄 경우 WCHAR * 형을 써야했기 때문에 _bstr_t 클래스를 사용하게 되었다.

이를 위해 comutil.h를 포함하고 comsupp.lib을 링크하여 주었다.
그런데 링크시 다음과 같은 에러가 발생하였다.

error LNK2019: "wchar_t * __stdcall _com_util::ConvertStringToBSTR(char const *)" ...

comsupp.lib을 링크하지 않을 경우에는 추가로 다음과 같은 링크에러가 발생한다.

error LNK2019: "void __stdcall _com_issue_error(long)" ...

Visutal Studio 97의 버그로 컴파일러 호출 규칙을 __cdecl 해주어야만 위 링크에러가 발생하지 않는다는 MSDN자료도 있었지만(--; 사실 정확히는 조금 틀린 링크에러의 경우에 대한 해결책 이었다) 이 프로젝트의 호출 규칙은 __cdecl이었다. 그리고 해당 자료에는 이후 버전 및 서비스팩에서 문제가 해결되었다고 되어 있었다.


comsupp.lib을 링크할 경우 _com_issue_error 링크에러는 없어지는 것으로 보아 comsupp.lib을 링크해야하는 것은 맞는것 같았다.
그렇다면 이게 어떻게 된 일인가?

comutil.h의 ConvertStringToBSTR의 prototype은 다음과 같았다.

namespace _com_util {
  // Convert char * to BSTR
  //
  BSTR __stdcall ConvertStringToBSTR(const char* pSrc) ;

  // Convert BSTR to char *
  //
  char* __stdcall ConvertBSTRToString(BSTR pSrc) ;
}

구글에 도움을 요청한 결과 ^^; 멀티바이트 문자집합을 사용할 경우 comsuppw.lib을 사용해야 한다는 것을 알게되었다.

#include <comutil.h> // for _bstr_t
#pragma comment(lib, "comsuppw.lib") // 링커로 링크해라
.



크리에이티브 커먼즈 라이센스
Creative Commons License
2007/05/02 21:13 2007/05/02 21:13

Trackback Address :: http://www.codeforum.net/blog/pitoosung/trackback/68