You are currently offline, waiting for your internet to reconnect

How To Pass Binary Data Between an ActiveX Control and VB

This article was previously published under Q154172
This article has been archived. It is offered "as is" and will no longer be updated.
This article will demonstrate how to pass an array of bytes between VisualBasic and an ActiveX (OLE) Control. This is accomplished by creating amethod that takes a VARIANT parameter that will contain a SafeArray ofbytes.
More information
Exchanging data in this manner is useful for both raw data and as atechnique for passing data structures.

WARNING: Passing data structures in this manner can pose problems if itcontains 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				
For more information, please see the following articles in the MicrosoftKnowledge Base:
122287Limits of VB 3.0 & Disptest as Automation Controllers

131046SAMPLE: BINARY: Transfer Binary Data Using OLE Automation

131086SAMPLE: SAFEARAY: Use of Safe Arrays in Automation

140202SAMPLE: MFCARRAY: Using Safe Arrays in MFC Automation

122289Passing Structures in OLE Automation
Microsoft Systems Journal, June 1996, "Q&A OLE" by Don Box.
2.00 2.10 2.20 4.00 4.10 4.20 kbinf array Visual Basic 4.00 binary data byte

Article ID: 154172 - Last Review: 10/26/2013 06:10:00 - Revision: 3.0

Microsoft Visual C++ 2.0 Professional Edition, Microsoft Visual C++ 4.2 Enterprise Edition

  • kbnosurvey kbarchive kbctrl KB154172