Help and Support

How To Pass Binary Data Between an ActiveX Control and VB

Article ID:154172
Last Review:December 2, 2003
Revision:2.0
This article was previously published under Q154172
On This Page

SUMMARY

This 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.

Back to the top

MORE INFORMATION

Exchanging 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.

Back to the top

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
				

Back to the top

REFERENCES

For more information, please see the following articles in the Microsoft Knowledge Base:
122287 (http://support.microsoft.com/kb/122287/EN-US/) Limits of VB 3.0 & Disptest as Automation Controllers

131046 (http://support.microsoft.com/kb/131046/EN-US/) SAMPLE: BINARY: Transfer Binary Data Using OLE Automation

131086 (http://support.microsoft.com/kb/131086/EN-US/) SAMPLE: SAFEARAY: Use of Safe Arrays in Automation

140202 (http://support.microsoft.com/kb/140202/EN-US/) SAMPLE: MFCARRAY: Using Safe Arrays in MFC Automation

122289 (http://support.microsoft.com/kb/122289/EN-US/) Passing Structures in OLE Automation
Microsoft Systems Journal, June 1996, "Q&A OLE" by Don Box.

Back to the top


APPLIES TO
Microsoft Visual C++ 2.0 Professional Edition
Microsoft Visual C++ 2.1
Microsoft Visual C++ 2.2
Microsoft Visual C++ 4.0 Standard Edition
Microsoft Visual C++ 4.1 Subscription
Microsoft Visual C++ 4.2 Enterprise Edition
Microsoft Visual C++ 4.2 Professional Edition

Back to the top

Keywords: 
kbctrl KB154172

Back to the top

Article Translations

 

Other Support Options

  • Need More Help?
    Contact a Support professional by Email, Online or Phone.
  • Customer Service
    For non-technical assistance with product purchases, subscriptions, online services, events, training courses, corporate sales, piracy issues, and more.
  • Newsgroups
    Pose a question to other users. Discussion groups and Forums about specific Microsoft products, technologies, and services.