读书人

手工Marshal不成功,函数调用hang住了.

发布时间: 2013-10-29 12:07:57 作者: rapoo

手工Marshal不成功,函数调用hang住了.请帮我看看.
我做了一个实验,试验结果和预期稍有出入。
我用VC2012建立一个ATL的工程,是exe的,保留了PS的工程。
增加一个Custom类型的组件(选择支持oleautomation),名字叫做My1。为其添加一个函数Add:


[
object,
uuid(D891D179-6232-4D40-BFD6-7647AC44E47D),
oleautomation,
nonextensible,
pointer_default(unique)
]
interface IMy1 : IUnknown{
[id(1)] HRESULT Add([in] LONG n1, [in] LONG n2, [out,retval] LONG* pVal);
};

然后我再写一个客户端,客户端里面有两个线程,主线程负责创建组件,子线程调用。

IStream* pStm;
DWORD WINAPI f(void*)
{
CoInitialize(NULL);
IMy1Ptr pGet;
HRESULT hr=CoGetInterfaceAndReleaseStream(pStm,IID_IMy1,(LPVOID*)&pGet);
assert(SUCCEEDED(hr));
cout<<pGet->Add(44,29)<<endl;//这一句hang住了,没有调用的响应,debug跟不进去
CoUninitialize();
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL);
IMy1Ptr ptr(CLSID_My1,NULL,CLSCTX_ALL);
assert(ptr);
HRESULT hr = CoMarshalInterThreadInterfaceInStream(IID_IMy1,ptr,&pStm);
assert(SUCCEEDED(hr));
HANDLE hThread=CreateThread(NULL,0,f,NULL,0,NULL);
WaitForSingleObject(hThread,INFINITE);
ptr.Release();
CoUninitialize();
return 0;
}

为什么在子线程里面调用其Add函数会hang住呢?如果创建和调用的代码都在main里面,那么Add函数调用没有问题,打印73

这是什么原因?
[解决办法]
什么叫hang住了? 使用 CoInitializeEx
[解决办法]
1. CoInitialize只需要调用1次。
2、CoInitialize创建的存在类似于需要像消息一样的排队,猜测可能是这个原因,因此让你使用多线程创建。
[解决办法]
引用:
Quote: 引用:

1. CoInitialize只需要调用1次。
2、CoInitialize创建的存在类似于需要像消息一样的排队,猜测可能是这个原因,因此让你使用多线程创建。


1: 每个线程都需要CoInitialize呀
2. 这个我知道。

我的问题是,为什么我的子线程挂起了?

所以让你用CoInitializeEx试试啊,他原生态支持多线程啊,看看调用它会不会挂起
[解决办法]
CoInitializeEx只调用一次,声明个局部变量储存pGet->Add(44,29)的返回以确认问题一定是由add阻塞引起的

读书人网 >VC/MFC

热点推荐