that do not include info about the event. If you hook a listener by
invoking "attachEvent" instead then the callback has more useful
information. To do this, start with Snippet123:
Change its DownloadComplete listener to:
public void handleEvent(OleEvent event) {
int[] htmlDocumentID = webBrowser.getIDsOfNames(new
String[]{"Document"});
if (htmlDocumentID == null) return;
Variant pVarResult = webBrowser.getProperty(htmlDocumentID[0]);
if (pVarResult == null || pVarResult.getType() == 0) return;
OleAutomation htmlDocument = pVarResult.getAutomation();
//IHTMLDocument3
pVarResult.dispose();
EventDispatch myDispatch = new EventDispatch(EventDispatch.onclick);
IDispatch idispatch = new IDispatch(myDispatch.getAddress());
int[] ids = htmlDocument.getIDsOfNames(new String[]{"attachEvent"});
Variant[] rgvarg = new Variant[2];
rgvarg[0] = new Variant("onclick");
rgvarg[1] = new Variant(idispatch);
pVarResult = htmlDocument.invoke(ids[0], rgvarg);
pVarResult.dispose();
rgvarg[0].dispose();
htmlDocument.dispose();
}
Change its Invoke method to (shortened to the onclick case just for
brevity):
private int Invoke(int dispIdMember, int /*long*/ riid, int lcid, int
dwFlags, int /*long*/ pDispParams, int /*long*/ pVarResult, int /*long*/
pExcepInfo, int /*long*/ pArgErr) {
switch (eventID) {
case onclick: {
DISPPARAMS params = new DISPPARAMS();
COM.MoveMemory(params, pDispParams, DISPPARAMS.sizeof);
Variant variant = Variant.win32_new(params.rgvarg);
OleAutomation event = variant.getAutomation();
variant.dispose();
int[] rgdispid = event.getIDsOfNames(new String[] {
"srcElement" });
dispIdMember = rgdispid[0];
Variant result = event.getProperty(dispIdMember);
event.dispose();
OleAutomation element = result.getAutomation();
result.dispose();
rgdispid = element.getIDsOfNames(new String[] {