Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 15024 Details for
Bug 10977
Safearray support for ActiveX-Integration
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
Class Bug10977 - example showing how to read from and write to a SAFEARRAY
(text/plain), 7.38 KB, created by
Veronika Irvine
on 2004-10-06 14:16:23 EDT
(
hide
)
Description:
Class Bug10977 - example showing how to read from and write to a SAFEARRAY
Filename:
MIME Type:
Creator:
Veronika Irvine
Created:
2004-10-06 14:16:23 EDT
Size:
7.38 KB
patch
obsolete
>package prs; > >import org.eclipse.swt.*; >import org.eclipse.swt.internal.win32.*; >import org.eclipse.swt.layout.*; >import org.eclipse.swt.ole.win32.*; >import org.eclipse.swt.widgets.*; > >public class Bug10977 { > >int CodePage = OS.GetACP(); >OleControlSite controlSite; >OleAutomation automation; >Text text; > >public static void main (String [] args) { > new Bug10977().run(); >} >void run() { > Display display = new Display (); > Shell shell = new Shell (display); > shell.setLayout(new GridLayout(2, false)); > > text = new Text(shell, SWT.BORDER); > text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); > Button b = new Button(shell, SWT.PUSH); > b.setText("go"); > b.addListener(SWT.Selection, new Listener() { > public void handleEvent(Event e) { > String url = text.getText(); > int[] rgdispid = automation.getIDsOfNames(new String[]{"Navigate", "URL"}); > int dispIdMember = rgdispid[0]; > Variant[] rgvarg = new Variant[1]; > rgvarg[0] = new Variant(url); > int[] rgdispidNamedArgs = new int[1]; > rgdispidNamedArgs[0] = rgdispid[1]; > automation.invoke(dispIdMember, rgvarg, rgdispidNamedArgs); > } > }); > > OleFrame oleFrame = new OleFrame(shell, SWT.NONE); > oleFrame.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1)); > try { > controlSite = new OleControlSite(oleFrame, SWT.NONE, "Shell.Explorer"); > automation = new OleAutomation(controlSite); > controlSite.doVerb(OLE.OLEIVERB_INPLACEACTIVATE); > } catch (SWTException ex) { > return; > } > > // Read PostData whenever we navigate to a site that uses it > int BeforeNavigate2 = 0xfa; > controlSite.addEventListener(BeforeNavigate2, new OleListener() { > public void handleEvent(OleEvent event) { > Variant postData = event.arguments[4]; > if (postData != null) { > System.out.println(readSafeArray(postData)); > } > } > }); > > // Navigate to this web site which takes post data to fill in the text field > // and put the string "hello world" into the text box > text.setText("http://cmis.mis.brighton.ac.uk/cgi-bin/mas/mas_form"); > int[] rgdispid = automation.getIDsOfNames(new String[]{"Navigate", "URL", "PostData"}); > int dispIdMember = rgdispid[0]; > Variant[] rgvarg = new Variant[2]; > rgvarg[0] = new Variant(text.getText()); > rgvarg[1] = makeSafeArray("hello world"); > int[] rgdispidNamedArgs = new int[2]; > rgdispidNamedArgs[0] = rgdispid[1]; > rgdispidNamedArgs[1] = rgdispid[2]; > automation.invoke(dispIdMember, rgvarg, rgdispidNamedArgs); > > shell.open (); > while (!shell.isDisposed ()) { > if (!display.readAndDispatch ()) display.sleep (); > } > display.dispose (); >} >Variant makeSafeArray (String string) { > // Here I create a one dimensional safearray containing two VT_UI1 values > // where VT_UI1 is an unsigned char > > // SAFEARRAY looks like this: > // short cDims // Count of dimensions in this array > // short fFeatures // Flags used by the SafeArray > // int cbElements // Size of an element of the array > // int cLocks // Number of times the array has been locked without corresponding unlock > // int pvData // Pointer to the data > // SAFEARRAYBOUND[] rgsabound // One bound for each dimension > // SAFEARRAYBOUND looks like this: > // int cElements // the number of elements in the dimension > // int lLbound // the lower bound of the dimension > > //step 1 - define cDims, fFeatures and cbElements > short cDims = 1; > short FADF_FIXEDSIZE = 0x10; > short FADF_HAVEVARTYPE = 0x80; > short fFeatures = (short)(FADF_FIXEDSIZE | FADF_HAVEVARTYPE); > int cbElements = 1; > //create a pointer and copy the data into it > int count = string.length(); > char[] chars = new char[count + 1]; > string.getChars(0, count, chars, 0); > int cchMultiByte = OS.WideCharToMultiByte(CodePage, 0, chars, -1, null, 0, null, null); > if (cchMultiByte == 0) return null; > int pvData = OS.GlobalAlloc(OS.GMEM_FIXED | OS.GMEM_ZEROINIT, cchMultiByte); > OS.WideCharToMultiByte(CodePage, 0, chars, -1, pvData, cchMultiByte, null, null); > int cElements1 = cchMultiByte; > int lLbound1 = 0; > //step 3 - create a safearray in memory > // 12 bytes for cDims, fFeatures and cbElements + 4 bytes for pvData + number of dimensions * (size of safearraybound) > int sizeofSafeArray = 12 + 4 + 1*8; > int pSafeArray = OS.GlobalAlloc(OS.GMEM_FIXED | OS.GMEM_ZEROINIT, sizeofSafeArray); > //step 4 copy all the data into the safe array > int offset = 0; > OS.MoveMemory(pSafeArray + offset, new short[] {cDims}, 2); offset += 2; > OS.MoveMemory(pSafeArray + offset, new short[] {fFeatures}, 2); offset += 2; > OS.MoveMemory(pSafeArray + offset, new int[] {cbElements}, 4); offset += 4; > OS.MoveMemory(pSafeArray + offset, new int[] {0}, 4); offset += 4; > OS.MoveMemory(pSafeArray + offset, new int[] {pvData}, 4); offset += 4; > OS.MoveMemory(pSafeArray + offset, new int[] {cElements1}, 4); offset += 4; > OS.MoveMemory(pSafeArray + offset, new int[] {lLbound1}, 4); offset += 4; > //step 5 create a variant in memory to hold the safearray > // VARIANT looks like this: > // short vt > // short wReserved1 > // short wReserved2 > // short wReserved3 > // int parray > int pVariant = OS.GlobalAlloc(OS.GMEM_FIXED | OS.GMEM_ZEROINIT, Variant.sizeof); > short vt = (short)(OLE.VT_ARRAY | OLE.VT_UI1); > OS.MoveMemory(pVariant, new short[] {vt}, 2); > OS.MoveMemory(pVariant + 8, new int[]{pSafeArray}, 4); > //step 6 create a by ref variant > Variant variantByRef = new Variant(pVariant, (short)(OLE.VT_BYREF | OLE.VT_VARIANT)); > return variantByRef; >} >String readSafeArray(Variant variantByRef) { > // In this example the safearray contains data of > // type VT_UI1 (or unsigned shorts) which contains > // a text stream. > int pPostData = variantByRef.getByRef(); > short[] vt_type = new short[1]; > OS.MoveMemory(vt_type, pPostData, 2); > System.out.println("vt type is "+vt_type[0]); > String result = null; > if (vt_type[0] == (short)(OLE.VT_BYREF | OLE.VT_VARIANT)) { > int[] pVariant = new int[1]; > OS.MoveMemory(pVariant, pPostData + 8, 4); > vt_type = new short[1]; > OS.MoveMemory(vt_type, pVariant[0], 2); > System.out.println("second vt type is "+vt_type[0]); > if (vt_type[0] == (short)(OLE.VT_ARRAY | OLE.VT_UI1)) { > int[] pSafearray = new int[1]; > OS.MoveMemory(pSafearray, pVariant[0] + 8, 4); > short[] cDims = new short[1]; > OS.MoveMemory(cDims, pSafearray[0], 2); > System.out.println("dimension of array is "+cDims[0]); > int[] pvData = new int[1]; > OS.MoveMemory(pvData, pSafearray[0] + 12, 4); > int offset = 0; > int safearrayboundOffset = 0; > for (int i = 0; i < cDims[0]; i++) { > int[] cElements = new int[1]; > OS.MoveMemory(cElements, pSafearray[0] + 16 + safearrayboundOffset, 4); > safearrayboundOffset += 8; > System.out.println("element count for dimension "+i+" is "+cElements[0]); > int cchWideChar = OS.MultiByteToWideChar (CodePage, OS.MB_PRECOMPOSED, pvData[0], -1, null, 0); > if (cchWideChar == 0) return null; > char[] lpWideCharStr = new char [cchWideChar - 1]; > OS.MultiByteToWideChar (CodePage, OS.MB_PRECOMPOSED, pvData[0], -1, lpWideCharStr, lpWideCharStr.length); > result = new String(lpWideCharStr); > System.out.println("data is "+result); > } > } > } > return result; >} >}
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 10977
: 15024