gpt4 book ai didi

c++ - IDispatch::调用返回 E_INVALIDARG

转载 作者:行者123 更新时间:2023-11-28 06:48:25 27 4
gpt4 key购买 nike

我有一个 ATL COM 组件,它引发一些由托管(C# 和 VB.NET)代码处理的事件。该组件当前由 VS2005 VB.NET 项目(作为 ActiveX 控件)使用,并且引发了所有事件并且一切正常。

但是,在将一些代码移植到 C# 时,我注意到除了一个事件之外,其他所有事件都没有引发。引发的唯一事件不将任何参数传递回处理程序。所有其他人都这样做。

// this function is auto-generated
HRESULT Fire_SomeEvent(VARIANT_BOOL inOriginated, IUserType * inUserType)
{
CComVariant varResult;
T* pT = static_cast<T*>(this);
int nConnectionIndex;
CComVariant* pvars = new CComVariant[2];
int nConnections = m_vec.GetSize();

for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++)
{
pT->Lock();
CComPtr<IUnknown> sp = m_vec.GetAt(nConnectionIndex);
pT->Unlock();
IDispatch* pDispatch = reinterpret_cast<IDispatch*>(sp.p);
if (pDispatch != NULL)
{
VariantClear(&varResult);
pvars[1] = inOriginated;
pvars[0] = inUserType;

DISPPARAMS disp = { pvars, NULL, 2, 0 };
pDispatch->Invoke(0x7, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL);
}
}

delete[] pvars;
return varResult.scode;
}

Invoke 正在返回 0x80070057 (E_INVALIDARG)。然而,在 VB 领域,当通过 ActiveX 包装器使用时,它可以工作。现在,我无论如何都不是 COM 向导,而且我只是不明白。我无法在任何地方找到任何适用的内容。

我认为这可能与传递 UDT 有关,但没有;几乎相同的版本,IUserType 替换为 LONG 也返回 E_INVALIDARG。同样,不传递参数的单个事件有效。

托管代码如何使用它的简短示例。这里没有什么疯狂的。

class Program
{
private ComType _c;

static void Main(string[] args)
{
_c = new ComType();
_c.SomeEvent += _c_SomeEvent;
_c.DoSomethingWhichRaisesSomeEvent();
}

static void _c_SomeEvent(bool b, IUserType udt)
{
// never called
}
}

我通常会先花更多时间进行调试,然后才能联系到这里,但我必须尽快打电话到这里。我要么必须解决这个问题,要么放弃这个界面并使用另一个界面(这对我的目的来说是次优的)。所以,希望你们中的一些 COM 专家以前遇到过这个问题。

最佳答案

仔细检查您的 dispparam 变体中的 vt 值;许多 IDispatch 实现都非常注重将所有内容对齐。

关于c++ - IDispatch::调用返回 E_INVALIDARG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24502457/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com