changing data type to ascii so diffs will work

This commit is contained in:
clay_shooter
2005-01-08 16:56:02 +00:00
parent 9b64eb033a
commit 7b81d761b7
22 changed files with 6677 additions and 6677 deletions

View File

@@ -1,57 +1,57 @@
/* /*
* Copyright (c) 1999-2004 Sourceforge JACOB Project. * Copyright (c) 1999-2004 Sourceforge JACOB Project.
* All rights reserved. Originator: Dan Adler (http://danadler.com). * All rights reserved. Originator: Dan Adler (http://danadler.com).
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
* are met: * are met:
* 1. Redistributions of source code must retain the above copyright * 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright * 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in * notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the * the documentation and/or other materials provided with the
* distribution. * distribution.
* 3. Redistributions in any form must be accompanied by information on * 3. Redistributions in any form must be accompanied by information on
* how to obtain complete source code for the JACOB software. * how to obtain complete source code for the JACOB software.
* *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE. * OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "stdafx.h" #include "stdafx.h"
#include <objbase.h> #include <objbase.h>
#include "ComThread.h" #include "ComThread.h"
// Win32 support for Ole Automation // Win32 support for Ole Automation
#include <wchar.h> #include <wchar.h>
#include <string.h> #include <string.h>
#include <atlbase.h> #include <atlbase.h>
#include <oleauto.h> #include <oleauto.h>
#include <olectl.h> #include <olectl.h>
#include "util.h" #include "util.h"
extern "C" extern "C"
{ {
JNIEXPORT void JNICALL Java_com_jacob_com_ComThread_doCoInitialize JNIEXPORT void JNICALL Java_com_jacob_com_ComThread_doCoInitialize
(JNIEnv *env, jclass cls, jint mode) (JNIEnv *env, jclass cls, jint mode)
{ {
int threadModel = mode; int threadModel = mode;
CoInitializeEx(NULL, threadModel); CoInitializeEx(NULL, threadModel);
} }
JNIEXPORT void JNICALL Java_com_jacob_com_ComThread_doCoUninitialize JNIEXPORT void JNICALL Java_com_jacob_com_ComThread_doCoUninitialize
(JNIEnv *env, jclass cls) (JNIEnv *env, jclass cls)
{ {
CoUninitialize(); CoUninitialize();
} }
} }

View File

@@ -1,30 +1,30 @@
/* DO NOT EDIT THIS FILE - it is machine generated */ /* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h> #include <jni.h>
/* Header for class com_jacob_com_ComThread */ /* Header for class com_jacob_com_ComThread */
#ifndef _Included_com_jacob_com_ComThread #ifndef _Included_com_jacob_com_ComThread
#define _Included_com_jacob_com_ComThread #define _Included_com_jacob_com_ComThread
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
/* /*
* Class: com_jacob_com_ComThread * Class: com_jacob_com_ComThread
* Method: doCoInitialize * Method: doCoInitialize
* Signature: (I)V * Signature: (I)V
*/ */
JNIEXPORT void JNICALL Java_com_jacob_com_ComThread_doCoInitialize JNIEXPORT void JNICALL Java_com_jacob_com_ComThread_doCoInitialize
(JNIEnv *, jclass, jint); (JNIEnv *, jclass, jint);
/* /*
* Class: com_jacob_com_ComThread * Class: com_jacob_com_ComThread
* Method: doCoUninitialize * Method: doCoUninitialize
* Signature: ()V * Signature: ()V
*/ */
JNIEXPORT void JNICALL Java_com_jacob_com_ComThread_doCoUninitialize JNIEXPORT void JNICALL Java_com_jacob_com_ComThread_doCoUninitialize
(JNIEnv *, jclass); (JNIEnv *, jclass);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif #endif

View File

@@ -1,440 +1,440 @@
/* /*
* Copyright (c) 1999-2004 Sourceforge JACOB Project. * Copyright (c) 1999-2004 Sourceforge JACOB Project.
* All rights reserved. Originator: Dan Adler (http://danadler.com). * All rights reserved. Originator: Dan Adler (http://danadler.com).
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
* are met: * are met:
* 1. Redistributions of source code must retain the above copyright * 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright * 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in * notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the * the documentation and/or other materials provided with the
* distribution. * distribution.
* 3. Redistributions in any form must be accompanied by information on * 3. Redistributions in any form must be accompanied by information on
* how to obtain complete source code for the JACOB software. * how to obtain complete source code for the JACOB software.
* *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE. * OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "stdafx.h" #include "stdafx.h"
#include <objbase.h> #include <objbase.h>
#include "Dispatch.h" #include "Dispatch.h"
// Win32 support for Ole Automation // Win32 support for Ole Automation
#include <wchar.h> #include <wchar.h>
#include <string.h> #include <string.h>
#include <atlbase.h> #include <atlbase.h>
#include <oleauto.h> #include <oleauto.h>
#include <olectl.h> #include <olectl.h>
#include "util.h" #include "util.h"
extern "C" extern "C"
{ {
#define DISP_FLD "m_pDispatch" #define DISP_FLD "m_pDispatch"
// extract a IDispatch from a jobject // extract a IDispatch from a jobject
IDispatch *extractDispatch(JNIEnv *env, jobject arg) IDispatch *extractDispatch(JNIEnv *env, jobject arg)
{ {
jclass argClass = env->GetObjectClass(arg); jclass argClass = env->GetObjectClass(arg);
jfieldID ajf = env->GetFieldID( argClass, DISP_FLD, "I"); jfieldID ajf = env->GetFieldID( argClass, DISP_FLD, "I");
jint anum = env->GetIntField(arg, ajf); jint anum = env->GetIntField(arg, ajf);
IDispatch *v = (IDispatch *)anum; IDispatch *v = (IDispatch *)anum;
return v; return v;
} }
JNIEXPORT jobject JNICALL Java_com_jacob_com_Dispatch_QueryInterface JNIEXPORT jobject JNICALL Java_com_jacob_com_Dispatch_QueryInterface
(JNIEnv *env, jobject _this, jstring _iid) (JNIEnv *env, jobject _this, jstring _iid)
{ {
// get the current IDispatch // get the current IDispatch
IDispatch *pIDispatch = extractDispatch(env, _this); IDispatch *pIDispatch = extractDispatch(env, _this);
if (!pIDispatch) return NULL; if (!pIDispatch) return NULL;
const char *siid = env->GetStringUTFChars(_iid, NULL); const char *siid = env->GetStringUTFChars(_iid, NULL);
USES_CONVERSION; USES_CONVERSION;
LPOLESTR bsIID = A2W(siid); LPOLESTR bsIID = A2W(siid);
env->ReleaseStringUTFChars(_iid, siid); env->ReleaseStringUTFChars(_iid, siid);
IID iid; IID iid;
HRESULT hr = IIDFromString(bsIID, &iid); HRESULT hr = IIDFromString(bsIID, &iid);
if (FAILED(hr)) { if (FAILED(hr)) {
ThrowComFail(env, "Can't get IID from String", hr); ThrowComFail(env, "Can't get IID from String", hr);
return NULL; return NULL;
} }
// try to call QI on the passed IID // try to call QI on the passed IID
IDispatch *disp; IDispatch *disp;
hr = pIDispatch->QueryInterface(iid, (void **)&disp); hr = pIDispatch->QueryInterface(iid, (void **)&disp);
if (FAILED(hr)) { if (FAILED(hr)) {
ThrowComFail(env, "QI on IID from String Failed", hr); ThrowComFail(env, "QI on IID from String Failed", hr);
return NULL; return NULL;
} }
jclass autoClass = env->FindClass("com/jacob/com/Dispatch"); jclass autoClass = env->FindClass("com/jacob/com/Dispatch");
jmethodID autoCons = jmethodID autoCons =
env->GetMethodID(autoClass, "<init>", "(I)V"); env->GetMethodID(autoClass, "<init>", "(I)V");
// construct a Dispatch object to return // construct a Dispatch object to return
// I am copying the pointer to java // I am copying the pointer to java
// jacob-msg 1817 - SF 1053871 : QueryInterface already called AddRef!! // jacob-msg 1817 - SF 1053871 : QueryInterface already called AddRef!!
//if (disp) disp->AddRef(); //if (disp) disp->AddRef();
jobject newAuto = env->NewObject(autoClass, autoCons, disp); jobject newAuto = env->NewObject(autoClass, autoCons, disp);
return newAuto; return newAuto;
} }
JNIEXPORT void JNICALL Java_com_jacob_com_Dispatch_createInstance JNIEXPORT void JNICALL Java_com_jacob_com_Dispatch_createInstance
(JNIEnv *env, jobject _this, jstring _progid) (JNIEnv *env, jobject _this, jstring _progid)
{ {
jclass clazz = env->GetObjectClass(_this); jclass clazz = env->GetObjectClass(_this);
jfieldID jf = env->GetFieldID( clazz, DISP_FLD, "I"); jfieldID jf = env->GetFieldID( clazz, DISP_FLD, "I");
const char *progid = env->GetStringUTFChars(_progid, NULL); const char *progid = env->GetStringUTFChars(_progid, NULL);
CLSID clsid; CLSID clsid;
HRESULT hr; HRESULT hr;
IUnknown *punk = NULL; IUnknown *punk = NULL;
IDispatch *pIDispatch; IDispatch *pIDispatch;
USES_CONVERSION; USES_CONVERSION;
LPOLESTR bsProgId = A2W(progid); LPOLESTR bsProgId = A2W(progid);
if (strchr(progid,':')) if (strchr(progid,':'))
{ {
env->ReleaseStringUTFChars(_progid, progid); env->ReleaseStringUTFChars(_progid, progid);
// it's a moniker // it's a moniker
hr = CoGetObject(bsProgId, NULL, IID_IUnknown, (LPVOID *)&punk); hr = CoGetObject(bsProgId, NULL, IID_IUnknown, (LPVOID *)&punk);
if (FAILED(hr)) { if (FAILED(hr)) {
ThrowComFail(env, "Can't find moniker", hr); ThrowComFail(env, "Can't find moniker", hr);
return; return;
} }
IClassFactory *pIClass; IClassFactory *pIClass;
// if it was a clsid moniker, I may have a class factory // if it was a clsid moniker, I may have a class factory
hr = punk->QueryInterface(IID_IClassFactory, (void **)&pIClass); hr = punk->QueryInterface(IID_IClassFactory, (void **)&pIClass);
if (!SUCCEEDED(hr)) goto doDisp; if (!SUCCEEDED(hr)) goto doDisp;
punk->Release(); punk->Release();
// try to create an instance // try to create an instance
hr = pIClass->CreateInstance(NULL, IID_IUnknown, (void **)&punk); hr = pIClass->CreateInstance(NULL, IID_IUnknown, (void **)&punk);
if (FAILED(hr)) { if (FAILED(hr)) {
ThrowComFail(env, "Can't create moniker class instance", hr); ThrowComFail(env, "Can't create moniker class instance", hr);
return; return;
} }
pIClass->Release(); pIClass->Release();
goto doDisp; goto doDisp;
} }
env->ReleaseStringUTFChars(_progid, progid); env->ReleaseStringUTFChars(_progid, progid);
// Now, try to find an IDispatch interface for progid // Now, try to find an IDispatch interface for progid
hr = CLSIDFromProgID(bsProgId, &clsid); hr = CLSIDFromProgID(bsProgId, &clsid);
if (FAILED(hr)) { if (FAILED(hr)) {
ThrowComFail(env, "Can't get object clsid from progid", hr); ThrowComFail(env, "Can't get object clsid from progid", hr);
return; return;
} }
// standard creation // standard creation
hr = CoCreateInstance(clsid,NULL,CLSCTX_LOCAL_SERVER|CLSCTX_INPROC_SERVER,IID_IUnknown, (void **)&punk); hr = CoCreateInstance(clsid,NULL,CLSCTX_LOCAL_SERVER|CLSCTX_INPROC_SERVER,IID_IUnknown, (void **)&punk);
if (!SUCCEEDED(hr)) { if (!SUCCEEDED(hr)) {
ThrowComFail(env, "Can't co-create object", hr); ThrowComFail(env, "Can't co-create object", hr);
return; return;
} }
doDisp: doDisp:
// now get an IDispatch pointer from the IUnknown // now get an IDispatch pointer from the IUnknown
hr = punk->QueryInterface(IID_IDispatch, (void **)&pIDispatch); hr = punk->QueryInterface(IID_IDispatch, (void **)&pIDispatch);
if (!SUCCEEDED(hr)) { if (!SUCCEEDED(hr)) {
ThrowComFail(env, "Can't QI object for IDispatch", hr); ThrowComFail(env, "Can't QI object for IDispatch", hr);
return; return;
} }
// CoCreateInstance called AddRef // CoCreateInstance called AddRef
punk->Release(); punk->Release();
env->SetIntField(_this, jf, (unsigned int)pIDispatch); env->SetIntField(_this, jf, (unsigned int)pIDispatch);
} }
JNIEXPORT void JNICALL Java_com_jacob_com_Dispatch_release JNIEXPORT void JNICALL Java_com_jacob_com_Dispatch_release
(JNIEnv *env, jobject _this) (JNIEnv *env, jobject _this)
{ {
jclass clazz = env->GetObjectClass(_this); jclass clazz = env->GetObjectClass(_this);
jfieldID jf = env->GetFieldID( clazz, DISP_FLD, "I"); jfieldID jf = env->GetFieldID( clazz, DISP_FLD, "I");
jint num = env->GetIntField(_this, jf); jint num = env->GetIntField(_this, jf);
IDispatch *disp = (IDispatch *)num; IDispatch *disp = (IDispatch *)num;
if (disp) { if (disp) {
disp->Release(); disp->Release();
env->SetIntField(_this, jf, (unsigned int)0); env->SetIntField(_this, jf, (unsigned int)0);
} }
} }
static HRESULT static HRESULT
name2ID(IDispatch *pIDispatch, const char *prop, DISPID *dispid, long lcid) name2ID(IDispatch *pIDispatch, const char *prop, DISPID *dispid, long lcid)
{ {
HRESULT hresult; HRESULT hresult;
USES_CONVERSION; USES_CONVERSION;
LPOLESTR propOle = A2W(prop); LPOLESTR propOle = A2W(prop);
hresult = pIDispatch->GetIDsOfNames(IID_NULL,(LPOLESTR*)&propOle,1,lcid,dispid); hresult = pIDispatch->GetIDsOfNames(IID_NULL,(LPOLESTR*)&propOle,1,lcid,dispid);
return hresult; return hresult;
} }
JNIEXPORT jintArray JNICALL Java_com_jacob_com_Dispatch_getIDsOfNames JNIEXPORT jintArray JNICALL Java_com_jacob_com_Dispatch_getIDsOfNames
(JNIEnv *env, jclass clazz, jobject disp, jint lcid, jobjectArray names) (JNIEnv *env, jclass clazz, jobject disp, jint lcid, jobjectArray names)
{ {
IDispatch *pIDispatch = extractDispatch(env, disp); IDispatch *pIDispatch = extractDispatch(env, disp);
if (!pIDispatch) return NULL; if (!pIDispatch) return NULL;
int l = env->GetArrayLength(names); int l = env->GetArrayLength(names);
int i; int i;
LPOLESTR *lps = (LPOLESTR *)CoTaskMemAlloc(l * sizeof(LPOLESTR)); LPOLESTR *lps = (LPOLESTR *)CoTaskMemAlloc(l * sizeof(LPOLESTR));
DISPID *dispid = (DISPID *)CoTaskMemAlloc(l * sizeof(DISPID)); DISPID *dispid = (DISPID *)CoTaskMemAlloc(l * sizeof(DISPID));
for(i=0;i<l;i++) for(i=0;i<l;i++)
{ {
USES_CONVERSION; USES_CONVERSION;
jstring s = (jstring)env->GetObjectArrayElement(names, i); jstring s = (jstring)env->GetObjectArrayElement(names, i);
const char *nm = env->GetStringUTFChars(s, NULL); const char *nm = env->GetStringUTFChars(s, NULL);
LPOLESTR nmos = A2W(nm); LPOLESTR nmos = A2W(nm);
env->ReleaseStringUTFChars(s, nm); env->ReleaseStringUTFChars(s, nm);
lps[i] = nmos; lps[i] = nmos;
env->DeleteLocalRef(s); env->DeleteLocalRef(s);
} }
HRESULT hr = pIDispatch->GetIDsOfNames(IID_NULL,lps,l,lcid,dispid); HRESULT hr = pIDispatch->GetIDsOfNames(IID_NULL,lps,l,lcid,dispid);
if (FAILED(hr)) { if (FAILED(hr)) {
CoTaskMemFree(lps); CoTaskMemFree(lps);
CoTaskMemFree(dispid); CoTaskMemFree(dispid);
char buf[1024]; char buf[1024];
strcpy(buf, "Can't map names to dispid:"); strcpy(buf, "Can't map names to dispid:");
for(i=0;i<l;i++) for(i=0;i<l;i++)
{ {
USES_CONVERSION; USES_CONVERSION;
jstring s = (jstring)env->GetObjectArrayElement(names, i); jstring s = (jstring)env->GetObjectArrayElement(names, i);
const char *nm = env->GetStringUTFChars(s, NULL); const char *nm = env->GetStringUTFChars(s, NULL);
strcat(buf, nm); strcat(buf, nm);
env->ReleaseStringUTFChars(s, nm); env->ReleaseStringUTFChars(s, nm);
env->DeleteLocalRef(s); env->DeleteLocalRef(s);
} }
ThrowComFail(env, buf, hr); ThrowComFail(env, buf, hr);
return NULL; return NULL;
} }
jintArray iarr = env->NewIntArray(l); jintArray iarr = env->NewIntArray(l);
env->SetIntArrayRegion(iarr, i, l, dispid); env->SetIntArrayRegion(iarr, i, l, dispid);
CoTaskMemFree(lps); CoTaskMemFree(lps);
CoTaskMemFree(dispid); CoTaskMemFree(dispid);
return iarr; return iarr;
} }
static char* BasicToCharString(const BSTR inBasicString) static char* BasicToCharString(const BSTR inBasicString)
{ {
char* charString = NULL; char* charString = NULL;
const size_t charStrSize = ::SysStringLen(inBasicString) + 1; const size_t charStrSize = ::SysStringLen(inBasicString) + 1;
if (charStrSize > 1) if (charStrSize > 1)
{ {
charString = new char[charStrSize]; charString = new char[charStrSize];
size_t len = ::wcstombs(charString, inBasicString, charStrSize); size_t len = ::wcstombs(charString, inBasicString, charStrSize);
} }
else else
charString = ::strdup(""); charString = ::strdup("");
return charString; return charString;
} }
static char* CreateErrorMsgFromResult(HRESULT inResult) static char* CreateErrorMsgFromResult(HRESULT inResult)
{ {
char* msg = NULL; char* msg = NULL;
::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | ::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM, NULL, inResult,MAKELANGID(LANG_NEUTRAL, FORMAT_MESSAGE_FROM_SYSTEM, NULL, inResult,MAKELANGID(LANG_NEUTRAL,
SUBLANG_DEFAULT), (LPTSTR) &msg, 0, NULL); SUBLANG_DEFAULT), (LPTSTR) &msg, 0, NULL);
if (msg == NULL) if (msg == NULL)
msg = ::strdup("An unknown COM error has occured."); msg = ::strdup("An unknown COM error has occured.");
return msg; return msg;
} }
static char* CreateErrorMsgFromInfo(HRESULT inResult, EXCEPINFO* ioInfo, static char* CreateErrorMsgFromInfo(HRESULT inResult, EXCEPINFO* ioInfo,
const char* methName) const char* methName)
{ {
char* msg = NULL; char* msg = NULL;
// If this is a dispatch exception (triggered by an Invoke message), // If this is a dispatch exception (triggered by an Invoke message),
// then we have to take some additional steps to process the error // then we have to take some additional steps to process the error
// message. // message.
if (inResult == DISP_E_EXCEPTION) if (inResult == DISP_E_EXCEPTION)
{ {
// Check to see if the server deferred filling in the exception // Check to see if the server deferred filling in the exception
// information. If so, make the call to populate the structure. // information. If so, make the call to populate the structure.
if (ioInfo->pfnDeferredFillIn != NULL) if (ioInfo->pfnDeferredFillIn != NULL)
(*(ioInfo->pfnDeferredFillIn))(ioInfo); (*(ioInfo->pfnDeferredFillIn))(ioInfo);
// Build the error message from exception information content. // Build the error message from exception information content.
char* source = ::BasicToCharString(ioInfo->bstrSource); char* source = ::BasicToCharString(ioInfo->bstrSource);
char* desc = ::BasicToCharString(ioInfo->bstrDescription); char* desc = ::BasicToCharString(ioInfo->bstrDescription);
const size_t MSG_LEN = ::strlen(methName) + ::strlen(source) + ::strlen(desc) + 128; const size_t MSG_LEN = ::strlen(methName) + ::strlen(source) + ::strlen(desc) + 128;
msg = new char[MSG_LEN]; msg = new char[MSG_LEN];
::strncpy(msg, "Invoke of: ", MSG_LEN); ::strncpy(msg, "Invoke of: ", MSG_LEN);
::strncat(msg, methName, MSG_LEN); ::strncat(msg, methName, MSG_LEN);
::strncat(msg, "\nSource: ", MSG_LEN); ::strncat(msg, "\nSource: ", MSG_LEN);
::strncat(msg, source, MSG_LEN); ::strncat(msg, source, MSG_LEN);
::strncat(msg, "\nDescription: ", MSG_LEN); ::strncat(msg, "\nDescription: ", MSG_LEN);
::strncat(msg, desc, MSG_LEN); ::strncat(msg, desc, MSG_LEN);
::strncat(msg, "\n", MSG_LEN); ::strncat(msg, "\n", MSG_LEN);
delete source; delete source;
delete desc; delete desc;
} }
else else
{ {
char* msg2 = CreateErrorMsgFromResult(inResult); char* msg2 = CreateErrorMsgFromResult(inResult);
const size_t MSG_LEN = ::strlen(methName) + ::strlen(msg2) + 128; const size_t MSG_LEN = ::strlen(methName) + ::strlen(msg2) + 128;
msg = new char[MSG_LEN]; msg = new char[MSG_LEN];
::strncpy(msg, "A COM exception has been encountered:\n" ::strncpy(msg, "A COM exception has been encountered:\n"
"At Invoke of: ", MSG_LEN); "At Invoke of: ", MSG_LEN);
::strncat(msg, methName, MSG_LEN); ::strncat(msg, methName, MSG_LEN);
::strncat(msg, "\nDescription: ", MSG_LEN); ::strncat(msg, "\nDescription: ", MSG_LEN);
::strncat(msg, msg2, MSG_LEN); ::strncat(msg, msg2, MSG_LEN);
// jacob-msg 1075 - SF 1053872 : Documentation says "use LocalFree"!! // jacob-msg 1075 - SF 1053872 : Documentation says "use LocalFree"!!
//delete msg2; //delete msg2;
LocalFree(msg2); LocalFree(msg2);
} }
return msg; return msg;
} }
#define SETDISPPARAMS(dp, numArgs, pvArgs, numNamed, pNamed) \ #define SETDISPPARAMS(dp, numArgs, pvArgs, numNamed, pNamed) \
{\ {\
(dp).cArgs = numArgs; \ (dp).cArgs = numArgs; \
(dp).rgvarg = pvArgs; \ (dp).rgvarg = pvArgs; \
(dp).cNamedArgs = numNamed; \ (dp).cNamedArgs = numNamed; \
(dp).rgdispidNamedArgs = pNamed; \ (dp).rgdispidNamedArgs = pNamed; \
} }
#define SETNOPARAMS(dp) SETDISPPARAMS(dp, 0, NULL, 0, NULL) #define SETNOPARAMS(dp) SETDISPPARAMS(dp, 0, NULL, 0, NULL)
JNIEXPORT jobject JNICALL Java_com_jacob_com_Dispatch_invokev JNIEXPORT jobject JNICALL Java_com_jacob_com_Dispatch_invokev
(JNIEnv *env, jclass clazz, (JNIEnv *env, jclass clazz,
jobject disp, jstring name, jint dispid, jobject disp, jstring name, jint dispid,
jint lcid, jint wFlags, jobjectArray vArg, jintArray uArgErr) jint lcid, jint wFlags, jobjectArray vArg, jintArray uArgErr)
{ {
DISPPARAMS dispparams; DISPPARAMS dispparams;
EXCEPINFO excepInfo; EXCEPINFO excepInfo;
IDispatch *pIDispatch = extractDispatch(env, disp); IDispatch *pIDispatch = extractDispatch(env, disp);
if (!pIDispatch) return NULL; if (!pIDispatch) return NULL;
int dispID = dispid; int dispID = dispid;
if (name != NULL) if (name != NULL)
{ {
const char *nm = env->GetStringUTFChars(name, NULL); const char *nm = env->GetStringUTFChars(name, NULL);
HRESULT hr; HRESULT hr;
if (FAILED(hr = name2ID(pIDispatch, nm, (long *)&dispID, lcid))) { if (FAILED(hr = name2ID(pIDispatch, nm, (long *)&dispID, lcid))) {
char buf[1024]; char buf[1024];
sprintf(buf, "Can't map name to dispid: %s", nm); sprintf(buf, "Can't map name to dispid: %s", nm);
ThrowComFail(env, buf, -1); ThrowComFail(env, buf, -1);
return NULL; return NULL;
} }
env->ReleaseStringUTFChars(name, nm); env->ReleaseStringUTFChars(name, nm);
} }
int num_args = env->GetArrayLength(vArg); int num_args = env->GetArrayLength(vArg);
int i, j; int i, j;
VARIANT *varr = NULL; VARIANT *varr = NULL;
if (num_args) if (num_args)
{ {
varr = (VARIANT *)CoTaskMemAlloc(num_args*sizeof(VARIANT)); varr = (VARIANT *)CoTaskMemAlloc(num_args*sizeof(VARIANT));
/* reverse args for dispatch */ /* reverse args for dispatch */
for(i=num_args-1,j=0;0<=i;i--,j++) for(i=num_args-1,j=0;0<=i;i--,j++)
{ {
VariantInit(&varr[j]); VariantInit(&varr[j]);
jobject arg = env->GetObjectArrayElement(vArg, i); jobject arg = env->GetObjectArrayElement(vArg, i);
VARIANT *v = extractVariant(env, arg); VARIANT *v = extractVariant(env, arg);
// no escape from copy? // no escape from copy?
VariantCopy(&varr[j], v); VariantCopy(&varr[j], v);
env->DeleteLocalRef(arg); env->DeleteLocalRef(arg);
} }
} }
// prepare a new return value // prepare a new return value
jclass variantClass = env->FindClass("com/jacob/com/Variant"); jclass variantClass = env->FindClass("com/jacob/com/Variant");
jmethodID variantCons = jmethodID variantCons =
env->GetMethodID(variantClass, "<init>", "()V"); env->GetMethodID(variantClass, "<init>", "()V");
// construct a variant to return // construct a variant to return
jobject newVariant = env->NewObject(variantClass, variantCons); jobject newVariant = env->NewObject(variantClass, variantCons);
// get the VARIANT from the newVariant // get the VARIANT from the newVariant
VARIANT *v = extractVariant(env, newVariant); VARIANT *v = extractVariant(env, newVariant);
DISPID dispidPropertyPut = DISPID_PROPERTYPUT; DISPID dispidPropertyPut = DISPID_PROPERTYPUT;
// determine how to dispatch // determine how to dispatch
switch (wFlags) switch (wFlags)
{ {
case DISPATCH_PROPERTYGET: // GET case DISPATCH_PROPERTYGET: // GET
case DISPATCH_METHOD: // METHOD case DISPATCH_METHOD: // METHOD
case DISPATCH_METHOD|DISPATCH_PROPERTYGET: case DISPATCH_METHOD|DISPATCH_PROPERTYGET:
{ {
SETDISPPARAMS(dispparams, num_args, varr, 0, NULL); SETDISPPARAMS(dispparams, num_args, varr, 0, NULL);
break; break;
} }
case DISPATCH_PROPERTYPUT: case DISPATCH_PROPERTYPUT:
case DISPATCH_PROPERTYPUTREF: // jacob-msg 1075 - SF 1053872 case DISPATCH_PROPERTYPUTREF: // jacob-msg 1075 - SF 1053872
{ {
SETDISPPARAMS(dispparams, num_args, varr, 1, &dispidPropertyPut); SETDISPPARAMS(dispparams, num_args, varr, 1, &dispidPropertyPut);
break; break;
} }
} }
HRESULT hr = 0; HRESULT hr = 0;
jint count = env->GetArrayLength(uArgErr); jint count = env->GetArrayLength(uArgErr);
if ( count != 0 ) if ( count != 0 )
{ {
jint *uAE = env->GetIntArrayElements(uArgErr, NULL); jint *uAE = env->GetIntArrayElements(uArgErr, NULL);
hr = pIDispatch->Invoke(dispID,IID_NULL, hr = pIDispatch->Invoke(dispID,IID_NULL,
lcid,wFlags,&dispparams,v,&excepInfo,(unsigned int *)uAE); lcid,wFlags,&dispparams,v,&excepInfo,(unsigned int *)uAE);
env->ReleaseIntArrayElements(uArgErr, uAE, 0); env->ReleaseIntArrayElements(uArgErr, uAE, 0);
} }
else else
{ {
hr = pIDispatch->Invoke(dispID,IID_NULL, hr = pIDispatch->Invoke(dispID,IID_NULL,
lcid,wFlags,&dispparams,v,&excepInfo, NULL); lcid,wFlags,&dispparams,v,&excepInfo, NULL);
} }
if (num_args) if (num_args)
{ {
// to account for inouts, I need to copy the inputs back to // to account for inouts, I need to copy the inputs back to
// the java array after the method returns // the java array after the method returns
// this occurs, for example, in the ADO wrappers // this occurs, for example, in the ADO wrappers
for(i=num_args-1,j=0;0<=i;i--,j++) for(i=num_args-1,j=0;0<=i;i--,j++)
{ {
jobject arg = env->GetObjectArrayElement(vArg, i); jobject arg = env->GetObjectArrayElement(vArg, i);
VARIANT *v = extractVariant(env, arg); VARIANT *v = extractVariant(env, arg);
// reverse copy // reverse copy
VariantCopy(v, &varr[j]); VariantCopy(v, &varr[j]);
// clear out the temporary variant // clear out the temporary variant
VariantClear(&varr[j]); VariantClear(&varr[j]);
env->DeleteLocalRef(arg); env->DeleteLocalRef(arg);
} }
} }
if (varr) CoTaskMemFree(varr); if (varr) CoTaskMemFree(varr);
// check for error and display a somewhat verbose error message // check for error and display a somewhat verbose error message
if (!SUCCEEDED(hr)) { if (!SUCCEEDED(hr)) {
const char *nm = env->GetStringUTFChars(name, NULL); const char *nm = env->GetStringUTFChars(name, NULL);
char *buf = CreateErrorMsgFromInfo(hr, &excepInfo, nm); char *buf = CreateErrorMsgFromInfo(hr, &excepInfo, nm);
env->ReleaseStringUTFChars(name, nm); env->ReleaseStringUTFChars(name, nm);
// jacob-msg 3696 - SF 1053866 // jacob-msg 3696 - SF 1053866
if(hr == DISP_E_EXCEPTION) if(hr == DISP_E_EXCEPTION)
{ {
if(excepInfo.scode != 0) if(excepInfo.scode != 0)
{ {
hr = excepInfo.scode; hr = excepInfo.scode;
} }
else else
{ {
hr = _com_error::WCodeToHRESULT(excepInfo.wCode); hr = _com_error::WCodeToHRESULT(excepInfo.wCode);
} }
} }
ThrowComFail(env, buf, hr); ThrowComFail(env, buf, hr);
if (buf) delete buf; if (buf) delete buf;
return NULL; return NULL;
} }
return newVariant; return newVariant;
} }
} }

View File

@@ -1,53 +1,53 @@
/* DO NOT EDIT THIS FILE - it is machine generated */ /* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h> #include <jni.h>
/* Header for class Dispatch */ /* Header for class Dispatch */
#ifndef _Included_Dispatch #ifndef _Included_Dispatch
#define _Included_Dispatch #define _Included_Dispatch
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
/* /*
* Class: com_jacob_com_Dispatch * Class: com_jacob_com_Dispatch
* Method: QueryInterface * Method: QueryInterface
* Signature: (Ljava/lang/String;)Lcom/jacob/com/Dispatch; * Signature: (Ljava/lang/String;)Lcom/jacob/com/Dispatch;
*/ */
JNIEXPORT jobject JNICALL Java_com_jacob_com_Dispatch_QueryInterface JNIEXPORT jobject JNICALL Java_com_jacob_com_Dispatch_QueryInterface
(JNIEnv *, jobject, jstring); (JNIEnv *, jobject, jstring);
/* /*
* Class: Dispatch * Class: Dispatch
* Method: createInstance * Method: createInstance
* Signature: (Ljava/lang/String;)V * Signature: (Ljava/lang/String;)V
*/ */
JNIEXPORT void JNICALL Java_com_jacob_com_Dispatch_createInstance JNIEXPORT void JNICALL Java_com_jacob_com_Dispatch_createInstance
(JNIEnv *, jobject, jstring); (JNIEnv *, jobject, jstring);
/* /*
* Class: Dispatch * Class: Dispatch
* Method: release * Method: release
* Signature: ()V * Signature: ()V
*/ */
JNIEXPORT void JNICALL Java_com_jacob_com_Dispatch_release JNIEXPORT void JNICALL Java_com_jacob_com_Dispatch_release
(JNIEnv *, jobject); (JNIEnv *, jobject);
/* /*
* Class: Dispatch * Class: Dispatch
* Method: getIDsOfNames * Method: getIDsOfNames
* Signature: (Ljava/lang/Object;I[Ljava/lang/String;)[I * Signature: (Ljava/lang/Object;I[Ljava/lang/String;)[I
*/ */
JNIEXPORT jintArray JNICALL Java_com_jacob_com_Dispatch_getIDsOfNames JNIEXPORT jintArray JNICALL Java_com_jacob_com_Dispatch_getIDsOfNames
(JNIEnv *, jclass, jobject, jint, jobjectArray); (JNIEnv *, jclass, jobject, jint, jobjectArray);
/* /*
* Class: Dispatch * Class: Dispatch
* Method: invokev * Method: invokev
* Signature: (Ljava/lang/Object;Ljava/lang/String;III[LVariant;[I)LVariant; * Signature: (Ljava/lang/Object;Ljava/lang/String;III[LVariant;[I)LVariant;
*/ */
JNIEXPORT jobject JNICALL Java_com_jacob_com_Dispatch_invokev JNIEXPORT jobject JNICALL Java_com_jacob_com_Dispatch_invokev
(JNIEnv *, jclass, jobject, jstring, jint, jint, jint, jobjectArray, jintArray); (JNIEnv *, jclass, jobject, jstring, jint, jint, jint, jobjectArray, jintArray);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif #endif

View File

@@ -1,311 +1,311 @@
/* /*
* Copyright (c) 1999-2004 Sourceforge JACOB Project. * Copyright (c) 1999-2004 Sourceforge JACOB Project.
* All rights reserved. Originator: Dan Adler (http://danadler.com). * All rights reserved. Originator: Dan Adler (http://danadler.com).
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
* are met: * are met:
* 1. Redistributions of source code must retain the above copyright * 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright * 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in * notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the * the documentation and/or other materials provided with the
* distribution. * distribution.
* 3. Redistributions in any form must be accompanied by information on * 3. Redistributions in any form must be accompanied by information on
* how to obtain complete source code for the JACOB software. * how to obtain complete source code for the JACOB software.
* *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE. * OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "DispatchEvents.h" #include "DispatchEvents.h"
#include "EventProxy.h" #include "EventProxy.h"
// Win32 support for Ole Automation // Win32 support for Ole Automation
#include <wchar.h> #include <wchar.h>
#include <string.h> #include <string.h>
#include <atlbase.h> #include <atlbase.h>
#include <objbase.h> #include <objbase.h>
#include <oleauto.h> #include <oleauto.h>
#include <olectl.h> #include <olectl.h>
#include "util.h" #include "util.h"
extern "C" extern "C"
{ {
#define PROXY_FLD "m_pConnPtProxy" #define PROXY_FLD "m_pConnPtProxy"
// defined below // defined below
BOOL GetEventIID(IUnknown*, IID*, CComBSTR **, DISPID **, int *,LPOLESTR); BOOL GetEventIID(IUnknown*, IID*, CComBSTR **, DISPID **, int *,LPOLESTR);
BOOL getClassInfoFromProgId(LPOLESTR bsProgId,LPTYPEINFO *pClassInfo); BOOL getClassInfoFromProgId(LPOLESTR bsProgId,LPTYPEINFO *pClassInfo);
// extract a EventProxy* from a jobject // extract a EventProxy* from a jobject
EventProxy *extractProxy(JNIEnv *env, jobject arg) EventProxy *extractProxy(JNIEnv *env, jobject arg)
{ {
jclass argClass = env->GetObjectClass(arg); jclass argClass = env->GetObjectClass(arg);
jfieldID ajf = env->GetFieldID( argClass, PROXY_FLD, "I"); jfieldID ajf = env->GetFieldID( argClass, PROXY_FLD, "I");
jint anum = env->GetIntField(arg, ajf); jint anum = env->GetIntField(arg, ajf);
EventProxy *v = (EventProxy *)anum; EventProxy *v = (EventProxy *)anum;
return v; return v;
} }
void putProxy(JNIEnv *env, jobject arg, EventProxy *ep) void putProxy(JNIEnv *env, jobject arg, EventProxy *ep)
{ {
jclass argClass = env->GetObjectClass(arg); jclass argClass = env->GetObjectClass(arg);
jfieldID ajf = env->GetFieldID( argClass, PROXY_FLD, "I"); jfieldID ajf = env->GetFieldID( argClass, PROXY_FLD, "I");
jint anum = env->GetIntField(arg, ajf); jint anum = env->GetIntField(arg, ajf);
env->SetIntField(arg, ajf, (jint)ep); env->SetIntField(arg, ajf, (jint)ep);
} }
/* /*
* Class: DispatchEvents * Class: DispatchEvents
* Method: init2 * Method: init2
* Signature: (LDispatch;Ljava/lang/Object;Ljava/lang/String;)V * Signature: (LDispatch;Ljava/lang/Object;Ljava/lang/String;)V
*/ */
JNIEXPORT void JNICALL Java_com_jacob_com_DispatchEvents_init2 JNIEXPORT void JNICALL Java_com_jacob_com_DispatchEvents_init2
(JNIEnv *env, jobject _this, jobject src, jobject sink, jstring _progid) (JNIEnv *env, jobject _this, jobject src, jobject sink, jstring _progid)
{ {
USES_CONVERSION; USES_CONVERSION;
// find progid if any // find progid if any
LPOLESTR bsProgId = NULL; LPOLESTR bsProgId = NULL;
if (_progid!=NULL) { if (_progid!=NULL) {
const char *progid = env->GetStringUTFChars(_progid, NULL); const char *progid = env->GetStringUTFChars(_progid, NULL);
bsProgId = A2W(progid); bsProgId = A2W(progid);
} }
// get the IDispatch for the source object // get the IDispatch for the source object
IDispatch *pDisp = extractDispatch(env, src); IDispatch *pDisp = extractDispatch(env, src);
CComQIPtr<IUnknown, &IID_IUnknown> pUnk(pDisp); CComQIPtr<IUnknown, &IID_IUnknown> pUnk(pDisp);
// see if it implements connection points // see if it implements connection points
CComQIPtr<IConnectionPointContainer, &IID_IConnectionPointContainer> pCPC(pUnk); CComQIPtr<IConnectionPointContainer, &IID_IConnectionPointContainer> pCPC(pUnk);
if (!pCPC) if (!pCPC)
{ {
// no events, throw something // no events, throw something
ThrowComFail(env, "Can't find IConnectionPointContainer", -1); ThrowComFail(env, "Can't find IConnectionPointContainer", -1);
return; return;
} }
// hook up to the default source iid // hook up to the default source iid
CComPtr<IConnectionPoint> pCP; CComPtr<IConnectionPoint> pCP;
IID eventIID; IID eventIID;
CComBSTR *mNames; CComBSTR *mNames;
DISPID *mIDs; DISPID *mIDs;
int n_EventMethods; int n_EventMethods;
if (!GetEventIID(pUnk, &eventIID, &mNames, &mIDs, &n_EventMethods,bsProgId)) { if (!GetEventIID(pUnk, &eventIID, &mNames, &mIDs, &n_EventMethods,bsProgId)) {
ThrowComFail(env, "Can't find event iid", -1); ThrowComFail(env, "Can't find event iid", -1);
return; return;
} }
HRESULT hr = pCPC->FindConnectionPoint(eventIID, &pCP); HRESULT hr = pCPC->FindConnectionPoint(eventIID, &pCP);
DWORD dwEventCookie; DWORD dwEventCookie;
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
EventProxy *ep = new EventProxy(env, sink, pCP, eventIID, mNames, mIDs, n_EventMethods); EventProxy *ep = new EventProxy(env, sink, pCP, eventIID, mNames, mIDs, n_EventMethods);
// need to store ep on _this, in case it gets collected // need to store ep on _this, in case it gets collected
putProxy(env, _this, ep); putProxy(env, _this, ep);
} else { } else {
ThrowComFail(env, "Can't FindConnectionPoint", hr); ThrowComFail(env, "Can't FindConnectionPoint", hr);
} }
} }
/* /*
* Class: DispatchEvents * Class: DispatchEvents
* Method: init * Method: init
* Signature: (LDispatch;Ljava/lang/Object;)V * Signature: (LDispatch;Ljava/lang/Object;)V
*/ */
JNIEXPORT void JNICALL Java_com_jacob_com_DispatchEvents_init JNIEXPORT void JNICALL Java_com_jacob_com_DispatchEvents_init
(JNIEnv *env, jobject _this, jobject src, jobject sink) (JNIEnv *env, jobject _this, jobject src, jobject sink)
{ {
Java_com_jacob_com_DispatchEvents_init2(env,_this,src,sink,NULL); Java_com_jacob_com_DispatchEvents_init2(env,_this,src,sink,NULL);
} }
/* /*
* Class: DispatchEvents * Class: DispatchEvents
* Method: release * Method: release
* Signature: ()V * Signature: ()V
*/ */
JNIEXPORT void JNICALL Java_com_jacob_com_DispatchEvents_release JNIEXPORT void JNICALL Java_com_jacob_com_DispatchEvents_release
(JNIEnv *env, jobject _this) (JNIEnv *env, jobject _this)
{ {
EventProxy *ep = extractProxy(env, _this); EventProxy *ep = extractProxy(env, _this);
if (ep) { if (ep) {
ep->Release(); ep->Release();
putProxy(env, _this, NULL); putProxy(env, _this, NULL);
} }
} }
/* /*
* I need a reverse map from the event interface's dispids to * I need a reverse map from the event interface's dispids to
* function names so that we can reflect them to java * function names so that we can reflect them to java
*/ */
void void
LoadNameCache(LPTYPEINFO pTypeInfo, LPTYPEATTR pta, LoadNameCache(LPTYPEINFO pTypeInfo, LPTYPEATTR pta,
CComBSTR **mNames, DISPID **mIDs, int *nmeth) CComBSTR **mNames, DISPID **mIDs, int *nmeth)
{ {
CComBSTR *names = NULL; CComBSTR *names = NULL;
DISPID *ids = NULL; DISPID *ids = NULL;
int m_nCount; int m_nCount;
m_nCount = pta->cFuncs; m_nCount = pta->cFuncs;
*nmeth = m_nCount; *nmeth = m_nCount;
names = m_nCount == 0 ? NULL : new CComBSTR[m_nCount]; names = m_nCount == 0 ? NULL : new CComBSTR[m_nCount];
ids = m_nCount == 0 ? NULL : new DISPID[m_nCount]; ids = m_nCount == 0 ? NULL : new DISPID[m_nCount];
for (int i=0; i<m_nCount; i++) for (int i=0; i<m_nCount; i++)
{ {
FUNCDESC* pfd; FUNCDESC* pfd;
if (SUCCEEDED(pTypeInfo->GetFuncDesc(i, &pfd))) if (SUCCEEDED(pTypeInfo->GetFuncDesc(i, &pfd)))
{ {
CComBSTR bstrName; CComBSTR bstrName;
if (SUCCEEDED(pTypeInfo->GetDocumentation(pfd->memid, &bstrName, NULL, NULL, NULL))) if (SUCCEEDED(pTypeInfo->GetDocumentation(pfd->memid, &bstrName, NULL, NULL, NULL)))
{ {
names[i].Attach(bstrName.Detach()); names[i].Attach(bstrName.Detach());
ids[i] = pfd->memid; ids[i] = pfd->memid;
/* /*
USES_CONVERSION; USES_CONVERSION;
printf("map:%d -> %s\n", ids[i], W2A((OLECHAR *)names[i])); printf("map:%d -> %s\n", ids[i], W2A((OLECHAR *)names[i]));
*/ */
} }
pTypeInfo->ReleaseFuncDesc(pfd); pTypeInfo->ReleaseFuncDesc(pfd);
} }
} }
*mNames = names; *mNames = names;
*mIDs = ids; *mIDs = ids;
} }
#define IMPLTYPE_MASK \ #define IMPLTYPE_MASK \
(IMPLTYPEFLAG_FDEFAULT | IMPLTYPEFLAG_FSOURCE | IMPLTYPEFLAG_FRESTRICTED) (IMPLTYPEFLAG_FDEFAULT | IMPLTYPEFLAG_FSOURCE | IMPLTYPEFLAG_FRESTRICTED)
#define IMPLTYPE_DEFAULTSOURCE \ #define IMPLTYPE_DEFAULTSOURCE \
(IMPLTYPEFLAG_FDEFAULT | IMPLTYPEFLAG_FSOURCE) (IMPLTYPEFLAG_FDEFAULT | IMPLTYPEFLAG_FSOURCE)
BOOL GetEventIID(IUnknown *m_pObject, IID* piid, BOOL GetEventIID(IUnknown *m_pObject, IID* piid,
CComBSTR **mNames, DISPID **mIDs, int *nmeth,LPOLESTR bsProgId) CComBSTR **mNames, DISPID **mIDs, int *nmeth,LPOLESTR bsProgId)
{ {
*piid = GUID_NULL; *piid = GUID_NULL;
ATLASSERT(m_pObject != NULL); ATLASSERT(m_pObject != NULL);
// I Always use IProvideClassInfo rather than IProvideClassInfo2 // I Always use IProvideClassInfo rather than IProvideClassInfo2
// since I also need to create a mapping from dispid to name // since I also need to create a mapping from dispid to name
LPPROVIDECLASSINFO pPCI = NULL; LPPROVIDECLASSINFO pPCI = NULL;
LPTYPEINFO pClassInfo = NULL; LPTYPEINFO pClassInfo = NULL;
if (SUCCEEDED(m_pObject->QueryInterface(IID_IProvideClassInfo, (LPVOID*)&pPCI))) if (SUCCEEDED(m_pObject->QueryInterface(IID_IProvideClassInfo, (LPVOID*)&pPCI)))
{ {
//printf("got IProvideClassInfo\n"); //printf("got IProvideClassInfo\n");
ATLASSERT(pPCI != NULL); ATLASSERT(pPCI != NULL);
HRESULT hr = pPCI->GetClassInfo(&pClassInfo); HRESULT hr = pPCI->GetClassInfo(&pClassInfo);
pPCI->Release(); pPCI->Release();
if (!SUCCEEDED(hr)) return false; if (!SUCCEEDED(hr)) return false;
} }
else if (getClassInfoFromProgId(bsProgId,&pClassInfo)) { else if (getClassInfoFromProgId(bsProgId,&pClassInfo)) {
} }
else { else {
printf("couldn't get IProvideClassInfo\n"); printf("couldn't get IProvideClassInfo\n");
return false; return false;
} }
//printf("got ClassInfo\n"); //printf("got ClassInfo\n");
ATLASSERT(pClassInfo != NULL); ATLASSERT(pClassInfo != NULL);
LPTYPEATTR pClassAttr; LPTYPEATTR pClassAttr;
if (SUCCEEDED(pClassInfo->GetTypeAttr(&pClassAttr))) if (SUCCEEDED(pClassInfo->GetTypeAttr(&pClassAttr)))
{ {
//printf("got TypeAttr\n"); //printf("got TypeAttr\n");
ATLASSERT(pClassAttr != NULL); ATLASSERT(pClassAttr != NULL);
ATLASSERT(pClassAttr->typekind == TKIND_COCLASS); ATLASSERT(pClassAttr->typekind == TKIND_COCLASS);
// Search for typeinfo of the default events interface. // Search for typeinfo of the default events interface.
int nFlags; int nFlags;
HREFTYPE hRefType; HREFTYPE hRefType;
for (unsigned int i = 0; i < pClassAttr->cImplTypes; i++) for (unsigned int i = 0; i < pClassAttr->cImplTypes; i++)
{ {
if (SUCCEEDED(pClassInfo->GetImplTypeFlags(i, &nFlags)) && if (SUCCEEDED(pClassInfo->GetImplTypeFlags(i, &nFlags)) &&
((nFlags & IMPLTYPE_MASK) == IMPLTYPE_DEFAULTSOURCE)) ((nFlags & IMPLTYPE_MASK) == IMPLTYPE_DEFAULTSOURCE))
{ {
// Found it. Now look at its attributes to get IID. // Found it. Now look at its attributes to get IID.
LPTYPEINFO pEventInfo = NULL; LPTYPEINFO pEventInfo = NULL;
if (SUCCEEDED(pClassInfo->GetRefTypeOfImplType(i, if (SUCCEEDED(pClassInfo->GetRefTypeOfImplType(i,
&hRefType)) && &hRefType)) &&
SUCCEEDED(pClassInfo->GetRefTypeInfo(hRefType, SUCCEEDED(pClassInfo->GetRefTypeInfo(hRefType,
&pEventInfo))) &pEventInfo)))
{ {
ATLASSERT(pEventInfo != NULL); ATLASSERT(pEventInfo != NULL);
LPTYPEATTR pEventAttr; LPTYPEATTR pEventAttr;
if (SUCCEEDED(pEventInfo->GetTypeAttr(&pEventAttr))) if (SUCCEEDED(pEventInfo->GetTypeAttr(&pEventAttr)))
{ {
ATLASSERT(pEventAttr != NULL); ATLASSERT(pEventAttr != NULL);
// create a mapping from dispid to string // create a mapping from dispid to string
LoadNameCache(pEventInfo, pEventAttr, LoadNameCache(pEventInfo, pEventAttr,
mNames, mIDs, nmeth); mNames, mIDs, nmeth);
*piid = pEventAttr->guid; *piid = pEventAttr->guid;
pEventInfo->ReleaseTypeAttr(pEventAttr); pEventInfo->ReleaseTypeAttr(pEventAttr);
} }
pEventInfo->Release(); pEventInfo->Release();
} }
break; break;
} }
} }
pClassInfo->ReleaseTypeAttr(pClassAttr); pClassInfo->ReleaseTypeAttr(pClassAttr);
} }
pClassInfo->Release(); pClassInfo->Release();
return (!IsEqualIID(*piid, GUID_NULL)); return (!IsEqualIID(*piid, GUID_NULL));
} }
BOOL getClassInfoFromProgId(LPOLESTR bsProgId,LPTYPEINFO *pClassInfo) BOOL getClassInfoFromProgId(LPOLESTR bsProgId,LPTYPEINFO *pClassInfo)
{ {
USES_CONVERSION; USES_CONVERSION;
CLSID clsid; CLSID clsid;
GUID libid; GUID libid;
if (FAILED(CLSIDFromProgID(bsProgId, &clsid))) return false; if (FAILED(CLSIDFromProgID(bsProgId, &clsid))) return false;
if (FAILED(StringFromCLSID(clsid,&bsProgId))) return false; if (FAILED(StringFromCLSID(clsid,&bsProgId))) return false;
HKEY keySoftware, keyClasses, keyCLSID, keyXXXX, keyTypeLib; HKEY keySoftware, keyClasses, keyCLSID, keyXXXX, keyTypeLib;
DWORD dwType, dwCountData=50; DWORD dwType, dwCountData=50;
BYTE abData[50]; BYTE abData[50];
LONG lVal; LONG lVal;
lVal = RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SOFTWARE"),0,KEY_READ,&keySoftware); lVal = RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SOFTWARE"),0,KEY_READ,&keySoftware);
if (lVal==ERROR_SUCCESS) { if (lVal==ERROR_SUCCESS) {
lVal = RegOpenKeyEx(keySoftware,_T("Classes"),0,KEY_READ,&keyClasses); lVal = RegOpenKeyEx(keySoftware,_T("Classes"),0,KEY_READ,&keyClasses);
if (lVal==ERROR_SUCCESS) { if (lVal==ERROR_SUCCESS) {
lVal = RegOpenKeyEx(keyClasses,_T("CLSID"),0,KEY_READ,&keyCLSID); lVal = RegOpenKeyEx(keyClasses,_T("CLSID"),0,KEY_READ,&keyCLSID);
if (lVal==ERROR_SUCCESS) { if (lVal==ERROR_SUCCESS) {
_TCHAR *tsProgId = W2T(bsProgId); _TCHAR *tsProgId = W2T(bsProgId);
lVal = RegOpenKeyEx(keyCLSID,tsProgId,0,KEY_READ,&keyXXXX); lVal = RegOpenKeyEx(keyCLSID,tsProgId,0,KEY_READ,&keyXXXX);
if (lVal==ERROR_SUCCESS) { if (lVal==ERROR_SUCCESS) {
lVal = RegOpenKeyEx(keyXXXX,_T("TypeLib"),0,KEY_READ,&keyTypeLib); lVal = RegOpenKeyEx(keyXXXX,_T("TypeLib"),0,KEY_READ,&keyTypeLib);
if (lVal==ERROR_SUCCESS) { if (lVal==ERROR_SUCCESS) {
lVal = RegQueryValueEx(keyTypeLib,NULL,NULL,&dwType,abData,&dwCountData); lVal = RegQueryValueEx(keyTypeLib,NULL,NULL,&dwType,abData,&dwCountData);
RegCloseKey(keyTypeLib); RegCloseKey(keyTypeLib);
} }
RegCloseKey(keyXXXX); RegCloseKey(keyXXXX);
} }
RegCloseKey(keyCLSID); RegCloseKey(keyCLSID);
} }
RegCloseKey(keyClasses); RegCloseKey(keyClasses);
} }
RegCloseKey(keySoftware); RegCloseKey(keySoftware);
} }
if (lVal!=ERROR_SUCCESS) return false; if (lVal!=ERROR_SUCCESS) return false;
BSTR bsLibId = A2BSTR((char*)abData); BSTR bsLibId = A2BSTR((char*)abData);
if (FAILED(CLSIDFromString(bsLibId,&libid))) return false; if (FAILED(CLSIDFromString(bsLibId,&libid))) return false;
//Try loading from registry information. //Try loading from registry information.
ITypeLib* pITypeLib; ITypeLib* pITypeLib;
if (FAILED(LoadRegTypeLib(libid,1,0, LANG_NEUTRAL, &pITypeLib))) return false; if (FAILED(LoadRegTypeLib(libid,1,0, LANG_NEUTRAL, &pITypeLib))) return false;
//Find ITypeInfo for coclass. //Find ITypeInfo for coclass.
pITypeLib->GetTypeInfoOfGuid(clsid, pClassInfo); pITypeLib->GetTypeInfoOfGuid(clsid, pClassInfo);
pITypeLib->Release(); pITypeLib->Release();
return true; return true;
} }
} }

View File

@@ -1,39 +1,39 @@
/* DO NOT EDIT THIS FILE - it is machine generated */ /* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h> #include <jni.h>
/* Header for class DispatchEvents */ /* Header for class DispatchEvents */
#ifndef _Included_DispatchEvents #ifndef _Included_DispatchEvents
#define _Included_DispatchEvents #define _Included_DispatchEvents
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
/* /*
* Class: DispatchEvents * Class: DispatchEvents
* Method: init * Method: init
* Signature: (LDispatch;Ljava/lang/Object;)V * Signature: (LDispatch;Ljava/lang/Object;)V
*/ */
JNIEXPORT void JNICALL Java_com_jacob_com_DispatchEvents_init JNIEXPORT void JNICALL Java_com_jacob_com_DispatchEvents_init
(JNIEnv *, jobject, jobject, jobject); (JNIEnv *, jobject, jobject, jobject);
/* /*
* Class: DispatchEvents * Class: DispatchEvents
* Method: init2 * Method: init2
* Signature: (LDispatch;Ljava/lang/Object;Ljava/lang/String;)V * Signature: (LDispatch;Ljava/lang/Object;Ljava/lang/String;)V
*/ */
JNIEXPORT void JNICALL Java_com_jacob_com_DispatchEvents_init2 JNIEXPORT void JNICALL Java_com_jacob_com_DispatchEvents_init2
(JNIEnv *, jobject, jobject, jobject, jstring); (JNIEnv *, jobject, jobject, jobject, jstring);
/* /*
* Class: DispatchEvents * Class: DispatchEvents
* Method: release * Method: release
* Signature: ()V * Signature: ()V
*/ */
JNIEXPORT void JNICALL Java_com_jacob_com_DispatchEvents_release JNIEXPORT void JNICALL Java_com_jacob_com_DispatchEvents_release
(JNIEnv *, jobject); (JNIEnv *, jobject);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif #endif

View File

@@ -1,116 +1,116 @@
/* /*
* Copyright (c) 1999-2004 Sourceforge JACOB Project. * Copyright (c) 1999-2004 Sourceforge JACOB Project.
* All rights reserved. Originator: Dan Adler (http://danadler.com). * All rights reserved. Originator: Dan Adler (http://danadler.com).
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
* are met: * are met:
* 1. Redistributions of source code must retain the above copyright * 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright * 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in * notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the * the documentation and/or other materials provided with the
* distribution. * distribution.
* 3. Redistributions in any form must be accompanied by information on * 3. Redistributions in any form must be accompanied by information on
* how to obtain complete source code for the JACOB software. * how to obtain complete source code for the JACOB software.
* *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE. * OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "stdafx.h" #include "stdafx.h"
#include <objbase.h> #include <objbase.h>
#include "ComThread.h" #include "ComThread.h"
// Win32 support for Ole Automation // Win32 support for Ole Automation
#include <wchar.h> #include <wchar.h>
#include <string.h> #include <string.h>
#include <atlbase.h> #include <atlbase.h>
#include <oleauto.h> #include <oleauto.h>
#include <olectl.h> #include <olectl.h>
#include "util.h" #include "util.h"
extern "C" extern "C"
{ {
// extract a IStream from a jobject // extract a IStream from a jobject
IStream *extractStream(JNIEnv *env, jobject arg) IStream *extractStream(JNIEnv *env, jobject arg)
{ {
jclass argClass = env->GetObjectClass(arg); jclass argClass = env->GetObjectClass(arg);
jfieldID ajf = env->GetFieldID( argClass, "m_pStream", "I"); jfieldID ajf = env->GetFieldID( argClass, "m_pStream", "I");
jint anum = env->GetIntField(arg, ajf); jint anum = env->GetIntField(arg, ajf);
IStream *v = (IStream *)anum; IStream *v = (IStream *)anum;
return v; return v;
} }
JNIEXPORT void JNICALL Java_com_jacob_com_DispatchProxy_MarshalIntoStream JNIEXPORT void JNICALL Java_com_jacob_com_DispatchProxy_MarshalIntoStream
(JNIEnv *env, jobject _this, jobject disp) (JNIEnv *env, jobject _this, jobject disp)
{ {
IDispatch *pIDispatch = extractDispatch(env, disp); IDispatch *pIDispatch = extractDispatch(env, disp);
if (!pIDispatch) return; if (!pIDispatch) return;
IStream *ps; // this is the stream we will marshall into IStream *ps; // this is the stream we will marshall into
HRESULT hr = CoMarshalInterThreadInterfaceInStream( HRESULT hr = CoMarshalInterThreadInterfaceInStream(
IID_IDispatch, pIDispatch, &ps); IID_IDispatch, pIDispatch, &ps);
if (!SUCCEEDED(hr)) if (!SUCCEEDED(hr))
{ {
ThrowComFail(env, "Could not Marshal Dispatch into IStream", hr); ThrowComFail(env, "Could not Marshal Dispatch into IStream", hr);
return; return;
} }
// store the stream pointer on the object // store the stream pointer on the object
jclass argClass = env->GetObjectClass(_this); jclass argClass = env->GetObjectClass(_this);
jfieldID ajf = env->GetFieldID( argClass, "m_pStream", "I"); jfieldID ajf = env->GetFieldID( argClass, "m_pStream", "I");
env->SetIntField(_this, ajf, (jint)ps); env->SetIntField(_this, ajf, (jint)ps);
} }
JNIEXPORT jobject JNICALL Java_com_jacob_com_DispatchProxy_MarshalFromStream JNIEXPORT jobject JNICALL Java_com_jacob_com_DispatchProxy_MarshalFromStream
(JNIEnv *env, jobject _this) (JNIEnv *env, jobject _this)
{ {
IStream *ps = extractStream(env, _this); IStream *ps = extractStream(env, _this);
if (!ps) if (!ps)
{ {
ThrowComFail(env, "Could not get IStream from DispatchProxy", -1); ThrowComFail(env, "Could not get IStream from DispatchProxy", -1);
return NULL; return NULL;
} }
IDispatch *pD; IDispatch *pD;
HRESULT hr = CoGetInterfaceAndReleaseStream(ps, IID_IDispatch, (void **)&pD); HRESULT hr = CoGetInterfaceAndReleaseStream(ps, IID_IDispatch, (void **)&pD);
// zero out the stream pointer on the object // zero out the stream pointer on the object
// since the stream can only be read once // since the stream can only be read once
jclass argClass = env->GetObjectClass(_this); jclass argClass = env->GetObjectClass(_this);
jfieldID ajf = env->GetFieldID( argClass, "m_pStream", "I"); jfieldID ajf = env->GetFieldID( argClass, "m_pStream", "I");
env->SetIntField(_this, ajf, (unsigned int)0); env->SetIntField(_this, ajf, (unsigned int)0);
if (!SUCCEEDED(hr)) if (!SUCCEEDED(hr))
{ {
ThrowComFail(env, "Could not Marshal Dispatch from IStream", hr); ThrowComFail(env, "Could not Marshal Dispatch from IStream", hr);
return NULL; return NULL;
} }
jclass autoClass = env->FindClass("com/jacob/com/Dispatch"); jclass autoClass = env->FindClass("com/jacob/com/Dispatch");
jmethodID autoCons = env->GetMethodID(autoClass, "<init>", "(I)V"); jmethodID autoCons = env->GetMethodID(autoClass, "<init>", "(I)V");
// construct a Dispatch object to return // construct a Dispatch object to return
// I am copying the pointer to java // I am copying the pointer to java
if (pD) pD->AddRef(); if (pD) pD->AddRef();
jobject newAuto = env->NewObject(autoClass, autoCons, pD); jobject newAuto = env->NewObject(autoClass, autoCons, pD);
return newAuto; return newAuto;
} }
JNIEXPORT void JNICALL Java_com_jacob_com_DispatchProxy_release JNIEXPORT void JNICALL Java_com_jacob_com_DispatchProxy_release
(JNIEnv *env, jobject _this) (JNIEnv *env, jobject _this)
{ {
IStream *ps = extractStream(env, _this); IStream *ps = extractStream(env, _this);
if (ps) { if (ps) {
ps->Release(); ps->Release();
jclass argClass = env->GetObjectClass(_this); jclass argClass = env->GetObjectClass(_this);
jfieldID ajf = env->GetFieldID( argClass, "m_pStream", "I"); jfieldID ajf = env->GetFieldID( argClass, "m_pStream", "I");
env->SetIntField(_this, ajf, (unsigned int)0); env->SetIntField(_this, ajf, (unsigned int)0);
} }
} }
} }

View File

@@ -1,37 +1,37 @@
/* DO NOT EDIT THIS FILE - it is machine generated */ /* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h> #include <jni.h>
/* Header for class com_jacob_com_DispatchProxy */ /* Header for class com_jacob_com_DispatchProxy */
#ifndef _Included_com_jacob_com_DispatchProxy #ifndef _Included_com_jacob_com_DispatchProxy
#define _Included_com_jacob_com_DispatchProxy #define _Included_com_jacob_com_DispatchProxy
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
/* /*
* Class: com_jacob_com_DispatchProxy * Class: com_jacob_com_DispatchProxy
* Method: MarshalIntoStream * Method: MarshalIntoStream
* Signature: (Lcom/jacob/com/Dispatch;)V * Signature: (Lcom/jacob/com/Dispatch;)V
*/ */
JNIEXPORT void JNICALL Java_com_jacob_com_DispatchProxy_MarshalIntoStream JNIEXPORT void JNICALL Java_com_jacob_com_DispatchProxy_MarshalIntoStream
(JNIEnv *, jobject, jobject); (JNIEnv *, jobject, jobject);
/* /*
* Class: com_jacob_com_DispatchProxy * Class: com_jacob_com_DispatchProxy
* Method: MarshalFromStream * Method: MarshalFromStream
* Signature: ()Lcom/jacob/com/Dispatch; * Signature: ()Lcom/jacob/com/Dispatch;
*/ */
JNIEXPORT jobject JNICALL Java_com_jacob_com_DispatchProxy_MarshalFromStream JNIEXPORT jobject JNICALL Java_com_jacob_com_DispatchProxy_MarshalFromStream
(JNIEnv *, jobject); (JNIEnv *, jobject);
/* /*
* Class: com_jacob_com_DispatchProxy * Class: com_jacob_com_DispatchProxy
* Method: release * Method: release
* Signature: ()V * Signature: ()V
*/ */
JNIEXPORT void JNICALL Java_com_jacob_com_DispatchProxy_release JNIEXPORT void JNICALL Java_com_jacob_com_DispatchProxy_release
(JNIEnv *, jobject); (JNIEnv *, jobject);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif #endif

View File

@@ -1,137 +1,137 @@
/* /*
* Copyright (c) 1999-2004 Sourceforge JACOB Project. * Copyright (c) 1999-2004 Sourceforge JACOB Project.
* All rights reserved. Originator: Dan Adler (http://danadler.com). * All rights reserved. Originator: Dan Adler (http://danadler.com).
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
* are met: * are met:
* 1. Redistributions of source code must retain the above copyright * 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright * 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in * notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the * the documentation and/or other materials provided with the
* distribution. * distribution.
* 3. Redistributions in any form must be accompanied by information on * 3. Redistributions in any form must be accompanied by information on
* how to obtain complete source code for the JACOB software. * how to obtain complete source code for the JACOB software.
* *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE. * OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "stdafx.h" #include "stdafx.h"
#include <objbase.h> #include <objbase.h>
#include "Dispatch.h" #include "Dispatch.h"
// Win32 support for Ole Automation // Win32 support for Ole Automation
#include <wchar.h> #include <wchar.h>
#include <string.h> #include <string.h>
#include <atlbase.h> #include <atlbase.h>
#include <oleauto.h> #include <oleauto.h>
#include <olectl.h> #include <olectl.h>
#include "util.h" #include "util.h"
/** /**
* An implementation of IEnumVariant based on code submitted by * An implementation of IEnumVariant based on code submitted by
* Thomas Hallgren (mailto:Thomas.Hallgren@eoncompany.com) * Thomas Hallgren (mailto:Thomas.Hallgren@eoncompany.com)
*/ */
extern "C" extern "C"
{ {
// extract a IDispatch from a jobject // extract a IDispatch from a jobject
IEnumVARIANT* extractEnumVariant(JNIEnv* env, jobject arg) IEnumVARIANT* extractEnumVariant(JNIEnv* env, jobject arg)
{ {
jfieldID FID_pIEnumVARIANT = 0; jfieldID FID_pIEnumVARIANT = 0;
jclass clazz = env->GetObjectClass(arg); jclass clazz = env->GetObjectClass(arg);
FID_pIEnumVARIANT = env->GetFieldID(clazz, "m_pIEnumVARIANT", "I"); FID_pIEnumVARIANT = env->GetFieldID(clazz, "m_pIEnumVARIANT", "I");
return (IEnumVARIANT*)env->GetIntField(arg, FID_pIEnumVARIANT); return (IEnumVARIANT*)env->GetIntField(arg, FID_pIEnumVARIANT);
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_jacob_com_EnumVariant_Next(JNIEnv* env, jobject _this, jobjectArray vars) Java_com_jacob_com_EnumVariant_Next(JNIEnv* env, jobject _this, jobjectArray vars)
{ {
IEnumVARIANT* self = extractEnumVariant(env, _this); IEnumVARIANT* self = extractEnumVariant(env, _this);
printf("self=%x\n", self); printf("self=%x\n", self);
if(self == NULL) if(self == NULL)
return 0; return 0;
ULONG count = (ULONG)env->GetArrayLength(vars); ULONG count = (ULONG)env->GetArrayLength(vars);
if(count == 0) if(count == 0)
return 0; return 0;
VARIANT* sink = (VARIANT*)CoTaskMemAlloc(count * sizeof(VARIANT)); VARIANT* sink = (VARIANT*)CoTaskMemAlloc(count * sizeof(VARIANT));
ULONG fetchCount = 0; ULONG fetchCount = 0;
HRESULT hr = self->Next(count, sink, &fetchCount); HRESULT hr = self->Next(count, sink, &fetchCount);
if(FAILED(hr)) if(FAILED(hr))
{ {
CoTaskMemFree(sink); CoTaskMemFree(sink);
ThrowComFail(env, "IEnumVARIANT::Next", hr); ThrowComFail(env, "IEnumVARIANT::Next", hr);
return 0; return 0;
} }
// prepare a new return value array // prepare a new return value array
// //
jclass clazz = env->FindClass("com/jacob/com/Variant"); jclass clazz = env->FindClass("com/jacob/com/Variant");
jmethodID ctor = env->GetMethodID(clazz, "<init>", "()V"); jmethodID ctor = env->GetMethodID(clazz, "<init>", "()V");
for(ULONG idx = 0; idx < fetchCount; ++idx) for(ULONG idx = 0; idx < fetchCount; ++idx)
{ {
// construct a variant to return // construct a variant to return
// //
jobject newVariant = env->NewObject(clazz, ctor); jobject newVariant = env->NewObject(clazz, ctor);
VARIANT* v = extractVariant(env, newVariant); VARIANT* v = extractVariant(env, newVariant);
VariantCopy(v, sink + idx); VariantCopy(v, sink + idx);
env->SetObjectArrayElement(vars, idx, newVariant); env->SetObjectArrayElement(vars, idx, newVariant);
env->DeleteLocalRef(newVariant); env->DeleteLocalRef(newVariant);
} }
CoTaskMemFree(sink); CoTaskMemFree(sink);
return (jint)fetchCount; return (jint)fetchCount;
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL
Java_com_jacob_com_EnumVariant_release(JNIEnv* env, jobject _this) Java_com_jacob_com_EnumVariant_release(JNIEnv* env, jobject _this)
{ {
IEnumVARIANT* self = extractEnumVariant(env, _this); IEnumVARIANT* self = extractEnumVariant(env, _this);
if(self != NULL) if(self != NULL)
{ {
self->Release(); self->Release();
jfieldID FID_pIEnumVARIANT = 0; jfieldID FID_pIEnumVARIANT = 0;
jclass clazz = env->GetObjectClass(_this); jclass clazz = env->GetObjectClass(_this);
FID_pIEnumVARIANT = env->GetFieldID(clazz, "m_pIEnumVARIANT", "I"); FID_pIEnumVARIANT = env->GetFieldID(clazz, "m_pIEnumVARIANT", "I");
env->SetIntField(_this, FID_pIEnumVARIANT, (unsigned int)0); env->SetIntField(_this, FID_pIEnumVARIANT, (unsigned int)0);
} }
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL
Java_com_jacob_com_EnumVariant_Reset(JNIEnv* env, jobject _this) Java_com_jacob_com_EnumVariant_Reset(JNIEnv* env, jobject _this)
{ {
IEnumVARIANT* self = extractEnumVariant(env, _this); IEnumVARIANT* self = extractEnumVariant(env, _this);
if(self == NULL) if(self == NULL)
return; return;
HRESULT hr = self->Reset(); HRESULT hr = self->Reset();
if(FAILED(hr)) if(FAILED(hr))
ThrowComFail(env, "IEnumVARIANT::Reset", hr); ThrowComFail(env, "IEnumVARIANT::Reset", hr);
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL
Java_com_jacob_com_EnumVariant_Skip(JNIEnv* env, jobject _this, jint count) Java_com_jacob_com_EnumVariant_Skip(JNIEnv* env, jobject _this, jint count)
{ {
IEnumVARIANT* self = extractEnumVariant(env, _this); IEnumVARIANT* self = extractEnumVariant(env, _this);
if(self == NULL) if(self == NULL)
return; return;
HRESULT hr = self->Skip((ULONG)count); HRESULT hr = self->Skip((ULONG)count);
if(FAILED(hr)) if(FAILED(hr))
ThrowComFail(env, "IEnumVARIANT::Skip", hr); ThrowComFail(env, "IEnumVARIANT::Skip", hr);
} }
} }

View File

@@ -1,46 +1,46 @@
/* Header for class EnumVariant /* Header for class EnumVariant
*/ */
#ifndef _Included_EnumVariant #ifndef _Included_EnumVariant
#define _Included_EnumVariant #define _Included_EnumVariant
#include <jni.h> #include <jni.h>
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
/* /*
* Class: com_jacob_com_EnumVariant * Class: com_jacob_com_EnumVariant
* Method: Next * Method: Next
* Signature: ([Lcom/jacob/com/Variant;)I * Signature: ([Lcom/jacob/com/Variant;)I
*/ */
JNIEXPORT jint JNICALL Java_com_jacob_com_EnumVariant_Next JNIEXPORT jint JNICALL Java_com_jacob_com_EnumVariant_Next
(JNIEnv *, jobject, jobjectArray); (JNIEnv *, jobject, jobjectArray);
/* /*
* Class: com_jacob_com_EnumVariant * Class: com_jacob_com_EnumVariant
* Method: Release * Method: Release
* Signature: ()V * Signature: ()V
*/ */
JNIEXPORT void JNICALL Java_com_jacob_com_EnumVariant_release JNIEXPORT void JNICALL Java_com_jacob_com_EnumVariant_release
(JNIEnv *, jobject); (JNIEnv *, jobject);
/* /*
* Class: com_jacob_com_EnumVariant * Class: com_jacob_com_EnumVariant
* Method: Reset * Method: Reset
* Signature: ()V * Signature: ()V
*/ */
JNIEXPORT void JNICALL Java_com_jacob_com_EnumVariant_Reset JNIEXPORT void JNICALL Java_com_jacob_com_EnumVariant_Reset
(JNIEnv *, jobject); (JNIEnv *, jobject);
/* /*
* Class: com_jacob_com_EnumVariant * Class: com_jacob_com_EnumVariant
* Method: Skip * Method: Skip
* Signature: (I)V * Signature: (I)V
*/ */
JNIEXPORT void JNICALL Java_com_jacob_com_EnumVariant_Skip JNIEXPORT void JNICALL Java_com_jacob_com_EnumVariant_Skip
(JNIEnv *, jobject, jint); (JNIEnv *, jobject, jint);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif #endif

View File

@@ -1,163 +1,163 @@
/* /*
* Copyright (c) 1999-2004 Sourceforge JACOB Project. * Copyright (c) 1999-2004 Sourceforge JACOB Project.
* All rights reserved. Originator: Dan Adler (http://danadler.com). * All rights reserved. Originator: Dan Adler (http://danadler.com).
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
* are met: * are met:
* 1. Redistributions of source code must retain the above copyright * 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright * 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in * notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the * the documentation and/or other materials provided with the
* distribution. * distribution.
* 3. Redistributions in any form must be accompanied by information on * 3. Redistributions in any form must be accompanied by information on
* how to obtain complete source code for the JACOB software. * how to obtain complete source code for the JACOB software.
* *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE. * OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "EventProxy.h" #include "EventProxy.h"
// hook myself up as a listener for delegate // hook myself up as a listener for delegate
EventProxy::EventProxy(JNIEnv *env, jobject aSinkObj, EventProxy::EventProxy(JNIEnv *env, jobject aSinkObj,
CComPtr<IConnectionPoint> pConn, CComPtr<IConnectionPoint> pConn,
IID eid, CComBSTR mName[], DISPID mID[], int mNum) : IID eid, CComBSTR mName[], DISPID mID[], int mNum) :
m_cRef(0), pCP(pConn), m_cRef(0), pCP(pConn),
eventIID(eid), MethNum(mNum), MethName(mName), eventIID(eid), MethNum(mNum), MethName(mName),
MethID(mID), JMethID(NULL), javaSinkClass(NULL) MethID(mID), JMethID(NULL), javaSinkClass(NULL)
{ {
javaSinkObj = env->NewGlobalRef(aSinkObj); javaSinkObj = env->NewGlobalRef(aSinkObj);
// we need this to attach to the event invocation thread // we need this to attach to the event invocation thread
env->GetJavaVM(&jvm); env->GetJavaVM(&jvm);
AddRef(); AddRef();
HRESULT hr = pCP->Advise(this, &dwEventCookie); HRESULT hr = pCP->Advise(this, &dwEventCookie);
if (SUCCEEDED(hr)) { if (SUCCEEDED(hr)) {
// create a mapping from the DISPID's to jmethodID's by using // create a mapping from the DISPID's to jmethodID's by using
// the method names I extracted from the classinfo // the method names I extracted from the classinfo
JMethID = new jmethodID[MethNum]; JMethID = new jmethodID[MethNum];
javaSinkClass = env->GetObjectClass(javaSinkObj); javaSinkClass = env->GetObjectClass(javaSinkObj);
const char *method; const char *method;
for(int i=0;i<MethNum;i++) for(int i=0;i<MethNum;i++)
{ {
// look for a method with the specified name, that takes an // look for a method with the specified name, that takes an
// array of variants and return void // array of variants and return void
USES_CONVERSION; USES_CONVERSION;
method = W2A((OLECHAR *)MethName[i]); method = W2A((OLECHAR *)MethName[i]);
JMethID[i] = env->GetMethodID(javaSinkClass, method, "([Lcom/jacob/com/Variant;)V"); JMethID[i] = env->GetMethodID(javaSinkClass, method, "([Lcom/jacob/com/Variant;)V");
// need to clear exceptions because GetMethodID above may fail // need to clear exceptions because GetMethodID above may fail
// if the user didn't implement all the methods // if the user didn't implement all the methods
env->ExceptionClear(); env->ExceptionClear();
} }
} else { } else {
ThrowComFail(env, "Advise failed", hr); ThrowComFail(env, "Advise failed", hr);
} }
} }
// unhook myself up as a listener and get rid of delegate // unhook myself up as a listener and get rid of delegate
EventProxy::~EventProxy() EventProxy::~EventProxy()
{ {
pCP->Unadvise(dwEventCookie); pCP->Unadvise(dwEventCookie);
JNIEnv *env; JNIEnv *env;
// attach to the current running thread // attach to the current running thread
jvm->AttachCurrentThread((void **)&env, jvm); jvm->AttachCurrentThread((void **)&env, jvm);
env->DeleteGlobalRef(javaSinkObj); env->DeleteGlobalRef(javaSinkObj);
if (MethNum) { if (MethNum) {
delete [] MethName; delete [] MethName;
delete [] MethID; delete [] MethID;
if (JMethID) delete [] JMethID; if (JMethID) delete [] JMethID;
} }
// detach from thread // detach from thread
jvm->DetachCurrentThread(); jvm->DetachCurrentThread();
} }
// I only support the eventIID interface which was passed in // I only support the eventIID interface which was passed in
// by the DispatchEvent wrapper who looked it up as the // by the DispatchEvent wrapper who looked it up as the
// source object's default source interface // source object's default source interface
STDMETHODIMP EventProxy::QueryInterface(REFIID rid, void **ppv) STDMETHODIMP EventProxy::QueryInterface(REFIID rid, void **ppv)
{ {
if (rid == IID_IUnknown || rid == eventIID || rid == IID_IDispatch) if (rid == IID_IUnknown || rid == eventIID || rid == IID_IDispatch)
{ {
*ppv = this; *ppv = this;
AddRef(); AddRef();
return S_OK; return S_OK;
} }
return E_NOINTERFACE; return E_NOINTERFACE;
} }
// This should never get called - the event source fires events // This should never get called - the event source fires events
// by dispid's, not by name // by dispid's, not by name
STDMETHODIMP EventProxy::GetIDsOfNames(REFIID riid, STDMETHODIMP EventProxy::GetIDsOfNames(REFIID riid,
OLECHAR **rgszNames, UINT cNames, LCID lcid, DISPID *rgDispID) OLECHAR **rgszNames, UINT cNames, LCID lcid, DISPID *rgDispID)
{ {
return E_UNEXPECTED; return E_UNEXPECTED;
} }
// The actual callback from the connection point arrives here // The actual callback from the connection point arrives here
STDMETHODIMP EventProxy::Invoke(DISPID dispID, REFIID riid, STDMETHODIMP EventProxy::Invoke(DISPID dispID, REFIID riid,
LCID lcid, unsigned short wFlags, DISPPARAMS *pDispParams, LCID lcid, unsigned short wFlags, DISPPARAMS *pDispParams,
VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
{ {
HRESULT hr; HRESULT hr;
jmethodID meth = 0; jmethodID meth = 0;
JNIEnv *env = NULL; JNIEnv *env = NULL;
// map dispID to jmethodID // map dispID to jmethodID
for(int i=0;i<MethNum;i++) for(int i=0;i<MethNum;i++)
{ {
if (MethID[i] == dispID) { meth = JMethID[i]; break; } if (MethID[i] == dispID) { meth = JMethID[i]; break; }
} }
if (!meth) if (!meth)
{ {
// user did not implement this method // user did not implement this method
return S_OK; return S_OK;
} }
if (DISPATCH_METHOD & wFlags) if (DISPATCH_METHOD & wFlags)
{ {
// attach to the current running thread // attach to the current running thread
jvm->AttachCurrentThread((void**)&env, jvm); jvm->AttachCurrentThread((void**)&env, jvm);
// how many params // how many params
int num = pDispParams->cArgs; int num = pDispParams->cArgs;
// get variant class // get variant class
jclass vClass = env->FindClass("com/jacob/com/Variant"); jclass vClass = env->FindClass("com/jacob/com/Variant");
// and the constructor // and the constructor
jmethodID vCons = env->GetMethodID(vClass, "<init>", "()V"); jmethodID vCons = env->GetMethodID(vClass, "<init>", "()V");
// make an array of them // make an array of them
jobjectArray varr = env->NewObjectArray(num, vClass, 0); jobjectArray varr = env->NewObjectArray(num, vClass, 0);
int i,j; int i,j;
for(i=num-1,j=0;i>=0;i--,j++) for(i=num-1,j=0;i>=0;i--,j++)
{ {
// construct a java variant holder // construct a java variant holder
jobject arg = env->NewObject(vClass, vCons); jobject arg = env->NewObject(vClass, vCons);
// get the empty variant from it // get the empty variant from it
VARIANT *va = extractVariant(env, arg); VARIANT *va = extractVariant(env, arg);
// copy the value // copy the value
VariantCopy(va, &pDispParams->rgvarg[i]); VariantCopy(va, &pDispParams->rgvarg[i]);
// put it in the array // put it in the array
env->SetObjectArrayElement(varr, j, arg); env->SetObjectArrayElement(varr, j, arg);
env->DeleteLocalRef(arg); env->DeleteLocalRef(arg);
} }
// call the method // call the method
env->CallVoidMethod(javaSinkObj, meth, varr); env->CallVoidMethod(javaSinkObj, meth, varr);
// detach from thread // detach from thread
jvm->DetachCurrentThread(); jvm->DetachCurrentThread();
return S_OK; return S_OK;
} }
return E_NOINTERFACE; return E_NOINTERFACE;
} }

View File

@@ -1,107 +1,107 @@
/* /*
* Copyright (c) 1999 Dan Adler, 315 E72 St. NY, NY, 10021, USA. * Copyright (c) 1999 Dan Adler, 315 E72 St. NY, NY, 10021, USA.
* mailto:danadler@rcn.com. All rights reserved. * mailto:danadler@rcn.com. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
* are met: * are met:
* 1. Redistributions of source code must retain the above copyright * 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright * 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in * notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the * the documentation and/or other materials provided with the
* distribution. * distribution.
* 3. Redistributions in any form must be accompanied by information on * 3. Redistributions in any form must be accompanied by information on
* how to obtain complete source code for the JACOB software. * how to obtain complete source code for the JACOB software.
* *
* Redistribution of the JACOB software is not permitted as part of any * Redistribution of the JACOB software is not permitted as part of any
* commercial product that is targeted primarily at Java developers. * commercial product that is targeted primarily at Java developers.
* Such products include, but are not limited to: Java virtual machines, * Such products include, but are not limited to: Java virtual machines,
* integrated development environments, code libraries, and application * integrated development environments, code libraries, and application
* server products. Licensing terms for such distribution may be * server products. Licensing terms for such distribution may be
* obtained from the copyright holder. * obtained from the copyright holder.
* *
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include <jni.h> #include <jni.h>
#include <windows.h> #include <windows.h>
#include <objbase.h> #include <objbase.h>
#include <oleauto.h> #include <oleauto.h>
#include <olectl.h> #include <olectl.h>
#include "stdafx.h" #include "stdafx.h"
#include "util.h" #include "util.h"
/* /*
* An instance of this class stands between a connection point * An instance of this class stands between a connection point
* and a java object. When it gets invoked from the cp, it reflects * and a java object. When it gets invoked from the cp, it reflects
* the call into the java object dynamically. The eventIID is passed * the call into the java object dynamically. The eventIID is passed
* in as are the valid dispids and the corresponding names. A map * in as are the valid dispids and the corresponding names. A map
* is created between the dispids and the java object's method in * is created between the dispids and the java object's method in
* the constructor. For now, all the java event methods have to have * the constructor. For now, all the java event methods have to have
* the same signature: <name>(Variant[]) * the same signature: <name>(Variant[])
*/ */
class EventProxy : public IDispatch class EventProxy : public IDispatch
{ {
private: private:
LONG m_cRef; LONG m_cRef;
CComPtr<IConnectionPoint> pCP; // the connection point CComPtr<IConnectionPoint> pCP; // the connection point
DWORD dwEventCookie; // connection point cookie DWORD dwEventCookie; // connection point cookie
jobject javaSinkObj; // the java object to delegate calls jobject javaSinkObj; // the java object to delegate calls
jclass javaSinkClass; // the java class of the object jclass javaSinkClass; // the java class of the object
IID eventIID; // the interface iid passed in IID eventIID; // the interface iid passed in
int MethNum; int MethNum;
CComBSTR *MethName; // Array of method names CComBSTR *MethName; // Array of method names
DISPID *MethID; // Array of method ids DISPID *MethID; // Array of method ids
jmethodID *JMethID; // Array of java method ids jmethodID *JMethID; // Array of java method ids
JavaVM *jvm; // The java vm we are running JavaVM *jvm; // The java vm we are running
public: public:
// constuct with a global JNI ref to a sink object // constuct with a global JNI ref to a sink object
// to which we will delegate event callbacks // to which we will delegate event callbacks
EventProxy(JNIEnv *jenv, jobject aSinkObj, EventProxy(JNIEnv *jenv, jobject aSinkObj,
CComPtr<IConnectionPoint> pConn, CComPtr<IConnectionPoint> pConn,
IID eventIID, CComBSTR *mName, DISPID *mID, int mNum); IID eventIID, CComBSTR *mName, DISPID *mID, int mNum);
~EventProxy(); ~EventProxy();
// IUnknown methods // IUnknown methods
STDMETHODIMP_(ULONG) AddRef(void) STDMETHODIMP_(ULONG) AddRef(void)
{ {
return InterlockedIncrement(&m_cRef); return InterlockedIncrement(&m_cRef);
} }
STDMETHODIMP_(ULONG) Release(void) STDMETHODIMP_(ULONG) Release(void)
{ {
LONG res = InterlockedDecrement(&m_cRef); LONG res = InterlockedDecrement(&m_cRef);
if (res == 0) delete this; if (res == 0) delete this;
return res; return res;
} }
STDMETHODIMP QueryInterface(REFIID rid, void **ppv); STDMETHODIMP QueryInterface(REFIID rid, void **ppv);
// IDispatch methods // IDispatch methods
STDMETHODIMP GetTypeInfoCount(UINT *num) STDMETHODIMP GetTypeInfoCount(UINT *num)
{ {
*num = 0; *num = 0;
return S_OK; return S_OK;
} }
STDMETHODIMP GetTypeInfo(UINT, LCID, ITypeInfo **pptInfo) STDMETHODIMP GetTypeInfo(UINT, LCID, ITypeInfo **pptInfo)
{ {
*pptInfo=NULL; *pptInfo=NULL;
return E_NOTIMPL; return E_NOTIMPL;
} }
// These are the actual supported methods // These are the actual supported methods
STDMETHODIMP GetIDsOfNames(REFIID, OLECHAR **, UINT, LCID , DISPID *); STDMETHODIMP GetIDsOfNames(REFIID, OLECHAR **, UINT, LCID , DISPID *);
STDMETHODIMP Invoke(DISPID, REFIID, LCID, WORD , DISPPARAMS *, VARIANT *, EXCEPINFO *, UINT *); STDMETHODIMP Invoke(DISPID, REFIID, LCID, WORD , DISPPARAMS *, VARIANT *, EXCEPINFO *, UINT *);
}; };

View File

@@ -1,73 +1,73 @@
/* /*
* Copyright (c) 1999-2004 Sourceforge JACOB Project. * Copyright (c) 1999-2004 Sourceforge JACOB Project.
* All rights reserved. Originator: Dan Adler (http://danadler.com). * All rights reserved. Originator: Dan Adler (http://danadler.com).
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
* are met: * are met:
* 1. Redistributions of source code must retain the above copyright * 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright * 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in * notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the * the documentation and/or other materials provided with the
* distribution. * distribution.
* 3. Redistributions in any form must be accompanied by information on * 3. Redistributions in any form must be accompanied by information on
* how to obtain complete source code for the JACOB software. * how to obtain complete source code for the JACOB software.
* *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE. * OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "stdafx.h" #include "stdafx.h"
#include <objbase.h> #include <objbase.h>
#include "ComThread.h" #include "ComThread.h"
// Win32 support for Ole Automation // Win32 support for Ole Automation
#include <wchar.h> #include <wchar.h>
#include <string.h> #include <string.h>
#include <atlbase.h> #include <atlbase.h>
#include <oleauto.h> #include <oleauto.h>
#include <olectl.h> #include <olectl.h>
#include "util.h" #include "util.h"
extern "C" extern "C"
{ {
JNIEXPORT void JNICALL Java_com_jacob_com_STA_doMessagePump JNIEXPORT void JNICALL Java_com_jacob_com_STA_doMessagePump
(JNIEnv *env, jobject obj) (JNIEnv *env, jobject obj)
{ {
// store the current thread id so we can kill it // store the current thread id so we can kill it
jclass argClass = env->GetObjectClass(obj); jclass argClass = env->GetObjectClass(obj);
jfieldID ajf = env->GetFieldID( argClass, "threadID", "I"); jfieldID ajf = env->GetFieldID( argClass, "threadID", "I");
jint threadID = (jint)GetCurrentThreadId(); jint threadID = (jint)GetCurrentThreadId();
env->SetIntField(obj, ajf, threadID); env->SetIntField(obj, ajf, threadID);
MSG msg; MSG msg;
ZeroMemory(&msg, sizeof(msg)); ZeroMemory(&msg, sizeof(msg));
msg.wParam = S_OK; msg.wParam = S_OK;
while (GetMessage(&msg, NULL, 0, 0)) while (GetMessage(&msg, NULL, 0, 0))
{ {
DispatchMessage(&msg); DispatchMessage(&msg);
} }
} }
JNIEXPORT void JNICALL Java_com_jacob_com_STA_quitMessagePump JNIEXPORT void JNICALL Java_com_jacob_com_STA_quitMessagePump
(JNIEnv *env, jobject obj) (JNIEnv *env, jobject obj)
{ {
jclass argClass = env->GetObjectClass(obj); jclass argClass = env->GetObjectClass(obj);
jfieldID ajf = env->GetFieldID( argClass, "threadID", "I"); jfieldID ajf = env->GetFieldID( argClass, "threadID", "I");
jint threadID = env->GetIntField(obj, ajf); jint threadID = env->GetIntField(obj, ajf);
PostThreadMessage((DWORD)threadID, WM_QUIT, 0, 0); PostThreadMessage((DWORD)threadID, WM_QUIT, 0, 0);
} }
} }

View File

@@ -1,29 +1,29 @@
/* DO NOT EDIT THIS FILE - it is machine generated */ /* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h> #include <jni.h>
/* Header for class STA */ /* Header for class STA */
#ifndef _Included_com_jacob_com_STA #ifndef _Included_com_jacob_com_STA
#define _Included_com_jacob_com_STA #define _Included_com_jacob_com_STA
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
/* /*
* Class: com_jacob_com_STA * Class: com_jacob_com_STA
* Method: doMessagePump * Method: doMessagePump
* Signature: ()V * Signature: ()V
*/ */
JNIEXPORT void JNICALL Java_com_jacob_com_STA_doMessagePump JNIEXPORT void JNICALL Java_com_jacob_com_STA_doMessagePump
(JNIEnv *, jobject); (JNIEnv *, jobject);
/* /*
* Class: com_jacob_com_STA * Class: com_jacob_com_STA
* Method: quitMessagePump * Method: quitMessagePump
* Signature: ()V * Signature: ()V
*/ */
JNIEXPORT void JNICALL Java_com_jacob_com_STA_quitMessagePump JNIEXPORT void JNICALL Java_com_jacob_com_STA_quitMessagePump
(JNIEnv *, jobject); (JNIEnv *, jobject);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif #endif

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,41 +1,41 @@
/* /*
* Copyright (c) 1999-2004 Sourceforge JACOB Project. * Copyright (c) 1999-2004 Sourceforge JACOB Project.
* All rights reserved. Originator: Dan Adler (http://danadler.com). * All rights reserved. Originator: Dan Adler (http://danadler.com).
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
* are met: * are met:
* 1. Redistributions of source code must retain the above copyright * 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright * 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in * notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the * the documentation and/or other materials provided with the
* distribution. * distribution.
* 3. Redistributions in any form must be accompanied by information on * 3. Redistributions in any form must be accompanied by information on
* how to obtain complete source code for the JACOB software. * how to obtain complete source code for the JACOB software.
* *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE. * OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
// stdafx.cpp : source file that includes just the standard includes // stdafx.cpp : source file that includes just the standard includes
// stdafx.pch will be the pre-compiled header // stdafx.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information // stdafx.obj will contain the pre-compiled type information
#include "stdafx.h" #include "stdafx.h"
#ifdef _ATL_STATIC_REGISTRY #ifdef _ATL_STATIC_REGISTRY
#include <statreg.h> #include <statreg.h>
#include <statreg.cpp> #include <statreg.cpp>
#endif #endif
#include <atlimpl.cpp> #include <atlimpl.cpp>

View File

@@ -1,32 +1,32 @@
// stdafx.h : include file for standard system include files, // stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, // or project specific include files that are used frequently,
// but are changed infrequently // but are changed infrequently
#if !defined(AFX_STDAFX_H__9988E984_6789_11D3_A646_000000000000__INCLUDED_) #if !defined(AFX_STDAFX_H__9988E984_6789_11D3_A646_000000000000__INCLUDED_)
#define AFX_STDAFX_H__9988E984_6789_11D3_A646_000000000000__INCLUDED_ #define AFX_STDAFX_H__9988E984_6789_11D3_A646_000000000000__INCLUDED_
#if _MSC_VER > 1000 #if _MSC_VER > 1000
#pragma once #pragma once
#endif // _MSC_VER > 1000 #endif // _MSC_VER > 1000
#ifndef STRICT #ifndef STRICT
#define STRICT #define STRICT
#endif #endif
#ifndef _WIN32_WINNT #ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0400 #define _WIN32_WINNT 0x0400
#endif #endif
//#define _ATL_APARTMENT_THREADED //#define _ATL_APARTMENT_THREADED
#include <windows.h> #include <windows.h>
#include <comdef.h> #include <comdef.h>
#include <comutil.h> #include <comutil.h>
#include <atlbase.h> #include <atlbase.h>
//You may derive a class from CComModule and use it if you want to override //You may derive a class from CComModule and use it if you want to override
//something, but do not change the name of _Module //something, but do not change the name of _Module
extern CComModule _Module; extern CComModule _Module;
#include <atlcom.h> #include <atlcom.h>
//{{AFX_INSERT_LOCATION}} //{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line. // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_STDAFX_H__9988E984_6789_11D3_A646_000000000000__INCLUDED) #endif // !defined(AFX_STDAFX_H__9988E984_6789_11D3_A646_000000000000__INCLUDED)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,69 +1,69 @@
/* /*
* Copyright (c) 1999-2004 Sourceforge JACOB Project. * Copyright (c) 1999-2004 Sourceforge JACOB Project.
* All rights reserved. Originator: Dan Adler (http://danadler.com). * All rights reserved. Originator: Dan Adler (http://danadler.com).
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
* are met: * are met:
* 1. Redistributions of source code must retain the above copyright * 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright * 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in * notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the * the documentation and/or other materials provided with the
* distribution. * distribution.
* 3. Redistributions in any form must be accompanied by information on * 3. Redistributions in any form must be accompanied by information on
* how to obtain complete source code for the JACOB software. * how to obtain complete source code for the JACOB software.
* *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE. * OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "Dispatch.h" #include "Dispatch.h"
// Win32 support for Ole Automation // Win32 support for Ole Automation
#include <wchar.h> #include <wchar.h>
#include <string.h> #include <string.h>
#include <atlbase.h> #include <atlbase.h>
#include <objbase.h> #include <objbase.h>
#include <oleauto.h> #include <oleauto.h>
#include <olectl.h> #include <olectl.h>
#include "util.h" #include "util.h"
extern "C" extern "C"
{ {
void ThrowComFail(JNIEnv *env, const char* desc, jint hr) void ThrowComFail(JNIEnv *env, const char* desc, jint hr)
{ {
jclass failClass = env->FindClass("com/jacob/com/ComFailException"); jclass failClass = env->FindClass("com/jacob/com/ComFailException");
// call the constructor that takes hr and message // call the constructor that takes hr and message
jmethodID failCons = jmethodID failCons =
env->GetMethodID(failClass, "<init>", "(ILjava/lang/String;)V"); env->GetMethodID(failClass, "<init>", "(ILjava/lang/String;)V");
if (!desc) desc = "Java/COM Error"; if (!desc) desc = "Java/COM Error";
jstring js = env->NewStringUTF(desc); jstring js = env->NewStringUTF(desc);
jthrowable fail = (jthrowable)env->NewObject(failClass, failCons, hr, js); jthrowable fail = (jthrowable)env->NewObject(failClass, failCons, hr, js);
env->Throw(fail); env->Throw(fail);
} }
// if env's are different throw on the 1st env // if env's are different throw on the 1st env
int CheckEnv(JNIEnv *env1, JNIEnv *env2) int CheckEnv(JNIEnv *env1, JNIEnv *env2)
{ {
if (env1 != env2) { if (env1 != env2) {
jclass failClass = env1->FindClass("com/jacob/com/WrongThreadException"); jclass failClass = env1->FindClass("com/jacob/com/WrongThreadException");
// call the constructor that takes hr and message // call the constructor that takes hr and message
jmethodID failCons = jmethodID failCons =
env1->GetMethodID(failClass, "<init>", "()V"); env1->GetMethodID(failClass, "<init>", "()V");
env1->ThrowNew(failClass, "Wrong Thread"); env1->ThrowNew(failClass, "Wrong Thread");
return 0; return 0;
} }
return 1; return 1;
} }
} }

View File

@@ -1,8 +1,8 @@
#include <objbase.h> #include <objbase.h>
extern "C" { extern "C" {
VARIANT *extractVariant(JNIEnv *env, jobject arg); VARIANT *extractVariant(JNIEnv *env, jobject arg);
void ThrowComFail(JNIEnv *env, const char* desc, jint hr); void ThrowComFail(JNIEnv *env, const char* desc, jint hr);
IDispatch *extractDispatch(JNIEnv *env, jobject arg); IDispatch *extractDispatch(JNIEnv *env, jobject arg);
SAFEARRAY *extractSA(JNIEnv *env, jobject arg); SAFEARRAY *extractSA(JNIEnv *env, jobject arg);
void setSA(JNIEnv *env, jobject arg, SAFEARRAY *sa, int copy); void setSA(JNIEnv *env, jobject arg, SAFEARRAY *sa, int copy);
} }