进行异步调用 - 我必须创建自己的p/s吗?
Making an async COM call -- do I have to create my own P/S?
我在类型库中定义了一个自定义接口,并在我的代码中实现。我没有创建自己的代理/存根。在我的情况下,我已经成功地将从主线程(STA)的接口指针填充到了背景线程(STA)。
。从该背景线程中,我想对UI线程上的对象进行异步调用。我尚未在对象中实现icallFactory。我看到标准代理确实确实实现了ICAllFactory(即,我可以在ICAllFactory的背景线程上成功使用Qi)。但是我的自定义界面的CreateCall因HRESULT 0x80040150失败(无法从注册表中读取密钥)。
我需要创建自己的代理,以明确实现icallFactory以做到这一点?
这是我的idl:
[
object,
uuid(92303FE7-A79D-47DD-923F-62062105C00E),
async_uuid(2880C40C-9965-4544-AE39-DF08056E8CB6),
nonextensible,
pointer_default(unique),
oleautomation
]
interface IFoo: IUnknown
{
HRESULT Foo([in] long a, [in] long b);
}
[
uuid(D58B0A31-A2D5-4BFB-8702-3B710320493B)
]
coclass Foo
{
[default] interface IFoo;
};
这是我的单元测试中的背景线程:
static DWORD WINAPI threadproc(LPVOID lpParameter)
{
// get arguments
DWORD cookie = *(DWORD*)lpParameter;
// initialize COM
Assert::AreEqual(S_OK, CoInitializeEx(NULL, COINIT_APARTMENTTHREADED));
{
// get global interface table
IGlobalInterfaceTablePtr globalInterfaceTable;
Assert::AreEqual(S_OK, globalInterfaceTable.CreateInstance(CLSID_StdGlobalInterfaceTable));
// get object
MyLib::IFooPtr object;
Assert::AreEqual(S_OK, globalInterfaceTable->GetInterfaceFromGlobal(cookie, MyLib::IID_IFoo, (LPVOID*)&object));
// get async call factory
ICallFactoryPtr callFactory;
Assert::AreEqual(S_OK, object->QueryInterface(&callFactory));
//
// Everything is fine up until the CreateCall call below,
// which fails with HRESULT 0x80040150
//
// create async call object
IUnknownPtr callObject;
Assert::AreEqual(S_OK, callFactory->CreateCall(MyLib::IID_AsyncIFoo, NULL, IID_IUnknown, &callObject));
}
// uninitialize COM
CoUninitialize();
// success
return 0;
}
,通用卫生员不与async com配合使用。您需要构建(中间生成的)代理(尽管IIRC,如果您要构建DLL,则可以合并存根)。
您还需要注册代理DLL(并使用-dregister_proxy_dll define构建它)。异步com需要定义更多的注册表键才能使其正常工作。
相关文章:
- 您应该在什么时候创建自己的异常类型
- 如何在C++中创建自己的循环版本?
- 如何在C++中创建自己的编译密钥
- 我正在尝试在视觉工作室上创建自己的库/源函数
- 创建自己的owner_ptr类;在传递堆栈或静态分配的地址时如何避免UB?
- C++ 在其自己的类中创建对象的修改副本
- 如何为C++映射创建自己的字符串比较对象
- (如何)在提升几何中创建自己的多边形类型并与之一起使用multi_polygon类型?
- 为什么要创建自己的自定义异常类
- 使用 const char * 与 char * 创建自己的字符串
- 使用 lambda 表达式创建线程时,如何为每个线程提供自己的 lambda 表达式副本
- 创建自己的线性过滤器
- 如果不在派生类实现中执行此操作,"basic_streambuf"是否会创建自己的获取/放置区域?
- 我创建了自己的智能指针类,我用这个智能指针指向一个类实例,如何正确返回智能指针
- 在 C++ 中创建自己的错误处理机制
- 如何使用新字符串而不是分配器创建自己的字符串类型向量?
- 在C++中创建自己的运算符**?
- Windows:创建自己的杀死程序
- 创建自己的异常(2种方法)C
- 是否可以创建自己的QT注释