⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 server.cpp

📁 com编程
💻 CPP
字号:
#define _WIN32_WINNT 0x402
#include <windows.h>

#include "hello.h"
#include "hello_i.c"

#include "combook.h"
#include "combook.cpp"

class SoLong : IHello
{
public:

// implement UpdateRegistry(HINSTANCE hInstance, BOOL bInstalling)
    static HRESULT STDAPICALLTYPE UpdateRegistry(HINSTANCE hInstance, BOOL bInstalling)
    {
        BEGIN_REGISTRY_TABLE(entries)
            REGISTRY_KEY(HKEY_CLASSES_ROOT, "HelloLib.Hello.1", 0, "Hello Class", REGFLAG_DELETE_BEFORE_REGISTERING)\
                REGISTRY_SUBKEY("CLSID", 0, "{DABA24E7-A38F-11d0-8C2F-0080C73925BA}", REGFLAG_NORMAL)\
            REGISTRY_KEY(HKEY_CLASSES_ROOT, "HelloLib.Hello", 0, "Hello Class", REGFLAG_NORMAL)\
                REGISTRY_SUBKEY("CurVer", 0, "HelloLib.Hello.1", REGFLAG_NORMAL)\
            REGISTRY_KEY(HKEY_CLASSES_ROOT, "CLSID\\" "{DABA24E7-A38F-11d0-8C2F-0080C73925BA}", 0, "Hello Class", REGFLAG_DELETE_BEFORE_REGISTERING)\
                REGISTRY_SUBKEY(REG_SERVER_TYPE, 0, REG_MODULE_NAME, REGFLAG_NORMAL)\
                REGISTRY_SUBKEY(REG_SERVER_TYPE, "ThreadingModel", "both", REGFLAG_NORMAL)\
                REGISTRY_SUBKEY("ProgID", 0, "HelloLib.Hello.1", REGFLAG_NORMAL)\
                REGISTRY_SUBKEY("VersionIndependentProgID", 0, "HelloLib.Hello", REGFLAG_NORMAL)\
        END_REGISTRY_TABLE()
        return RegistryTableUpdateRegistry(hInstance, entries, FALSE, bInstalling);
    }

// implement QueryInterface/AddRef/Release
    LONG m_cRef;
    SoLong(void) : m_cRef(0) {}
    STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
    {
        if (riid == IID_IUnknown)
            *ppv = static_cast<IUnknown*>(this);
        else if (riid == IID_IHello)
            *ppv = static_cast<IHello*>(this);
        else 
            return (*ppv = 0), E_NOINTERFACE;
        ((IUnknown*)*ppv)->AddRef();
        return S_OK;
    }

    STDMETHODIMP_(ULONG) AddRef(void)
    {
        extern void STDAPICALLTYPE ModuleAddRef();
        if (m_cRef == 0)
            ModuleAddRef();
        return InterlockedIncrement(&m_cRef);
    }

    STDMETHODIMP_(ULONG) Release(void)
    {
        extern void STDAPICALLTYPE ModuleRelease();
        LONG res = InterlockedDecrement(&m_cRef);
        if (res == 0)
        {
            delete this;
            ModuleRelease();
        }
        return res;
    }

// implement static CreateInstance(IUnknown *, REFIID, void**)
    static HRESULT STDAPICALLTYPE CreateInstance(IUnknown *pUnkOuter, 
                                                 REFIID riid, void**ppv)
    {
        *ppv = 0;
        if (pUnkOuter)
            return CLASS_E_NOAGGREGATION;
        SoLong *p = new SoLong;
        if (!p)
            return E_OUTOFMEMORY;
        p->AddRef();
        HRESULT hr = p->QueryInterface(riid, ppv);
        p->Release();
        return hr;
    }

// implement static GetClassObject(REFIID, void **) that uses a GenericClassFactory
    static HRESULT STDAPICALLTYPE GetClassObject(REFIID riid, void **ppv)
    {
        static GenericClassFactory cf(CreateInstance);
        return cf.QueryInterface(riid, ppv);
    }



    STDMETHODIMP HelloWorld(void) {
        MessageBox(0, "Hello, World", "", MB_SETFOREGROUND);
        return NOERROR;
    }

};

class Hello : IHello
{
public:    
// implement UpdateRegistry(HINSTANCE hInstance, BOOL bInstalling)
    BEGIN_CLASS_REGISTRY_TABLE(Hello)
        REGISTRY_KEY(HKEY_CLASSES_ROOT, "HelloLib.Hello.1", 0, "Hello Class", REGFLAG_DELETE_BEFORE_REGISTERING)
            REGISTRY_SUBKEY("CLSID", 0, "{DABA24E7-A38F-11d0-8C2F-0080C73925BA}", REGFLAG_NORMAL)
        REGISTRY_KEY(HKEY_CLASSES_ROOT, "HelloLib.Hello", 0, "Hello Class", REGFLAG_NORMAL)
            REGISTRY_SUBKEY("CurVer", 0, "HelloLib.Hello.1", REGFLAG_NORMAL)
        REGISTRY_KEY(HKEY_CLASSES_ROOT, "CLSID\\" "{DABA24E7-A38F-11d0-8C2F-0080C73925BA}", 0, "Hello Class", REGFLAG_DELETE_BEFORE_REGISTERING)
            REGISTRY_SUBKEY(REG_SERVER_TYPE, 0, REG_MODULE_NAME, REGFLAG_NORMAL)
#ifdef DLLSVC
            REGISTRY_SUBKEY(REG_SERVER_TYPE, "ThreadingModel", "both", REGFLAG_NORMAL)
#endif
            REGISTRY_SUBKEY("ProgID", 0, "HelloLib.Hello.1", REGFLAG_NORMAL)
            REGISTRY_SUBKEY("VersionIndependentProgID", 0, "HelloLib.Hello", REGFLAG_NORMAL)
    END_CLASS_REGISTRY_TABLE()

// implement GetInterfaceTable
    BEGIN_INTERFACE_TABLE(Hello)
        IMPLEMENTS_INTERFACE(IHello)
    END_INTERFACE_TABLE()

// implement QueryInterface/AddRef/Release
    IMPLEMENT_UNKNOWN(Hello)

// implement static CreateInstance(IUnknown *, REFIID, void**)
    IMPLEMENT_CREATE_INSTANCE(Hello)

// implement static GetClassObject(REFIID, void **) that uses a GenericClassFactory
    IMPLEMENT_GENERIC_CLASS_FACTORY(Hello)



    STDMETHODIMP HelloWorld(void) {
        MessageBox(0, "Hello, World", "", MB_SETFOREGROUND);
        return NOERROR;
    }
};

class Goodbye : IHello
{
public:
// use shorthand version of class above
    IMPLEMENT_COCLASS(Goodbye, "{DABA24E9-A38F-11d0-8C2F-0080C73925BA}", "Goodbye Class", "HelloLib.Goodbye.1", "HelloLib.Goodbye", "both")
        IMPLEMENTS_INTERFACE(IHello)
    END_INTERFACE_TABLE()

    STDMETHODIMP HelloWorld(void) {
        MessageBox(0, "Hello, World", "", MB_SETFOREGROUND);
        return NOERROR;
    }
};

// map CLSID to GetClassObject/UpdateRegistry routine
BEGIN_COCLASS_TABLE(ClassTable)
    IMPLEMENTS_COCLASS(Hello)
    IMPLEMENTS_COCLASS(Goodbye)
    IMPLEMENTS_COCLASS(SoLong)
END_COCLASS_TABLE()

#ifdef DLLSVC

// implement ModuleAddRef/ModuleRelease/ModuleIsStopping/ModuleIsIdle
IMPLEMENT_DLL_MODULE_ROUTINES()

// implement DllGetClassObject/DllCanUnloadNow/Dll[Un]RegisterServer
IMPLEMENT_DLL_ENTRY_POINTS(ClassTable, 0, TRUE)

#else

// implement ModuleAddRef/ModuleRelease/ModuleIsStopping/ModuleServerListen
IMPLEMENT_MTAEXE_MODULE_ROUTINES()

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR szCmdParam, int)
{
    HRESULT hr = CoInitializeEx(0, COINIT_MULTITHREADED);

    if (SUCCEEDED(hr))
    {
// install, uninstall, or run server
        IMPLEMENT_EXE_ENTRY_POINTS(szCmdParam, ClassTable, 0, TRUE, CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE)

        CoUninitialize();
    }
    return hr;
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -