手工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;
}