JNIEXPORT jlong JNICALL Java_com4j_Native_createInstance( JNIEnv* env, jclass __unused__, jstring _progId, jint clsctx, jlong iid1, jlong iid2 ) { MyGUID iid(iid1,iid2); CLSID clsid; HRESULT hr; JString progId(env,_progId); hr = CLSIDFromProgID(progId,&clsid); if(FAILED(hr)) { if(FAILED(CLSIDFromString( const_cast<LPOLESTR>(LPCOLESTR(progId)),&clsid))) { error(env,__FILE__,__LINE__,hr,"Unrecognized CLSID"); return 0; } } void* p; if(clsctx&(CLSCTX_LOCAL_SERVER|CLSCTX_REMOTE_SERVER)) { IUnknown* pUnk = NULL; hr = CoCreateInstance(clsid,NULL,clsctx,__uuidof(IUnknown),(void**)&pUnk); if(FAILED(hr)) { error(env,__FILE__,__LINE__,hr,"CoCreateInstance failed"); return 0; } hr = OleRun(pUnk); if(FAILED(hr)) { pUnk->Release(); error(env,__FILE__,__LINE__,hr,"OleRun failed"); return 0; } hr = pUnk->QueryInterface(iid,&p); pUnk->Release(); if(FAILED(hr)) { error(env,__FILE__,__LINE__,hr,"QueryInterface failed"); return 0; } } else { // just the plain CoCreateInstance hr = CoCreateInstance(clsid,NULL,clsctx,iid,&p); if(FAILED(hr)) { error(env,__FILE__,__LINE__,hr,"CoCreateInstance failed"); return 0; } } return reinterpret_cast<jlong>(p); }
JNIEXPORT jlong JNICALL Java_com4j_Native_getObject( JNIEnv* env, jclass __unused__, jstring _fileName, jstring _progId) { HRESULT hr; if(_progId==NULL) { // case 1: just file name IBindCtxPtr pbc; ULONG cEaten; IMonikerPtr pmk; IDispatch* pDisp; hr = CreateBindCtx(NULL,&pbc); if(FAILED(hr)) { error(env,__FILE__,__LINE__,hr,"Failed to CreateBindCtx"); return 0; } hr = MkParseDisplayName(pbc,JString(env,_fileName),&cEaten,&pmk); if(FAILED(hr)) { error(env,__FILE__,__LINE__,hr,"Failed to MkParseDisplayName"); return 0; } hr = BindMoniker(pmk,0,__uuidof(IDispatch),(LPVOID*)&pDisp); if(FAILED(hr)) { error(env,__FILE__,__LINE__,hr,"Failed to bind moniker"); return 0; } return reinterpret_cast<jlong>(pDisp); } JString progId(env,_progId); CLSID clsid; IUnknown* pUnk=NULL; hr = CLSIDFromProgID(progId,&clsid); if(FAILED(hr)) { error(env,__FILE__,__LINE__,hr,"Unrecognized progID"); return 0; } if(_fileName==NULL) { // case 2: just progId hr = GetActiveObject(clsid,NULL,&pUnk); if(FAILED(hr)) { error(env,__FILE__,__LINE__,hr,"Failed to GetActiveObject"); return 0; } return reinterpret_cast<jlong>(pUnk); } // case 3: both file name and progID hr = CoCreateInstance(clsid,NULL,CLSCTX_SERVER,__uuidof(IUnknown),(LPVOID*)&pUnk); if(FAILED(hr)) { error(env,__FILE__,__LINE__,hr,"Failed to create CoCreateInstance"); return 0; } IPersistFilePtr ppf(pUnk); hr = ppf->Load(JString(env,_fileName),0); if(FAILED(hr)) { error(env,__FILE__,__LINE__,hr,"Failed to load from file"); pUnk->Release(); return 0; } return reinterpret_cast<jlong>(pUnk); }
HRESULT RegisterServer(const CLSID& clsid, // Class ID const char* szFriendlyName, // Friendly Name const char* szVerIndProgID, // Programmatic const char* szProgID) // IDs { HMODULE hModule = GetModuleHandle(NULL); char szModuleName[MAX_SIZE]; char szCLSID[CLSID_STRING_SIZE]; nsCAutoString independentProgId(szVerIndProgID); nsCAutoString progId(szProgID); DWORD dwResult = ::GetModuleFileName(hModule, szModuleName, sizeof(szModuleName)/sizeof(char)); if (dwResult == 0) return S_FALSE; nsCAutoString moduleName(szModuleName); nsCAutoString registryKey("CLSID\\"); moduleName += MAPI_STARTUP_ARG; // Convert the CLSID into a char. if (!CLSIDtochar(clsid, szCLSID, sizeof(szCLSID))) return S_FALSE; registryKey += szCLSID; // Add the CLSID to the registry. if (!setKeyAndValue(registryKey, NULL, szFriendlyName)) return S_FALSE; if (!setKeyAndValue(registryKey, "LocalServer32", moduleName.get())) return S_FALSE; // Add the ProgID subkey under the CLSID key. if (!setKeyAndValue(registryKey, "ProgID", szProgID)) return S_FALSE; // Add the version-independent ProgID subkey under CLSID key. if (!setKeyAndValue(registryKey, "VersionIndependentProgID", szVerIndProgID)) return S_FALSE; // Add the version-independent ProgID subkey under HKEY_CLASSES_ROOT. if (!setKeyAndValue(independentProgId, NULL, szFriendlyName)) return S_FALSE; if (!setKeyAndValue(independentProgId, "CLSID", szCLSID)) return S_FALSE; if (!setKeyAndValue(independentProgId, "CurVer", szProgID)) return S_FALSE; // Add the versioned ProgID subkey under HKEY_CLASSES_ROOT. if (!setKeyAndValue(progId, NULL, szFriendlyName)) return S_FALSE; if (!setKeyAndValue(progId, "CLSID", szCLSID)) return S_FALSE; RegisterProxy(); return S_OK; }