]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.eclipse.swt.win32.win32.x86_64/src/org/eclipse/swt/internal/ole/win32/IDispatch.java
Work around SWT 4.13 - 4.18 Win32 DnD bug 567422
[simantics/platform.git] / bundles / org.eclipse.swt.win32.win32.x86_64 / src / org / eclipse / swt / internal / ole / win32 / IDispatch.java
diff --git a/bundles/org.eclipse.swt.win32.win32.x86_64/src/org/eclipse/swt/internal/ole/win32/IDispatch.java b/bundles/org.eclipse.swt.win32.win32.x86_64/src/org/eclipse/swt/internal/ole/win32/IDispatch.java
new file mode 100644 (file)
index 0000000..a93811e
--- /dev/null
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2017 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swt.internal.ole.win32;
+
+import org.eclipse.swt.internal.*;
+import org.eclipse.swt.internal.win32.*;
+
+public class IDispatch extends IUnknown {
+
+public IDispatch(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
+       long hHeap = OS.GetProcessHeap();
+       long ppNames = OS.HeapAlloc(hHeap, OS.HEAP_ZERO_MEMORY, size * C.PTR_SIZEOF);
+       long[] memTracker = new 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
+                       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
+                       OS.MoveMemory(ppNames + C.PTR_SIZEOF * i, new long[]{pName}, C.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, long[] ppTInfo ){
+       return COM.VtblCall(4, address, iTInfo, lcid, ppTInfo);
+}
+public int Invoke(int dispIdMember, GUID riid, int lcid, int dwFlags, DISPPARAMS pDispParams, long pVarResult, EXCEPINFO pExcepInfo, int[] pArgErr) {
+       return COM.VtblCall(6, address, dispIdMember, riid, lcid, dwFlags, pDispParams, pVarResult, pExcepInfo, pArgErr);
+}
+}