本記事は、COM Advent Calendar 2014 – Qiitaの5日目の記事です。まだ5日です。


CoRegisterClassObjectはアウトプロセス(EXEとして実装する種類)のクラスファクトリの登録に使用する関数です。そのため、レジストリに登録したクラスでないと使用できないと思っていました。しかし、実際にはそんなことありませんでした。

以下のプログラムは、CoRegisterClassObjectに成功値であるS_OK (0)を返します。もちろん、ここで使ったクラスIDは直前にuuidgenで生成し、レジストリは何も書いていません。

#include <iostream>
#include <windows.h>
 
class __declspec(uuid("cd003e7a-8d5b-437b-b55b-fab402848e16")) Hoge;
 
class HogeFactory : public IClassFactory
{
public:
  IFACEMETHOD(QueryInterface)(
    _In_ REFIID riid, _COM_Outptr_ void** ppv) override
  {
    if (ppv == nullptr)
      return E_POINTER;
    if (riid == IID_IUnknown)
    {
      *ppv = static_cast<IUnknown*>(this);
      // AddRef();
      return S_OK;
    }
    *ppv = nullptr;
    return E_NOINTERFACE;
  }
  IFACEMETHOD_(ULONG, AddRef)() override { return 1; }
  IFACEMETHOD_(ULONG, Release)() override { return 1; }
 
  IFACEMETHOD(CreateInstance)(
    _In_opt_ IUnknown* outer,
    _In_ REFIID riid,
    _COM_Outptr_ void** ppv) override
  {
    return E_NOTIMPL;
  }
  IFACEMETHOD(LockServer)(BOOL fLock) override
  {
    return E_NOTIMPL;
  }
 
};
 
int main()
{
  if (FAILED(CoInitializeEx(nullptr,
    COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE)))
  {
    return 1;
  }
  HogeFactory factory;
  DWORD classReg;
  auto hr = CoRegisterClassObject(
    __uuidof (Hoge),
    &factory,
    CLSCTX_LOCAL_SERVER,
    REGCLS_MULTIPLEUSE,
    &classReg);
  std::cout << std::hex << hr << std::endl;
  if (SUCCEEDED(hr))
  {
    CoRevokeClassObject(classReg);
  }
  CoUninitialize();
}

このように、まだCoRegisterClassObjectが成功することまでしか確かめていません。実際これが機能することを見るのは、またの機会にしたいと思います。


スポンサード リンク

この記事のカテゴリ

  • ⇒ CoRegisterClassObjectはレジストリ未登録でも成功する