首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MFC OCX 方法參數傳遞二進制陣列:使用 VARIANT 與 SAFEARRAY

     編輯:程式設計綜合問答

DISP_FUNCTION 定義


// .idl / .odl
[id(1), helpstring("傳送二進制資料")]
void SendBinary([in] SAFEARRAY(unsigned char) data);

C++ 實作


void CMyCtrl::SendBinary(const VARIANT& data) {
    if (data.vt != (VT_ARRAY | VT_UI1)) return; // 型別檢查
    SAFEARRAY* psa = data.parray;
    long lbound, ubound;
    SafeArrayGetLBound(psa, 1, &lbound);
    SafeArrayGetUBound(psa, 1, &ubound);
    long count = ubound - lbound + 1;

    BYTE* pData;
    SafeArrayAccessData(psa, (void**)&pData);
    // 使用 pData[0..count-1]
    SafeArrayUnaccessData(psa);
}

呼叫端


SAFEARRAYBOUND bound = { len, 0 };
SAFEARRAY* psa = SafeArrayCreate(VT_UI1, 1, &bound);
BYTE* p;
SafeArrayAccessData(psa, (void**)&p);
memcpy(p, buffer, len);
SafeArrayUnaccessData(psa);

VARIANT var; VariantInit(&var);
var.vt = VT_ARRAY | VT_UI1;
var.parray = psa;
ctrl.SendBinary(var);
VariantClear(&var); // 釋放 SAFEARRAY

注意

  • 跨進程/跨機器需使用標準封送,SAFEARRAY 支援標準封送。
  • 若為 In-Process(同一 EXE),直接傳遞指標(VT_BYREF|VT_UI1)效能更高,但需自行管理生命週期。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved