在前一篇博文《读取SafeArray数据》我们介绍了C#读取安全数组。那么我们的COM怎么编写呢?
1. 定义SAFEARRAY变量
SAFEARRAY *pSArray = NULL;
2. 释放此变量
SafeArrayDestroy(pSArray);
3. 建立向量表
pSArray = SafeArrayCreateVector(VT_UI1, 0, 32);
向量变量(VT_UI1)的定义:MSDN
- VT_EMPTY
-
Variable type is not specified.
- VT_NULL
-
Variable type is NULL.
- VT_I2
-
Variable type is 2-byte signed INT.
- VT_I4
-
Variable type is 4-byte signed INT.
- VT_R4
-
Variable type is 4-byte real.
- VT_R8
-
Variable type is 8-byte real.
- VT_CY
-
Variable type is currency.
- VT_DATE
-
Variable type is date.
- VT_BSTR
-
Variable type is binary string.
- VT_DISPATCH
-
Variable type is IDispatch FAR*.
- VT_ERROR
-
Variable type is SCODE.
- VT_BOOL
-
Variable type is Boolean; True=-1, False=0.
- VT_VARIANT
-
Variable type is VARIANT FAR*.
- VT_UNKNOWN
-
Variable type is IUnknown FAR*.
- VT_UI1
-
Variable type is unsigned char.
- VT_RESERVED
-
This element is reserved.
- VT_BYREF
-
Variable type is a pointer to data.
- VT_ARRAY
-
Variable type is a safe array.
4. 写入数据
SafeArrayPutElement(pSArray, &l, &inqReport[l]);
实例程序(COM方法):
AA:屏蔽的数值
STDMETHODIMP CRepoFmt::getInqRepo(ULONG iStation, SAFEARRAY** ret) { SAFEARRAY *pSArray = NULL; unsigned char inqReport[32]; unsigned char xorByte = AA; int iStationID = 0; if (iStation < 1) iStationID = 1; else iStationID = iStation; inqReport[0] = AA; inqReport[1] = AA; inqReport[2] = AA; inqReport[3] = AA; inqReport[4] = (iStationID % AA); inqReport[5] = (iStationID / AA); inqReport[6] = AA; inqReport[7] = AA; inqReport[8] = AA; inqReport[9] = AA; inqReport[10] = AA; inqReport[11] = AA; for (int i = 1; i < 18; i++) xorByte ^= inqReport[i]; inqReport[18] = xorByte; // Fill the inqReport etc. for (int j = 12; j < 18; j++) inqReport[j] = 0; for (int k = 19; k < 32; k++) inqReport[k] = 0; if (!ret) return E_POINTER; if (*ret) { SafeArrayDestroy(pSArray); *ret = NULL; } pSArray = SafeArrayCreateVector(VT_UI1, 0, 32); for (long l = 0; l < 32; l++) SafeArrayPutElement(pSArray, &l, &inqReport[l]); *ret = pSArray; return S_OK; }