use of com.sun.jna.platform.win32.Guid.IID in project jna by java-native-access.
the class CallbackProxy method createRIID.
REFIID createRIID(Class<?> comEventCallbackInterface) {
ComInterface comInterfaceAnnotation = comEventCallbackInterface.getAnnotation(ComInterface.class);
if (null == comInterfaceAnnotation) {
throw new COMException("advise: Interface must define a value for either iid via the ComInterface annotation");
}
String iidStr = comInterfaceAnnotation.iid();
if (null == iidStr || iidStr.isEmpty()) {
throw new COMException("ComInterface must define a value for iid");
}
return new REFIID(new IID(iidStr).getPointer());
}
use of com.sun.jna.platform.win32.Guid.IID in project jna by java-native-access.
the class ProxyObject method queryInterface.
@Override
public <T> T queryInterface(Class<T> comInterface) throws COMException {
assert COMUtils.comIsInitialized() : "COM not initialized";
try {
ComInterface comInterfaceAnnotation = comInterface.getAnnotation(ComInterface.class);
if (null == comInterfaceAnnotation) {
throw new COMException("queryInterface: Interface must define a value for iid via the ComInterface annotation");
}
final IID iid = this.getIID(comInterfaceAnnotation);
final PointerByReference ppvObject = new PointerByReference();
HRESULT hr = ProxyObject.this.getRawDispatch().QueryInterface(new REFIID(iid), ppvObject);
if (WinNT.S_OK.equals(hr)) {
Dispatch dispatch = new Dispatch(ppvObject.getValue());
T t = this.factory.createProxy(comInterface, dispatch);
// QueryInterface returns a COM object pointer with a +1
// reference, we must drop one,
// Note: createProxy adds one;
int n = dispatch.Release();
return t;
} else {
String formatMessageFromHR = Kernel32Util.formatMessage(hr);
throw new COMException("queryInterface: " + formatMessageFromHR);
}
} catch (Exception e) {
throw new COMException("Error occured when trying to query for interface " + comInterface.getName(), e);
}
}
use of com.sun.jna.platform.win32.Guid.IID in project jna by java-native-access.
the class ComEventCallbacks_Test method testComEventCallback.
@Test
public void testComEventCallback() throws InterruptedException {
VARIANT.ByReference pVarResult = new VARIANT.ByReference();
IntByReference puArgErr = new IntByReference();
EXCEPINFO.ByReference pExcepInfo = new EXCEPINFO.ByReference();
HRESULT hr;
DISPPARAMS.ByReference pDispParams;
pDispParams = new DISPPARAMS.ByReference();
pDispParams.setArgs(new VARIANT[] { new VARIANT(true) });
pDispParams.setRgdispidNamedArgs(new DISPID[] { OaIdl.DISPID_PROPERTYPUT });
// Visible-Prioperty
hr = ieDispatch.Invoke(dispIdVisible.getValue(), niid, lcid, propertyPutFlags, pDispParams, null, null, null);
COMUtils.checkRC(hr);
// query for ConnectionPointContainer
Unknown unk = new Unknown(ieApp.getValue());
PointerByReference ppCpc = new PointerByReference();
hr = unk.QueryInterface(new REFIID(IID_IConnectionPointContainer), ppCpc);
COMUtils.checkRC(hr);
ConnectionPointContainer cpc = new ConnectionPointContainer(ppCpc.getValue());
// find connection point for DWebBrowserEvents2
REFIID riid = new REFIID(IID_DWebBrowserEvents2);
PointerByReference ppCp = new PointerByReference();
hr = cpc.FindConnectionPoint(riid, ppCp);
COMUtils.checkRC(hr);
final ConnectionPoint cp = new ConnectionPoint(ppCp.getValue());
IID cp_iid = new IID();
hr = cp.GetConnectionInterface(cp_iid);
COMUtils.checkRC(hr);
final DWebBrowserEvents2_Listener listener = new DWebBrowserEvents2_Listener();
final DWORDByReference pdwCookie = new DWORDByReference();
HRESULT hr1 = cp.Advise(listener, pdwCookie);
COMUtils.checkRC(hr1);
// Advise make several callbacks into the object passed in - at this
// point QueryInterface must have be called multiple times
Assert.assertTrue(listener.QueryInterface_called);
// Call Navigate with URL https://github.com/java-native-access/jna
String navigateURL = "https://github.com/java-native-access/jna";
String blockedURL = "http://www.google.de";
VARIANT[] arguments = new VARIANT[] { new VARIANT(navigateURL) };
pDispParams = new DISPPARAMS.ByReference();
pDispParams.setArgs(arguments);
hr = ieDispatch.Invoke(dispIdNavigate.getValue(), niid, lcid, methodFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
COMUtils.checkRC(hr, pExcepInfo, puArgErr);
for (int i = 0; i < 10; i++) {
if (listener.navigateComplete2Called) {
break;
}
Thread.sleep(1000);
}
// At this point the call to Navigate before should be complete
Assert.assertTrue(listener.navigateComplete2Called);
// Navidate complete should have brought us to github
Assert.assertEquals(navigateURL, listener.navigateComplete2String);
listener.navigateComplete2Called = false;
listener.navigateComplete2String = null;
listener.blockNavigation = true;
arguments = new VARIANT[] { new VARIANT(blockedURL) };
pDispParams = new DISPPARAMS.ByReference();
pDispParams.setArgs(arguments);
hr = ieDispatch.Invoke(dispIdNavigate.getValue(), niid, lcid, methodFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
COMUtils.checkRC(hr, pExcepInfo, puArgErr);
// wait 10 seconds to ensure navigation won't happen
for (int i = 0; i < 10; i++) {
if (listener.navigateComplete2Called) {
break;
}
Thread.sleep(1000);
}
// Naviation will be blocked - so NavigateComplete can't be called
Assert.assertFalse("NavigateComplete Handler was called although it should be blocked", listener.navigateComplete2Called);
}
use of com.sun.jna.platform.win32.Guid.IID in project jna by java-native-access.
the class ComEventCallbacks_Test method GetConnectionInterface.
@Test
public void GetConnectionInterface() {
// query for ConnectionPointContainer
Unknown unk = new Unknown(this.ieApp.getValue());
PointerByReference ppCpc = new PointerByReference();
HRESULT hr = unk.QueryInterface(new REFIID(IID_IConnectionPointContainer), ppCpc);
COMUtils.checkRC(hr);
ConnectionPointContainer cpc = new ConnectionPointContainer(ppCpc.getValue());
// find connection point for DWebBrowserEvents2
REFIID riid = new REFIID(IID_DWebBrowserEvents2);
PointerByReference ppCp = new PointerByReference();
hr = cpc.FindConnectionPoint(riid, ppCp);
COMUtils.checkRC(hr);
ConnectionPoint cp = new ConnectionPoint(ppCp.getValue());
IID cp_iid = new IID();
hr = cp.GetConnectionInterface(cp_iid);
COMUtils.checkRC(hr);
Assert.assertEquals(IID_DWebBrowserEvents2, cp_iid);
}
use of com.sun.jna.platform.win32.Guid.IID in project jna by java-native-access.
the class ComEventCallbacksObjectFactory_Test method testComEventCallback.
@Test
public void testComEventCallback() {
DWebBrowserEvents2_Listener listener = new DWebBrowserEvents2_Listener();
CallbackProxy proxy = new CallbackProxy(factory, DWebBrowserEvents2.class, listener);
REFIID refiid = new REFIID(new IID(DWebBrowserEvents2.IID));
// precondition: the structures for the listenedToRiid and
// refiid have to be different (else the PointerType#equals would
// be enough
assertFalse(proxy.listenedToRiid.getPointer().equals(refiid.getPointer()));
// Neverthe less, the QueryInterface method has to return the
// correct pointer (the IID is relevant, not its wrapper
PointerByReference interfacePointer = new PointerByReference();
// Check the "business" interface
HRESULT hr = proxy.QueryInterface(refiid, interfacePointer);
assertTrue(COMUtils.SUCCEEDED(hr));
assertEquals(interfacePointer.getValue(), proxy.getPointer());
// IUnknown must be implemented
hr = proxy.QueryInterface(new REFIID(IID_IUNKNOWN), interfacePointer);
assertTrue(COMUtils.SUCCEEDED(hr));
assertEquals(interfacePointer.getValue(), proxy.getPointer());
// Currently only Dispatch based callbacks are supported,
// so this interface must be present to
hr = proxy.QueryInterface(new REFIID(IID_IDISPATCH), interfacePointer);
assertTrue(COMUtils.SUCCEEDED(hr));
assertEquals(interfacePointer.getValue(), proxy.getPointer());
// Negative check -- this has to fail, the IID should not be
// assigned
hr = proxy.QueryInterface(new REFIID(new IID("{00000000-0000-0000-C000-000000000000}")), interfacePointer);
assertTrue(COMUtils.FAILED(hr));
}
Aggregations