coinitializeex 예제

그러나 wcout은 모든 문자열이 유니코드에 있을 것으로 예상하므로 “일반” 문자열이 있는 경우에도 std::cout으로 출력해야 합니다. 문자열 리터럴이있는 경우 L을 접두사로 하여 유니 코드로 만듭니다. 콘솔 앱을 작성하는 경우 std::wcout 전역 변수를 사용하는 유니코드 문자열을 인쇄할 수 있습니다. main()의 STA는 STA 개체 spISimpleCOMObject2를 포함하도록 진행됩니다. ThreadFunc()의 스레드에는 STA 개체 spISimpleCOMObject2A 및 spISimpleCOMObject2B도 포함됩니다. 다음 예제는 위의 방법을 보여 줍니다: 평소와 같이 예제 코드를 통해 COM EXE 서버 내에서 STA를 보여 주려고 합니다. 이 섹션의 예제 코드는 다소 정교합니다. 다음 폴더에서 찾을 수 있습니다. 이 샘플 코드 집합에는 세 부분으로 구성됩니다: 위의 예제를 계속하면 Release() 사용 방법: 위의 예제에서는 CoInitialize()라고 부를 때 STA가 설정된 콘솔 응용 프로그램의 주 스레드를 보여 주며 있습니다. 이 스레드 에는 메시지 루프가 정의되어 있지 않습니다. 또한 ISimpleCOMObject1 인터페이스를 기반으로 COM 개체를 만듭니다.

초기화() 및 초기화()에 대한 호출은 성공적으로 진행됩니다. 메서드 호출은 동일한 STA 내에서 이루어지며 마샬링이 없고 메시지 루프가 필요하지 않습니다. 여기서 보여 준 것은 기본 STA. spISimpleCOMObject2의 생성 및 사용에 대한 보다 복잡한 예는 비 STA 스레드(main(주)의 스레드) 내부에서 인스턴스화된 STA 개체입니다. spISimpleCOMObject2A 및 spISimpleCOMObject2B는 비 STA 스레드(ThreadFunc()의 스레드) 내부에서도 인스턴스화되었습니다. 따라서 세 개체 모두 spISimpleCOMObject2, spISimpleCOMObject2A 및 spISimpleCOMObject2B는 모두 spISimpleCOMObject2가 생성될 때 처음 생성되는 기본 STA에 상주합니다. “테스트 프로그램VCTests시연ExeServerSTA구현ExeServerImpl” 하위 폴더의 예제 코드는 두 개의 소스 파일 레지스트리를 사용합니다. H 및 레지스트리. 데일 로저슨의 책 “내부 COM”에서 가져온 CPP. 경우에 따라 STA 스레드에서 메시지 루프가 필요하지 않습니다.

예를 들어 응용 프로그램이 객체를 다른 아파트로 마샬링하지 않고 개체를 만들고 사용하는 간단한 경우에 이러한 예를 볼 수 있습니다. 다음은 위의 예제에서 일어난 일도 간단합니다: 레거시 STA 개체인 spILegacyCOMObject1은 MTA 내부에서 인스턴스화됩니다. 이 MTA 내부에 살 수 없으므로 COM은 기본 레거시 STA. spILegacyCOMObject1을 생성하므로 이 COM 생성 레거시 STA. 최적화 참조 카운팅 위의 예에서 pSum 인터페이스에서 AddRef 메서드를 호출할 필요가 없습니다. AddRef는 QueryInterface 메서드에서 반환되는 인터페이스 포인터에서 자동으로 호출되므로 포인터입니다. 그럼에도 불구 하 고, 인터페이스 포인터별 칭호 될 때마다 AddRef 메서드를 명시적으로 호출 해야 합니다.: HRESULT는 32 비트 서명 된 정수, 성공을 나타내는 음수 값 및 실패를 나타내는 음수 값. HRESULT에는 심각도 비트(성공 또는 실패를 나타내는), 시설 코드 및 상태 코드의 세 가지 필드가 있습니다. “기능”은 HRESULT의 구성 요소 또는 프로그램을 나타냅니다.

Microsoft는 다양한 구성 요소에 시설 코드를 할당합니다(예: COM에는 하나, 작업 스케줄러에는 하나 등). “코드”는 본질적인 의미가 없는 16비트 필드입니다. 코드는 GetLastError()에서 반환된 값과 마찬가지로 숫자와 의미 간의 임의 연관일 뿐입니다. TCHAR 및 _t 함수(예: _tcscpy()))는 동일한 소스 코드로 유니코드 및 ANSI 문자열을 처리할 수 있도록 설계되었습니다.