实在没法再开一贴,很急的啊。求救!!!

xin_zzq1 2009-03-19 03:54:30
问题如下:
我用个线程去执行操作时,第一次能够线程执行成功,但第2次继续执行到:hr = mpIRapiDesktop->EnumDevices(&mpIRapiEnumDevices);hr得到的值是E_INVALIDARG,如果关掉程序重新执行也是只能执行一次。
部分代码如下:



HRESULT hr = S_OK;
clearSession();
addNewInfo(_T("Try to connect a device....."));
CoInitialize(NULL);
// Create an instance of the IRAPIDesktop interface.
hr = CoCreateInstance(CLSID_RAPI,
NULL,
CLSCTX_INPROC_SERVER,
IID_IRAPIDesktop,
(void**)&mpIRapiDesktop);

if (hr ==0 && mpIRapiDesktop)
{
addNewInfo(_T("CoCreateInstance success"));
}else{
addNewInfo(_T("CoCreateInstance failure"));
return false;
}

// Call EnumDevices to obtain an enumeration of connected devices.
hr = mpIRapiDesktop->EnumDevices(&mpIRapiEnumDevices);

线程代码:

UINT CCESyncDlg::ThreadProc(LPVOID param) //线程函数
{
//数据库的初始化
DBConnectionFactory* pFactory =NULL;
try
{
pFactory=DBConnectionFactory::getIntance();
pFactory->initPool();
}
catch(DatabaseException e)
{
TRACE(e.what());
}
CCESyncDlg* pThread=(CCESyncDlg*)param;
pThread->SyncFun();//实现部分
Sleep(1000);
DBConnectionFactory::releaseInstance();
AfxEndThread(RetThread);
return RetThread;
}

void CCESyncDlg::OnBnClickedSync()
{
// TODO: 在此添加控件通知处理程序代码
ExitCode=0;
m_iThread=AfxBeginThread(ThreadProc,(LPVOID)this);
GetDlgItem(IDC_STOP)->EnableWindow(true);
return ;

}


...全文
112 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
csbinchina 2009-03-20
  • 打赏
  • 举报
回复
jf
xin_zzq1 2009-03-20
  • 打赏
  • 举报
回复
谢谢各位大虾!中午2个贴一起结了
fandh 2009-03-20
  • 打赏
  • 举报
回复
已经发了!
y0355017 2009-03-19
  • 打赏
  • 举报
回复
up
  • 打赏
  • 举报
回复
你搜索列集,很多先成的例子
oyljerry 2009-03-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xin_zzq1 的回复:]
我的多线程应该怎么样进行处理
[/Quote]
你是多线程调用这个com接口,需要做列集等,做marshal

#include "stdafx.h"
#include "crtdbg.h"
#include "windows.h"

#pragma comment(lib, "ole32.lib")

LPSTREAM g_pMarshaledInterfaceStream;

DWORD WINAPI ClientThreadProc(LPVOID lpParam)
{
HRESULT hr;
LPUNKNOWN pUnk;

::OleInitialize( 0 );

// unmarshal interface to create proxy/stub pair
hr = ::CoUnmarshalInterface(g_pMarshaledInterfaceStream, IID_IUnknown, (void**)&pUnk);
_ASSERTE( SUCCEEDED(hr) );
//
// use this interface proxy to manipulate the word document
//
LPOLEOBJECT pOleObject;
hr = pUnk->QueryInterface(IID_IOleObject, (void**)&pOleObject);
_ASSERTE( SUCCEEDED(hr) );

// release interface after use
pOleObject->Release();
pUnk->Release();

::OleUninitialize();

return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
// get word document CLSID
CLSID clsidWord;
::CLSIDFromProgID(OLESTR("Word.Document"), &clsidWord);

::OleInitialize( 0 );

HRESULT hr;

// start winword server
LPUNKNOWN pUnk;
hr = ::CoCreateInstance(clsidWord, NULL, CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pUnk);
if( SUCCEEDED(hr) )
{
// marshal interface between threads
hr = ::CoMarshalInterThreadInterfaceInStream(IID_IUnknown, pUnk, &g_pMarshaledInterfaceStream);
_ASSERTE( SUCCEEDED(hr) );

// create a client thread;
// we don't need the CRT runtime, so use CreateThread() directly
HANDLE hClientThread;
hClientThread = ::CreateThread(NULL, 0, ClientThreadProc, NULL, 0, NULL);
// wait client thread to end
::WaitForSingleObject(hClientThread, INFINITE);

// release resources
pUnk->Release();
g_pMarshaledInterfaceStream->Release();
}

::OleUninitialize();

return 0;
}
xin_zzq1 2009-03-19
  • 打赏
  • 举报
回复
我的多线程应该怎么样进行处理
xin_zzq1 2009-03-19
  • 打赏
  • 举报
回复
zzq_zhou@163.com
fandh 2009-03-19
  • 打赏
  • 举报
回复
楼主给我一个MAIL,我给你发多线程的例子!
应该是你多线程没有处理好!
xin_zzq1 2009-03-19
  • 打赏
  • 举报
回复
本人菜鸟!多线程列集不会啊··有没例子
  • 打赏
  • 举报
回复
多线程,这个得 列集

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧