COM 개체와 Thread 안정성

2023. 4. 30. 03:00·Programming

1. COM 개체란 무엇인가?

 

COM 개체 및 인터페이스 - Win32 apps

COM 개체 및 인터페이스

learn.microsoft.com

 

COM은 개체가 단일 프로세스 내에서처럼 프로세스 및 컴퓨터 경계를 넘어
쉽게 상호 작용할 수 있도록 하는 기술이다.

 

예로 들자면 프로그램에서 '클립보드', '파일' 에 접근 할 때

COM 개체를 통해 접근 하는것이다.

Clipboard.GetDataObject();

// or

OpenFileDialog();

물론 이와 같은 형태의 COM 개체만 존재하는것은 아니다.

 

C# COM 만들기

C# COM 만들기 윈도우10, VisualStudio2017 기준 MFC Client : http://petra.tistory.com/1133 1. Visual Stidio 2017을 관리자 모드로 실행한다. 2. 아래 그림처럼 클래스 라이브러리(.NET Framework) _COMTest 프로젝트를 만든다.

petra.tistory.com

COM 개체는 직접 만들어서 등록할수도 있다.

 

 

2. COM 개체를 사용할 때 Thread 안정성에 주의하자.

아래 두가지 답변을 통해 많은 내용을 배웠다.

 

What is a message pump?

In this thread (posted about a year ago) there is a discussion of problems that can come with running Word in a non-interactive session. The (quite strong) advice given there is not to do so. In ...

stackoverflow.com

 

ApartmentState for dummies

I just corrected a bug using this: _Thread.SetApartmentState(ApartmentState.STA); Now I'd like to understand what it means, and why it works!

stackoverflow.com

위 답변들의 내용을 요약하면

 

COM과 .NET은 별개이며 .NET이 COM 클래스를 이용할때 'COM 클래스에 대한 스레딩 보장을 무시' 한다. COM 클래스는 어떤 종류의 스레딩 요구사항이 존재하는지 이를 게시할 수 있지만 .NET에는 COM이 어떤 스레딩 요구사항을 지니는지 관심이 없다는 의미이다. 결국 .NET, COM 간의 통신에 있어서 어떤 문제가 생기면 그냥 Runtime Error 를 내뿜으며 프로그램이 뻗는다는 의미이기도 하다.

때문에 COM 개체를 이용할 때 이러한 이해 없이 COM 개체와의 Thread 안정성을 고려하지 않으면 '원인을 찾기 어려운 골아픈 에러' 가 발생한다. 예를들어, STA가 필요한 두가지 로직을 순차적으로 운용하면서, 둘 사이에 Thread.Sleep() 을 사용하는경우가 바로 그 경우이다. Thread.Sleep() 는 명확히 말해서 '차단' 이다. 이럴경우 스레드를 임의로 '중단' 처리하고 메서드 호출을 강제로 수행하는 형태의 꼴이 되 버리기 때문에 심각한 재진입 문제가 발생할 수도 있다 (사용하는 COM 개체에 따라 문제가 발생하지 않을 확률도 존재한다)

결론적으로 OpenClipboard Failed 같은 에러나, System.Runtime.InteropServices.InvalidComObjectException: 'COM object that has been separated from its underlying RCW cannot be used.' 같은 에러들은 이와 같은 문제로 인해 발생할 확률이 있다.

저작자표시 비영리 동일조건 (새창열림)

'Programming' 카테고리의 다른 글

Endian 변환 과정에 대하여  (0) 2021.10.28
코딩 네이밍 규칙  (0) 2021.07.22
'Programming' 카테고리의 다른 글
  • Endian 변환 과정에 대하여
  • 코딩 네이밍 규칙
Cyp
Cyp
  • Cyp
    Cyp Software Blog
    Cyp
  • 전체
    오늘
    어제
    • Cyp Blog (162)
      • Artificial Intelligence (39)
        • Article (20)
        • Post (2)
        • Basic (14)
        • Preferences (3)
      • Cyber Security (1)
      • Programming (46)
        • C++ (21)
        • C# (19)
        • Python (2)
        • Rust (0)
        • Java (1)
      • Algorithm (17)
        • BACKJOON (15)
      • Operating System (14)
        • WSL (2)
        • Windows (1)
        • Linux (5)
        • Security (3)
      • Tools (26)
        • Docker (3)
        • DataBase (2)
        • SSH (1)
        • Doxygen (2)
        • Etc (17)
      • Miscellaneous (19)
        • Book (2)
        • Hardware (2)
        • Hevel (1)
  • 블로그 메뉴

    • Home
    • Guest Book
  • 링크

  • 공지사항

    • 블로그 업데이트 노트
    • 블로그 운영방침
  • 인기 글

  • 태그

    y-cruncher
    C4819
    utf-8 bom
    UTF-8 without BOM
    Bom
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Cyp
COM 개체와 Thread 안정성
상단으로

티스토리툴바