00001
00002
00003
00004 #include "stdafx.h"
00005
00006
00007 #include "MgaUtil.h"
00008 #include "ComponentDll.h"
00009
00010 extern bool const g_REGISTER_SYSTEMWIDE;
00011 extern const TCHAR* g_COMPONENT_NAME;
00012
00013 #ifdef _DEBUG
00014 #define new DEBUG_NEW
00015 #undef THIS_FILE
00016 static char THIS_FILE[] = __FILE__;
00017 #endif
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00047
00048
00049 BEGIN_MESSAGE_MAP(CComponentApp, CWinApp)
00050
00051
00052
00053
00054 END_MESSAGE_MAP()
00055
00057
00058
00059 CComponentApp::CComponentApp() : CWinApp(g_COMPONENT_NAME)
00060 {
00061
00062
00063 }
00064
00066
00067
00068 CComponentApp theApp;
00069
00071
00072
00073 BOOL CComponentApp::InitInstance()
00074 {
00075 #if _MSC_VER < 1700
00076
00077
00078
00079
00080 UINT uAfxSetAmbientActCtxMod = 1;
00081 HKEY hKey;
00082 if (RegOpenKeyEx(HKEY_CURRENT_USER, _T("Software\\GME\\"),
00083 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
00084 {
00085 TCHAR szData[128];
00086 DWORD dwKeyDataType;
00087 DWORD dwDataBufSize = sizeof(szData)/sizeof(TCHAR);
00088
00089 if (RegQueryValueEx(hKey, _T("AfxSetAmbientActCtxMod"), NULL, &dwKeyDataType,
00090 (LPBYTE) &szData, &dwDataBufSize) == ERROR_SUCCESS)
00091 {
00092 szData[dwDataBufSize] = '\0';
00093 uAfxSetAmbientActCtxMod = _tcstoul(szData, NULL, 10);
00094 }
00095
00096 RegCloseKey(hKey);
00097 }
00098 if (uAfxSetAmbientActCtxMod != 0)
00099 {
00100 AfxSetAmbientActCtx(FALSE);
00101 }
00102 #endif
00103
00104 BOOL success = CWinApp::InitInstance();
00105 ASSERT(success == TRUE);
00106
00107
00108
00109 success = COleObjectFactory::RegisterAll();
00110 ASSERT(success == TRUE);
00111
00112 return TRUE;
00113 }
00114
00116
00117
00118 STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
00119 {
00120 AFX_MANAGE_STATE(AfxGetStaticModuleState());
00121 return AfxDllGetClassObject(rclsid, riid, ppv);
00122 }
00123
00124 STDAPI DllCanUnloadNow(void)
00125 {
00126 AFX_MANAGE_STATE(AfxGetStaticModuleState());
00127 return AfxDllCanUnloadNow();
00128 }
00129
00130
00131 #define COMRETURN(hr) { HRESULT res; if((res = (hr)) != S_OK) return res; }
00132
00133
00134
00135
00136
00137 STDAPI DllRegisterServer(void)
00138 {
00139
00140
00141
00142
00143 AFX_MANAGE_STATE(AfxGetStaticModuleState());
00144
00145 if (!CUACUtils::isElevated()) {
00146 AfxMessageBox(_T("Component registration requires elevated rights on Windows Vista or later."), MB_ICONSTOP | MB_OK);
00147 return SELFREG_E_CLASS;
00148 }
00149
00150 if (!COleObjectFactory::UpdateRegistryAll(TRUE)) {
00151 return SELFREG_E_CLASS;
00152 }
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162 CComponentReg reg;
00163 if (g_REGISTER_SYSTEMWIDE)
00164 COMRETURN(reg.RegisterParadigms(REGACCESS_SYSTEM))
00165 else
00166 COMRETURN(reg.RegisterParadigms())
00167
00168
00169 return S_OK;
00170 }
00171
00172 STDAPI DllUnregisterServer(void)
00173 {
00174
00175
00176
00177
00178 AFX_MANAGE_STATE(AfxGetStaticModuleState());
00179
00180 if (!COleObjectFactory::UpdateRegistryAll(FALSE))
00181 return SELFREG_E_CLASS;
00182
00183 CComponentReg reg;
00184 if (g_REGISTER_SYSTEMWIDE)
00185 COMRETURN(reg.UnregisterParadigms(REGACCESS_SYSTEM))
00186 else
00187 COMRETURN(reg.UnregisterParadigms())
00188
00189 return S_OK;
00190 }
00191
00192 #define DIM(x) (sizeof(x)/sizeof((x)[0]))
00193
00194 STDAPI DllInstall(BOOL bInstall, LPCWSTR cmdl) {
00195
00196 regaccessmode_enum code = REGACCESS_NONE;
00197 if(iswdigit(cmdl[0]) && cmdl[1] == 0) {
00198 code = regaccessmode_enum(cmdl[0] - L'0');
00199 }
00200 else {
00201 struct {
00202 LPCWSTR name;
00203 regaccessmode_enum cc;
00204 } mnemonics[] = { { L"USER" , REGACCESS_USER},
00205 { L"REGACCESS_USER" , REGACCESS_USER},
00206 { L"SYSTEM" , REGACCESS_SYSTEM},
00207 { L"REGACCESS_SYSTEM" , REGACCESS_SYSTEM},
00208 { L"BOTH" , REGACCESS_BOTH},
00209 { L"REGACCESS_BOTH" , REGACCESS_BOTH} };
00210 for(int i = 0; i < DIM(mnemonics); i++) {
00211 if(_wcsicmp(cmdl, mnemonics[i].name) == 0) {
00212 code = mnemonics[i].cc;
00213 break;
00214 }
00215 }
00216 }
00217
00218
00219
00220
00221 CComponentReg reg;
00222 if(bInstall) { COMRETURN(reg.RegisterParadigms(code)); }
00223 else { COMRETURN(reg.UnregisterParadigms(code)); }
00224 return S_OK;
00225 };
00226
00227
00228