• 使用COM提供SafeArray数据


        在前一篇博文《读取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;
    }



  • 相关阅读:
    2020 商业计划书
    LBDP数据采集网关的设计要求
    Net学习日记_ASP.Net_Ajax
    Net学习日记_ASP.Net_WebForm_笔记
    Net学习日记_ASP.Net_WebForm
    Net学习日记_ASP.Net_一般处理程序_笔记
    Net学习日记_ASP.Net_一般处理程序
    Net学习日记_聊天室(基于Socket,Thread)_服务器软件
    Net学习日记_聊天室(基于Socket,Thread)
    Net学习日记_泛型与反射_笔记
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5164459.html
Copyright © 2020-2023  润新知