예제 #1
0
파일: com4j.cpp 프로젝트: Alcar32/com4j
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);
}
예제 #2
0
파일: com4j.cpp 프로젝트: Alcar32/com4j
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);
}
예제 #3
0
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;
}