Domanda

Sono molto nuovo a tutto ciò che coinvolge Component Object Model, e mi chiedo se questo metodo di gestione delle chiamate di CoInitalize / CoUninitalize ha un senso:

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

}}

Quindi qualsiasi componente che ha bisogno semplicemente COM chiama COM::Setup() e dimentica su di esso.

Ha senso o sto infrangendo qualsiasi "regole" di COM?

È stato utile?

Soluzione

Non credo che le variabili di stoccaggio statiche vengono distrutti sul dll scarico, ma non si dovrebbe usare questo da una DLL in ogni caso.

Io in genere faccio qualcosa di simile, ma non si preoccupano di una funzione statica, ma faccio il ctor / dtor pubblico e cadere un'istanza nel mio main ():

int WINAPI wWinMain(...) {
    Com::ComInit comInitGuard;
    ...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top