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