Всем привет, у одного из драйверов есть COM оболочка , на которой все написано, частью методов пользовались частью нет, и вот понадобилось воспользоваться методом который возвращает SAFEARRAY и возникла проблема.
Изначально студия сгенерировала MFC оболочку на основе COleDispatchDriver выглядит примерно так:
class CFptr : public COleDispatchDriver
{
public:
CFptr() {} // Calls COleDispatchDriver default constructor
CFptr(LPDISPATCH pDispatch) : COleDispatchDriver(pDispatch) {}
CFptr(const CFptr& dispatchSrc) : COleDispatchDriver(dispatchSrc) {}
...
CString getParamStr(long paramId) {
CString result;
static BYTE parms[] = VTS_I4;
InvokeHelper(0x18, DISPATCH_METHOD, VT_BSTR, (void*)&result, parms, paramId);
return result;
}
SAFEARRAY * getParamByteArray(long paramId)
{
static BYTE parms[] = VTS_I4;
InvokeHelper(0x1a, DISPATCH_METHOD, VT_EMPTY, nullptr, parms, paramId);
}
Сам студийный генератор в оболочку сгенерировал ошибку в методе getParamByteArray. Вообще с SAFEARRAY я работал раньше, но не через InvokeHelper, тут я перепробовал различные варианты, но результат один исключение во время вызова.Пробовал написать вот таким образом, но результат тот же, исключение:
SAFEARRAY * getParamByteArray(long paramId) {
CComSafeArray<BYTE> arr(1024);
static BYTE parms[] = VTS_PI4;
InvokeHelper(0x1a, DISPATCH_METHOD, VT_ARRAY, (void*)&arr, parms, paramId);
return arr.Detach();
}
С помощью OleView создал idl-file этого COM, этот метод выглядит вот таким образом:
[id(0x0000001a)]
HRESULT getParamByteArray(
[in] long paramId,
[out, retval] SAFEARRAY(unsigned char)* value)
Подскажите кто в курсе как получить SAFEARRAY c помощью InvokeHelper?