Pregunta

Estoy muy nuevo en todo lo que concierne Component Object Model, y me pregunto si este método de gestión de llamadas a CoInitalize / CoUninitalize tiene sentido:

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;
}

}}

Entonces, cualquier componente que necesita COM simplemente llama COM::Setup() y se olvida de él.

¿Esto tiene sentido o estoy rompiendo ninguna "reglas" de COM?

¿Fue útil?

Solución

No creo que las variables estáticas de almacenamiento se destruyen en descarga DLL, pero no se debería usar esto desde un archivo DLL de todos modos.

generalmente hago algo similar, pero no me molesto con una función estática, acabo de hacer el ctor / dtor pública y soltar un ejemplo en mi main ():

int WINAPI wWinMain(...) {
    Com::ComInit comInitGuard;
    ...
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top