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