diff options
Diffstat (limited to 'bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/ole/win32/IDispatch.java')
-rw-r--r-- | bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/ole/win32/IDispatch.java | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/ole/win32/IDispatch.java b/bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/ole/win32/IDispatch.java new file mode 100644 index 0000000000..211582bceb --- /dev/null +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/ole/win32/IDispatch.java @@ -0,0 +1,66 @@ +/******************************************************************************* + * Copyright (c) 2000, 2008 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.swt.internal.ole.win32; + +import org.eclipse.swt.internal.win32.*; + +public class IDispatch extends IUnknown { + +public IDispatch(int /*long*/ address) { + super(address); +} +public int GetIDsOfNames(GUID riid, String[] rgszNames, int cNames, int lcid, int[] rgDispId) { + + char[] buffer; + int size = rgszNames.length; + + // create an array to hold the addresses + int /*long*/ hHeap = OS.GetProcessHeap(); + int /*long*/ ppNames = OS.HeapAlloc(hHeap, OS.HEAP_ZERO_MEMORY, size * OS.PTR_SIZEOF); + int /*long*/[] memTracker = new int /*long*/[size]; + + try { + // add the address of each string to the array + + for (int i=0; i<size; i++){ + // create a null terminated array of char for each String + int nameSize = rgszNames[i].length(); + buffer = new char[nameSize +1]; + rgszNames[i].getChars(0, nameSize, buffer, 0); + // get the address of the start of the array of char + int /*long*/ pName = OS.HeapAlloc(hHeap, OS.HEAP_ZERO_MEMORY, buffer.length * 2); + OS.MoveMemory(pName, buffer, buffer.length * 2); + // copy the address to the array of addresses + COM.MoveMemory(ppNames + OS.PTR_SIZEOF * i, new int /*long*/[]{pName}, OS.PTR_SIZEOF); + // keep track of the Global Memory so we can free it + memTracker[i] = pName; + } + + return COM.VtblCall(5, address, new GUID(), ppNames, cNames, lcid, rgDispId); + + } finally { + // free the memory + for (int i=0; i<memTracker.length; i++){ + OS.HeapFree(hHeap, 0, memTracker[i]); + } + OS.HeapFree(hHeap, 0, ppNames); + } +} +public int GetTypeInfo(int iTInfo, int lcid, int /*long*/[] ppTInfo ){ + return COM.VtblCall(4, address, iTInfo, lcid, ppTInfo); +} +public int GetTypeInfoCount(int [] pctinfo ){ + return COM.VtblCall(3, address, pctinfo); +} +public int Invoke(int dispIdMember, GUID riid, int lcid, int dwFlags, DISPPARAMS pDispParams, int /*long*/ pVarResult, EXCEPINFO pExcepInfo, int[] pArgErr) { + return COM.VtblCall(6, address, dispIdMember, riid, lcid, dwFlags, pDispParams, pVarResult, pExcepInfo, pArgErr); +} +} |