cocreateinstance 예제

By | August 2, 2019

이 문서의 목적은 ATL을 사용하여 VC++에서 연결 지점을 구현하는 소개 자습서를 제공하는 것입니다. 연결 지점에 대한 심층적인 이해를 위해 코드 프로젝트/COM/ DCOM – 연결 지점 및 비동기 호출 – 파트 1을 읽는 것이 좋습니다. 단순한 관점에서 연결 지점을 COM의 이벤트 처리 메커니즘으로 취급하는 경향이 있습니다. 따라서 ActiveX 컨트롤, 예를 들어 단추를 만들고 클릭 이벤트를 연결 지점을 사용하는 컨트롤 자체가 아닌 컨트롤의 컨테이너에서 처리하려고 했습니다. 그러나 Windows 이벤트를 처리하는 것 이상으로 자신만의 이벤트를 만들 수 있습니다. VC ++ 6.0에서 연결 점을 만드는 것은 약간 혼란스럽고 분명하지 않다는 것을 발견했습니다. 몇 년 전에 몇 가지 컨트롤을 만드는 동안 이 것을 한 다음 최근에 다시 연결 지점을 사용해야했고 처음 구현 한 방법을 기억할 수 없었습니다. 이 자습서는 VC++를 사용하여 연결 점을 만드는 방법을 파악하는 데 도움이 되도록 설계되었습니다. wcstombs() 는 WC_COMPOSITECHECK를 사용합니다 | WC_SEPCHARS는 WideCharToMultiByte()를 호출할 때 플래그를 표시합니다. 이전 예제를 다시 사용 하려면 다음과 같은 코드로 유니코드 문자열을 변환할 수 있습니다.

내장 된 시설에 대한 HRESULTs는 오류 조회 도구를 사용하여 조회 할 수 있습니다. 예를 들어 CoCreateInstance() 전에 CoInitialize()를 호출하는 것을 잊었다고 가정해 보겠습니다. CoCreateInstance()는 0x800401F0 값을 반환합니다. 오류 조회에 해당 값을 입력할 수 있으며 “CoInitialize가 호출되지 않았습니다.”라는 설명이 표시됩니다. ATL에는 문자열을 변환하기 위한 편리한 매크로 집합이 있습니다. 유니코드 문자열을 ANSI로 변환하려면 W2A() 매크로(“와이드에서 ANSI”에 대한 니모닉)를 사용합니다. 실제로 더 정확하게 말하려면 “OLE”가 COM 또는 OLE 소스에서 온 문자열을 나타내는 OLE2A()를 사용해야 합니다. 어쨌든 이러한 매크로를 사용하는 방법에 대한 예는 다음과 같습니다.

반면에 문자열과 복잡한 작업을 수행하지 않으면 유니코드에 문자열을 유지할 수 있습니다. 콘솔 앱을 작성하는 경우 std::wcout 전역 변수를 사용하여 유니코드 문자열을 인쇄할 수 있습니다. 코드는 문서의 샘플 프로젝트에도 포함되어 있습니다. 예를 들어 Shapes 라이브러리는 두 GUID 상수를 선언할 수 있습니다. 예를 들어 C++에서는 스택에서 만들거나 새 를 사용하여 동적으로 할당합니다. COM은 언어 중립적이어야 하므로 COM 라이브러리는 고유한 개체 관리 루틴을 제공합니다. COM 및 C++ 개체 관리비교는 다음과 같습니다. 이는 소스 코드의 재사용을 촉진하는 C++ 접근 방식과는 다릅니다. ATL은 이것의 완벽한 예입니다. 소스 수준 재사용은 잘 작동하지만 C++에서만 작동합니다. 또한 프로젝트에서 코드의 여러 복사본을 갖는 것은 말할 것도없고 이름 충돌의 가능성을 소개합니다. 릴리스는 다른 방법과 마찬가지로 호출됩니다.

이 예제에서는 wcout이 모든 문자열이 유니코드에 있을 것으로 예상하므로 “일반” 문자열이 있는 경우 std::cout으로 출력해야 합니다. 문자열 리터럴이 있는 경우 L을 접두사로 하여 유니코드로 만듭니다. 이 코드는 셸에 포함된 Shell Link 공동 클래스를 사용하여 마지막 예제에서 검색한 벽지 파일에 대한 바로 가기를 만듭니다. CoCreateInstance에 대한 다섯 번째 매개 변수는 인터페이스에 대한 포인터를 받습니다. CoCreateInstance는 제네릭 메커니즘이므로 이 매개 변수를 강력하게 입력할 수 없습니다. 대신 데이터 형식은 void**이며 호출자는 포인터의 주소를 void** 형식에 강제로 적용해야 합니다. 이것이 이전 예제에서 reinterpret_cast의 목적입니다.

Category: Uncategorized