문제

나는 구성 요소 객체 모델과 관련된 모든 것에 매우 익숙하지 않으며, Coinitalize/Couninitalize 호출을 관리하는이 방법이 의미가 있는지 궁금합니다.

com.hpp :

#pragma once

namespace WindowsAPI { namespace ComponentObjectModel {

class COM
{
    COM();
    ~COM();
public:
    static void Setup();
};

}}

com.cpp :

#include <Windows.h>
#include "COM.hpp"

namespace WindowsAPI { namespace ComponentObjectModel {

COM::COM()
{
    if (CoInitializeEx(NULL, COINIT_APARTMENTTHREADED) != S_OK) throw std::runtime_error("Couldn't start COM!");
}

COM::~COM()
{
    CoUninitialize();
}

void COM::Setup()
{
    static COM instance;
}

}}

그런 다음 COM이 필요한 구성 요소 만 호출합니다 COM::Setup() 그리고 그것에 대해 잊어 버립니다.

이것이 말이 되나요? 아니면 내가 com의 "규칙"을 깨고 있습니까?

도움이 되었습니까?

해결책

나는 정적 저장 변수가 DLL 언로드에서 파괴되었다고 생각하지 않지만 어쨌든 DLL에서 이것을 사용해서는 안됩니다.

나는 일반적으로 비슷한 일을하지만 함수 정적을 귀찮게하지 않고 CTOR/DTOR를 공개하고 Main ()에 인스턴스를 떨어 뜨립니다.

int WINAPI wWinMain(...) {
    Com::ComInit comInitGuard;
    ...
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top