How To Pass Binary Data Between an ActiveX Control and VBLast reviewed: October 10, 1997Article ID: Q154172 |
2.00 2.10 2.20 4.00 4.10 4.20
WINDOWS NT
kbole kbprg kbhowto
The information in this article applies to:
SUMMARYThis article will demonstrate how to pass an array of bytes between Visual Basic and an ActiveX (OLE) Control. This is accomplished by creating a method that takes a VARIANT parameter that will contain a SafeArray of bytes.
MORE INFORMATIONExchanging data in this manner is useful for both raw data and as a technique for passing data structures. WARNING: Passing data structures in this manner can pose problems if it contains pointers.
Sample Code
/* Compile options needed : None */ // Automation method in the control BinData. void CBinDataCtrl::VBtoVCtoVB(const VARIANT FAR& Buffer) { // Verify the Variant contains SafeArray of Bytes if (Buffer.vt == (VT_ARRAY | VT_UI1)) { long Dims = SafeArrayGetDim(Buffer.parray); long UpperBounds; long LowerBounds; if (Dims == 1) { SafeArrayGetLBound(Buffer.parray, 1, &LowerBounds); SafeArrayGetUBound(Buffer.parray, 1, &UpperBounds); // Use LowerBounds and UpperBounds to force a specific // Array size as shown here or they can be used to // dynamically create the buffer. if ((LowerBounds == 0) && (UpperBounds == 512)) { // Reference pointer for accessing the SafeArray unsigned char* buff; // Variable to store the data from the SafeArray // could be a global variable or member of CBinDataCtrl // Shown as a local variable for demonstration purpose only unsigned char m_abBinaryData[512]; SafeArrayAccessData (Buffer.parray, (void**)&buff); for (int i = 0; i < 512; i++) { // Handle the binary data in the buffers // Copying the data passed from VB to VC. m_abBinaryData[i] = buff[i]; // Modifying the data to be passed back to VB buff[i] = 0; } SafeArrayUnaccessData (Buffer.parray); return; } } } AfxMessageBox ("Invalid parameter passed in VBtoVC method.\n" + "The array may only have a single dimension.\n" + "The array must contain 512 bytes."); }NOTE: Code for Visual Basic 4.0 where BinData is the name of the control:
Private Sub Form_Load() Dim buf(512) As Byte For i = 0 To 511 buf(i) = 50 Next i BinData1.VBtoVCtoVB buf End Sub REFERENCESFor more information, please see the following articles in the Microsoft Knowledge Base:
ARTICLE-ID: Q122287 TITLE : Limits of VB 3.0 & Disptest as Automation Controllers ARTICLE-ID: Q131046 TITLE : SAMPLE: BINARY: Transfer Binary Data Using OLE Automation ARTICLE-ID: Q131086 TITLE : SAMPLE: SAFEARAY: Use of Safe Arrays in Automation ARTICLE-ID: Q140202 TITLE : SAMPLE: MFCARRAY: Using Safe Arrays in MFC Automation ARTICLE-ID: Q122289 TITLE : Passing Structures in OLE AutomationMicrosoft Systems Journal, June 1996, "Q&A OLE" by Don Box.
|
Additional reference words: 2.00 2.10 2.20 4.00 4.10 4.20 kbinf array
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |