首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

手工Marshal不成功,函数调用hang住了.请帮小弟我看看

2013-10-29 
手工Marshal不成功,函数调用hang住了.请帮我看看.我做了一个实验,试验结果和预期稍有出入。 我用VC2012建立

手工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阻塞引起的

热点排行