Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)

C/C++ 프로젝트에 /clr 옵션 적용으로 인한 COM 개체 사용 오류


참, 재미있는 현상이 팀원으로부터 보고되었습니다. 소스 코드는 단일 파일에 아래와 같이 아주 간단한 구조의 C/C++ 콘솔 프로젝트였습니다.

#include "stdafx.h"

#include <vector>
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    ... [중간 생략] ...

    HRESULT hr = ::CoInitialize(NULL);

    IMyObject* pMyObject = NULL;
    hr = ::CoCreateInstance(CLSID_MyObject, NULL, CLSCTX_INPROC_SERVER, IID_IMyObject, 
        (PVOID *)&pMyObject);
    
    tagMyStruct testParam;
    hr = pMyObject->CallMethod(&testParam);
    
    CComBSTR bstrError; 
    pISARRoute->get_ErrorMessage(&bstrError);

    ... [중간생략] ...

    ::CoUninitialize();

    return 0;
}

위의 코드는 정상동작했습니다. 하지만, 아래와 같이 CLR 지원 옵션 "/clr"을 주기만 하면 프로그램이 "Access violation" 예외를 발생하며 다운되었습니다.

[그림 1: /clr 빌드 옵션]
clr_switch_with_com_object_1.PNG

"/clr" 적용 후, CoCreateInstance는 정상적으로 되었는데, CallMethod 호출의 hr 반환값이 "-2147352568"으로 나왔습니다. 이 값을 "Error Lookup"으로 확인해 보면 "0x80020008: Bad variable type"으로 나옵니다.

그리곤, get_ErrorMessage 메서드 호출에서 아래와 같은 디버그 출력문을 끝으로 프로그램이 종료되었습니다.

First-chance exception at 0x10001d2e in TestCpp.exe: 0xC0000005: Access violation reading location 0xfab8d088.
Windows has triggered a breakpoint in TestCpp.exe.

오호... 이런 신기한 일이!
단지, "/clr" 옵션만 주었을 뿐인데 이렇게 프로그램이 오동작을 해버렸습니다.

경험상, 이렇게 "Bad variable type"이 나오는 경우중의 하나가 바로 "마샬링" 문제였던 것을 상기시켜서 확실히 하기 위해 CoInitialize의 반환값을 확인해 보았습니다.

HRESULT hr = ::CoInitialize(NULL); 
// hr == -2147417850
//    == 0x80010106
//    == Cannot change thread mode after it is set.

그렇군요. 답이 나왔습니다. /clr 적용으로 인해 STA로 초기화되지 못했던 것입니다. 그러고 보니, 일반적인 C# 프로그램은 기본값이 MTA였고, WinForm의 경우에 STA를 적용하기 위해 Main 함수에 "[STAThread]" 특성을 적용하던 것이 생각났습니다.

아하... 그렇다면 C/C++ 콘솔 응용 프로그램 역시 /clr 옵션 때문에 기본값이 MTA로 바뀌었다는 것이고 결국 위와 같은 결과가 발생했다는 것으로 정리가 됩니다.

원칙이 그러하다면... STA로 바꾸는 방법 역시 마찬가지가 아닐까 싶어서 아래와 같이 특성을 적용해 보았습니다.

[System::STAThreadAttribute]
int _tmain(int argc, _TCHAR* argv[])
{
    ... [중간 생략] ...
}

정말 되네요. ^^;



[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 4/6/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 166  167  168  169  170  171  172  [173]  174  175  176  177  178  179  180  ...
NoWriterDateCnt.TitleFile(s)
711정성태4/27/200929608개발 환경 구성: 43. Hyper-V VHD 파일 크기 확장하는 방법
710정성태4/26/200930106.NET Framework: 133. CallbackOnCollectedDelegate was detected [4]파일 다운로드1
709정성태4/24/200926356개발 환경 구성: 42. Windows Vista SP1에서 사용 가능한 Hyper-V 관리 도구
708정성태4/23/200931223.NET Framework: 132. ClickOnce 배포를 명령행 수작업 구성파일 다운로드1
707정성태4/22/200930705개발 환경 구성: 41. Hyper-V에 Linux 설치 - SUSE Linux Enterprise Server 11
706정성태4/21/200926616.NET Framework: 131. ClickOnce - 그룹화시켜 다운로드파일 다운로드1
705정성태4/20/200922129개발 환경 구성: 40. TFS2008 SP1의 DBTier에 SQL Server 2008 SP1 설치 [1]
704정성태4/19/200922132개발 환경 구성: 39. Together 2007 SP1 설치
702정성태4/18/200933566.NET Framework: 130. Infragistics - Tabbed MDI WPF 응용 프로그램파일 다운로드1
701정성태4/17/200928338Windows: 44. bootsect 오류 - Access is denied.
700정성태4/17/200931468.NET Framework: 129. Infragistics WPF 컨트롤 사용 [1]
699정성태4/16/200929788.NET Framework: 128. 이벤트 멤버의 명시적 구현파일 다운로드1
696정성태4/12/200929147오류 유형: 77. RDP 연결이 되지 않는 경우. [1]
693정성태4/9/200923740오류 유형: 76. "Client found response content type of '', but expected 'text/xml'. The request failed with an empty response.No Reports".
692정성태4/8/200936628.NET Framework: 127. ClickOnce로 ActiveX를 같이 배포하는 방법 [2]파일 다운로드1
690정성태4/5/200924355오류 유형: 75. Event Viewer - The data is invalid (13)
688정성태4/5/200930401VS.NET IDE: 60. Output 경로에 매크로 상수 사용하는 방법 [1]
687정성태4/5/200924531.NET Framework: 126. Composite Application Guidance for WPF and Silverlight
689정성태4/5/200924527    답변글 .NET Framework: 126.1. CAG - 빌드 환경 구성파일 다운로드1
691정성태4/6/200924187    답변글 .NET Framework: 126.2. CAG - Shell 띄우기파일 다운로드1
695정성태4/10/200926003    답변글 .NET Framework: 126.3. CAG - 간단한 유형의 모듈 제작파일 다운로드1
703정성태4/18/200924888        답변글 .NET Framework: 126.6. CAG - Tabbed MDI Shell 적용파일 다운로드1
697정성태4/13/200929177    답변글 .NET Framework: 126.4. CAG - Unity 컨테이너 사용 [1]파일 다운로드1
698정성태4/15/200928359    답변글 .NET Framework: 126.5. CAG에 MVVM 패턴 적용 (1) [2]파일 다운로드1
686정성태4/4/200949947웹: 11. IE 8 - TabProcGrowth 레지스트리 키 [2]
685정성태4/3/200950731개발 환경 구성: 38. Hyper-V 사용 후기 [5]
... 166  167  168  169  170  171  172  [173]  174  175  176  177  178  179  180  ...