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)效能更高,但需自行管理生命週期。