在一个视图类中加载一个COM组件对象,在把COM对象传递到一个新线程中使用.出现异常.
实例代码如下:
TestView.h文件如下:public TestView
{
public:
TestView();
~TestView();
COM_OBJ m_Comobj; /*组件对象*/
void StartThread(void); /*执行线程函数*/
static UINT WINAPI CMapxMulitThreadView::ThreadFunc(LPVOID lpParam); /*线程函数*/
}TestView.cpp文件如下:
TestView::TestView()
{
::CoInitializeEx(0,COINIT_MULTITHREADED); /*多线程使用COM组件*/
}
TestView::~TestView()
{
::CoUninitialize(); /*释放组件*/
}void TestView::StartThread(void)
{
UINT threadID = 0;
HANDLE hThreads = (HANDLE)_beginthreadex(NULL,0,CMapxMulitThreadView::ThreadFunc,this,0,&threadID); /*执行该线程,传递this进线程*/
} UINT WINAPI TestView::ThreadFunc(LPVOID lpParam) /*线程函数*/
{ ::CoInitializeEx(NULL,COINIT_MULTITHREADED); /*多线程调用*/
TestView* tview = (TestView*)lpParam; COleVariant vtPoints;
vtPoints.vt = VT_DISPATCH;
vtPoints.pdispVal = points.m_lpDispatch;
vtPoints.pdispVal->AddRef();
tview->Comobj.GetFeatureFactory().CreateLine(vtPoints); /*调用组件接口,但是出现一个异常*/
::CoUninitialize();
}异常出现在CreateLine函数中:
它的实现代码如下 :
COM_OBJ COM_OBJ::CreateLine(const VARIANT& Points, const VARIANT& Style)
{
LPDISPATCH result;
static BYTE parms[] =
VTS_VARIANT VTS_VARIANT;
InvokeHelper(0x7, DISPATCH_METHOD, VT_DISPATCH, (void*)&result, parms,
&Points, &Style);
return CMapXFeature(result);
}
继续跟踪下去:出错函数为:InvokeHelper()
在InvokeHelper()找到出错代码片段:
void COleDispatchDriver::InvokeHelperV(...)
{
if (FAILED(sc))
{
THROW(pException); /*错误是在这里抛出的*/
}
}多线程使用COM组件,这个错误是怎么产生的.大家帮忙分析分析,谢谢.
实例代码如下:
TestView.h文件如下:public TestView
{
public:
TestView();
~TestView();
COM_OBJ m_Comobj; /*组件对象*/
void StartThread(void); /*执行线程函数*/
static UINT WINAPI CMapxMulitThreadView::ThreadFunc(LPVOID lpParam); /*线程函数*/
}TestView.cpp文件如下:
TestView::TestView()
{
::CoInitializeEx(0,COINIT_MULTITHREADED); /*多线程使用COM组件*/
}
TestView::~TestView()
{
::CoUninitialize(); /*释放组件*/
}void TestView::StartThread(void)
{
UINT threadID = 0;
HANDLE hThreads = (HANDLE)_beginthreadex(NULL,0,CMapxMulitThreadView::ThreadFunc,this,0,&threadID); /*执行该线程,传递this进线程*/
} UINT WINAPI TestView::ThreadFunc(LPVOID lpParam) /*线程函数*/
{ ::CoInitializeEx(NULL,COINIT_MULTITHREADED); /*多线程调用*/
TestView* tview = (TestView*)lpParam; COleVariant vtPoints;
vtPoints.vt = VT_DISPATCH;
vtPoints.pdispVal = points.m_lpDispatch;
vtPoints.pdispVal->AddRef();
tview->Comobj.GetFeatureFactory().CreateLine(vtPoints); /*调用组件接口,但是出现一个异常*/
::CoUninitialize();
}异常出现在CreateLine函数中:
它的实现代码如下 :
COM_OBJ COM_OBJ::CreateLine(const VARIANT& Points, const VARIANT& Style)
{
LPDISPATCH result;
static BYTE parms[] =
VTS_VARIANT VTS_VARIANT;
InvokeHelper(0x7, DISPATCH_METHOD, VT_DISPATCH, (void*)&result, parms,
&Points, &Style);
return CMapXFeature(result);
}
继续跟踪下去:出错函数为:InvokeHelper()
在InvokeHelper()找到出错代码片段:
void COleDispatchDriver::InvokeHelperV(...)
{
if (FAILED(sc))
{
THROW(pException); /*错误是在这里抛出的*/
}
}多线程使用COM组件,这个错误是怎么产生的.大家帮忙分析分析,谢谢.
一个com接口的封装类吗?
UINT WINAPI TestView::ThreadFunc(LPVOID lpParam) /*线程函数*/
{ ::CoInitializeEx(NULL,COINIT_MULTITHREADED); /*多线程调用*/
TestView* tview = (TestView*)lpParam;
CMapXPoints points; /*COM组件导出对象*/
points.CreateDispatch(points.GetClsid()); /*创建对象,把这个对象传递给CreateLine出错*/
COleVariant vtPoints;
vtPoints.vt = VT_DISPATCH;
vtPoints.pdispVal = points.m_lpDispatch;
vtPoints.pdispVal->AddRef();
tview->Comobj.GetFeatureFactory().CreateLine(vtPoints);
::CoUninitialize();
} 但是如过我们改成:
把
CMapXPoints m_points; /*设置成类属性*/
在这构造函数中创建:
TestView::TestView()
{
m_Points.CreateDispatch(m_Points.GetClsid());
} 在在线程函数中传递给CreateLine就不会出现异常:
例如:
CMapXPoints points = (tview.m_Points);
COleVariant vtPoints;
vtPoints.vt = VT_DISPATCH;
vtPoints.pdispVal = points->m_lpDispatch;
vtPoints.pdispVal->AddRef();
tview->Comobj.GetFeatureFactory().CreateLine(vtPoints); 这样就没问题了,为什么会这样呢????
一个com接口的封装类吗?
就是一个从COM组件导出的类.
{
m_Points.CreateDispatch(m_Points.GetClsid());
} 加了这段代码后,在TestView对象构造时是就启动了com,所以不会出错
什么意思啊,我用vs2003把COM组件里面的类导入到工程里面就可以用了?你们说的COM组件启动是什么意思.