COMサーバの登録

(2001.07.02)
#pragma once
 
 
#include <stdio.h>
 
#include <shlwapi.h>                            // SHLWAPI
#pragma comment(lib, "shlwapi.lib")
 
#include "module.h"
 
 
/////////////////////////////////////////////////////////////////////////////
// CRegisterServer
 
class CRegisterServer
{
protected:
    CRegisterServer();            // 実装しない
    virtual ~CRegisterServer();
 
public:
    static HRESULT RegisterServer(LPCTSTR szFileName, BOOL bRegister = TRUE)
    {
        if (szFileName == NULL)
        {
            return E_INVALIDARG;
        }
 
        HRESULT hr = S_OK;
 
        LPTSTR szExt = ::PathFindExtension(szFileName);        // SHLWAPI 4.71
//        LPTSTR szExt = CShlwapiHelper::PathFindExtension(szFileName);    // SHLWAPI 4.71
        if      (lstrcmpi(szExt, _T(".exe")) == 0)
        {
            // ".exe"
            hr = RegisterLocalServer(szFileName, bRegister);
            if (FAILED(hr))
            {
                return hr;
            }
        }
        else if (lstrcmpi(szExt, _T(".dll")) == 0 ||
                 lstrcmpi(szExt, _T(".ocx")) == 0 ||
                 lstrcmpi(szExt, _T(".mfx")) == 0)
        {
            // ".dll" or ".ocx" or ".mfx"
            hr = RegisterInprocServer(szFileName, bRegister);
            if (FAILED(hr))
            {
                return hr;
            }
        }
        else
        {
            // ".wsc"等は対応してません
            return E_FAIL;
        }
 
        return hr;
    }
 
public:
    static HRESULT RegisterLocalServer(LPCTSTR szFileName, BOOL bRegister = TRUE)
    {
        if (szFileName == NULL)
        {
            return E_INVALIDARG;
        }
 
        TCHAR szCommandLine[_MAX_PATH + 32];
        if (bRegister != FALSE)
        {
            // 登録
            _stprintf(szCommandLine, _T("\"%s\" /RegServer"),   szFileName);
        }
        else
        {
            // 登録解除
            _stprintf(szCommandLine, _T("\"%s\" /UnregServer"), szFileName);
        }
 
        UINT nResult = ::WinExec(szCommandLine, SW_SHOWDEFAULT);
        if (nResult < 32)
        {
            DWORD dwError = ::GetLastError();
            return HRESULT_FROM_WIN32(dwError);
        }
 
        return S_OK;
    }
    static HRESULT RegisterInprocServer(LPCTSTR szFileName, BOOL bRegister = TRUE)
    {
        if (szFileName == NULL)
        {
            return E_INVALIDARG;
        }
 
        HRESULT hr = S_OK;
 
        CModule module;
        HMODULE hModule = module.LoadLibrary(szFileName);
        if (hModule == NULL)
        {
            return E_FAIL;
        }
 
        if (bRegister == TRUE)
        {
            // 登録
            typedef HRESULT (*DLLREGISTERSERVER)();
            DLLREGISTERSERVER fnDllRegisterServer =
                (DLLREGISTERSERVER)module.GetProcAddress(_T("DllRegisterServer"));
            if (fnDllRegisterServer == NULL)
            {
                return E_FAIL;
            }
 
            hr = (*fnDllRegisterServer)();
            if (FAILED(hr))
            {
                return hr;
            }
        }
        else
        {
            // 登録解除
            typedef HRESULT (*DLLUNREGISTERSERVER)();
            DLLUNREGISTERSERVER fnDllUnregisterServer =
                (DLLUNREGISTERSERVER)module.GetProcAddress(_T("DllUnregisterServer"));
            if (fnDllUnregisterServer == NULL)
            {
                return E_FAIL;
            }
 
            hr = (*fnDllUnregisterServer)();
            if (FAILED(hr))
            {
                return hr;
            }
        }
 
        return hr;
    }
};
一覧に戻る
© 2003 WAC.com All Right Reserved.