00001
00002
00003
00004 #include "stdafx.h"
00005
00006 #include <jni.h>
00007 #include "ComponentDll.h"
00008 #include "ComponentObj.h"
00009 #include "ComponentConfig.h"
00010 #include "MgaUtil.h"
00011
00012 extern bool const g_REGISTER_SYSTEMWIDE;
00013 extern const char* g_COMPONENT_NAME;
00014
00015
00016 #define COMRETURN(hr) { HRESULT res; if((res = (hr)) != S_OK) return res; }
00017 #define VERIFYTHROW(FUNC) \
00018 do { \
00019 if( !(bool)(FUNC) ) { \
00020 COMTHROW(E_FAIL); \
00021 } \
00022 } while(false)
00023
00024 #ifdef _DEBUG
00025 #define new DEBUG_NEW
00026 #undef THIS_FILE
00027 static char THIS_FILE[] = __FILE__;
00028 #endif
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 class CJavaCompFactory: public COleObjectFactory
00059 {
00060 public:
00061 CJavaCompFactory(REFCLSID clsid, CRuntimeClass* pRuntimeClass,
00062 BOOL bMultiInstance, LPCTSTR lpszProgID): COleObjectFactory(clsid, pRuntimeClass, bMultiInstance, lpszProgID)
00063
00064 {
00065 }
00066
00067 protected:
00068 CCmdTarget* OnCreateObject()
00069 {
00070 CComponentObj* p = (CComponentObj*)m_pRuntimeClass->CreateObject();
00071
00072 p->rawcomp.m_javaClassPath = m_javaClassPath;
00073 p->rawcomp.m_javaClass = m_javaClass;
00074
00075 return p;
00076 }
00077
00078 public:
00079 std::string m_javaClassPath;
00080 std::string m_javaClass;
00081 };
00082
00084
00085
00086 BEGIN_MESSAGE_MAP(CComponentApp, CWinApp)
00087
00088
00089
00090
00091 END_MESSAGE_MAP()
00092
00094
00095
00096 CComponentApp::CComponentApp() : CWinApp(g_COMPONENT_NAME)
00097 {
00098 }
00099
00101
00102
00103 CComponentApp theApp;
00104
00105 void CComponentApp::addComponents( HKEY root )
00106 {
00107 char buf[2000];
00108 char buf2[2000];
00109 char componentName[2000];
00110 int ind = 0;
00111
00112 HKEY folder;
00113 VERIFYTHROW(RegOpenKeyEx(root, "SOFTWARE\\GME\\Components", 0, KEY_READ, &folder )==ERROR_SUCCESS);
00114
00115 LONG ret = RegEnumKey(folder, ind, componentName, 2000);
00116 while(ret == ERROR_SUCCESS)
00117 {
00118 char classPath[2000];
00119 char jclass[2000];
00120 DWORD len = 2000;
00121 HKEY component;
00122
00123 sprintf( buf, "SOFTWARE\\GME\\Components\\%s", componentName );
00124 VERIFYTHROW(RegOpenKeyEx(root, buf, 0, KEY_READ, &component )==ERROR_SUCCESS);
00125 if(RegQueryValueEx(component, "JavaClassPath", NULL, NULL, (unsigned char*)classPath, &len ) == ERROR_SUCCESS)
00126 {
00127 classPath[len] = '\0';
00128
00129
00130
00131 HKEY clsidkey;
00132 CLSID clsid;
00133 len = 2000;
00134 sprintf( buf, "%s\\CLSID", componentName );
00135 VERIFYTHROW(RegOpenKeyEx(HKEY_CLASSES_ROOT, buf, 0, KEY_READ, &clsidkey)==ERROR_SUCCESS);
00136 VERIFYTHROW(RegQueryValueEx(clsidkey, "", NULL, NULL, (unsigned char*)buf2, &len) == ERROR_SUCCESS);
00137 buf2[len] = '\0';
00138 CComBSTR clsidBstr( buf2 );
00139 COMTHROW(CLSIDFromString(clsidBstr,&clsid));
00140
00141
00142 len = 2000;
00143 jclass[0] = 0;
00144 if (RegQueryValueEx(component, "JavaClass", NULL, NULL, (unsigned char*)jclass, &len ) == ERROR_SUCCESS)
00145 jclass[len] = '\0';
00146
00147
00148 CJavaCompFactory * fac = new CJavaCompFactory(clsid, RUNTIME_CLASS(CComponentObj), FALSE, componentName);
00149 fac->m_javaClassPath = classPath;
00150 fac->m_javaClass = jclass;
00151 m_factories.push_back(fac);
00152 }
00153 ind++;
00154 ret = RegEnumKey(folder, ind, componentName, 2000);
00155 }
00156
00157 RegCloseKey(folder);
00158 }
00159
00160 BOOL CComponentApp::InitInstance()
00161 {
00162 GUID defGUID = {COCLASS_UUID_EXPLODED1,
00163 COCLASS_UUID_EXPLODED2,
00164 COCLASS_UUID_EXPLODED3,
00165 { COCLASS_UUID_EXPLODED4,
00166 COCLASS_UUID_EXPLODED5,
00167 COCLASS_UUID_EXPLODED6,
00168 COCLASS_UUID_EXPLODED7,
00169 COCLASS_UUID_EXPLODED8,
00170 COCLASS_UUID_EXPLODED9,
00171 COCLASS_UUID_EXPLODED10,
00172 COCLASS_UUID_EXPLODED11}
00173 };
00174 CJavaCompFactory * defFactory = new CJavaCompFactory(defGUID, RUNTIME_CLASS(CComponentObj), FALSE, COCLASS_PROGID);
00175 m_factories.push_back(defFactory);
00176 try
00177 {
00178 addComponents( HKEY_LOCAL_MACHINE );
00179 addComponents( HKEY_CURRENT_USER );
00180 }
00181 catch(...)
00182 {
00183 }
00184
00185 COleObjectFactory::RegisterAll();
00186
00187 return TRUE;
00188 }
00189
00190 int CComponentApp::ExitInstance()
00191 {
00192
00193 for( unsigned int i=0; i<m_factories.size(); ++i )
00194 delete m_factories[i];
00195
00196 return CWinApp::ExitInstance();
00197 }
00198
00199
00201
00202
00203 STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
00204 {
00205 AFX_MANAGE_STATE(AfxGetStaticModuleState());
00206
00207
00208 HRESULT res = AfxDllGetClassObject(rclsid, riid, ppv);
00209 return res;
00210 }
00211
00212 STDAPI DllCanUnloadNow(void)
00213 {
00214 AFX_MANAGE_STATE(AfxGetStaticModuleState());
00215 return AfxDllCanUnloadNow();
00216 }
00217
00218
00219
00220
00221
00222
00223
00224
00225 STDAPI DllRegisterServer(void)
00226 {
00227
00228
00229
00230
00231 AFX_MANAGE_STATE(AfxGetStaticModuleState());
00232
00233 if (!COleObjectFactory::UpdateRegistryAll(TRUE))
00234 return SELFREG_E_CLASS;
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244 CComponentReg reg;
00245 if (g_REGISTER_SYSTEMWIDE)
00246 COMRETURN(reg.RegisterParadigms(REGACCESS_SYSTEM))
00247 else
00248 COMRETURN(reg.RegisterParadigms())
00249
00250
00251 return S_OK;
00252 }
00253
00254 STDAPI DllUnregisterServer(void)
00255 {
00256
00257
00258
00259
00260 AFX_MANAGE_STATE(AfxGetStaticModuleState());
00261
00262 if (!COleObjectFactory::UpdateRegistryAll(FALSE))
00263 return SELFREG_E_CLASS;
00264
00265 CComponentReg reg;
00266 if (g_REGISTER_SYSTEMWIDE)
00267 COMRETURN(reg.UnregisterParadigms(REGACCESS_SYSTEM))
00268 else
00269 COMRETURN(reg.UnregisterParadigms())
00270
00271 return S_OK;
00272 }
00273
00274 #define DIM(x) (sizeof(x)/sizeof((x)[0]))
00275
00276 STDAPI DllInstall(BOOL bInstall, LPCWSTR cmdl) {
00277
00278 regaccessmode_enum code = REGACCESS_NONE;
00279 if(iswdigit(cmdl[0]) && cmdl[1] == 0) {
00280 code = regaccessmode_enum(cmdl[0] - L'0');
00281 }
00282 else {
00283 struct {
00284 LPCWSTR name;
00285 regaccessmode_enum cc;
00286 } mnemonics[] = { { L"USER" , REGACCESS_USER},
00287 { L"REGACCESS_USER" , REGACCESS_USER},
00288 { L"SYSTEM" , REGACCESS_SYSTEM},
00289 { L"REGACCESS_SYSTEM" , REGACCESS_SYSTEM},
00290 { L"BOTH" , REGACCESS_BOTH},
00291 { L"REGACCESS_BOTH" , REGACCESS_BOTH} };
00292 for(int i = 0; i < DIM(mnemonics); i++) {
00293 if(_wcsicmp(cmdl, mnemonics[i].name) == 0) {
00294 code = mnemonics[i].cc;
00295 break;
00296 }
00297 }
00298 }
00299
00300
00301
00302
00303 CComponentReg reg;
00304 if(bInstall) { COMRETURN(reg.RegisterParadigms(code)); }
00305 else { COMRETURN(reg.UnregisterParadigms(code)); }
00306 return S_OK;
00307 };
00308
00309
00310