科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件COM接口在不同线程中的传递技巧两则

COM接口在不同线程中的传递技巧两则

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在多线程程序中使用COM对象真是件令人头疼的事情。当你能够访问一个接口指针的时候,并不意味着你可以调用接口上的方法。

作者:激烈振动 来源:博客园 2007年10月19日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
用窗口消息解决COM接口的多线程访问问题

  但有时候我们不能直接访问接口指针,而是通过一个封装类间接的访问。比如:

class SomeClass
{
 private:
  IMyInterface *m_pInt;
 public:
  void Method1()
  {
   //Init m_pInt
  }
  void Method2()
  {
   //call method of m_pInt
  }
}

  我们只能访问SomeClass的公共方法,而无法直接访问接口指针,这时就不能使用使用全局接口表的方法。如果需要在不同线程中调用SomeClass的方法,唯一的办法就是把所有的调用放在一个线程中。怎么做到这一点呢?用一个消息窗口来同步是一个简单的方法。

  首先定义一个窗口类,把所有对SomeClass的操作定义成窗口消息,如下:

#define WM_METHOD1 WM_USER + 100
#define WM_METHOD2 WM_USER + 101

class CThreadWnd : public CWindowImpl<CThreadWnd>
{
 private:
  SomeClass m_someClass;
 public:
  BEGIN_MSG_MAP(CThreadWnd)
   MESSAGE_HANDLER(WM_METHOD1, OnMethod1)
   MESSAGE_HANDLER(WM_METHOD2, OnMethod2)
  END_MSG_MAP()


  LRESULT OnMethod1(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
  LRESULT OnMethod2(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
}

  在OnMethod1和OnMethod2中完成对m_someClass的方法调用,如果方法有参数,通过wParam和lParam传递。

  然后,我们需要做的是在一个线程中创建这个窗口。并在需要调用SomeClass的方法时,通过向CThreadWnd窗口发送消息间接完成。例如:

CThreadWnd wndThread;

//In thread A
wndThread.SendMessage(WM_METHOD1);

//In thread B
wndThread.SendMessage(WM_METHOD2);

  至于wndThread,可以保存在任何地方。而创建线程窗口的线程函数代码基本上应该是这样的:

UINT WINAPI ThreadProc(LPVOID lpParam)
{
 ::CoInitialize(0);

 CThreadWnd *pWnd = (CThreadWnd*)lpParam;

 CMessageLoop theLoop;
 _Module.AddMessageLoop(&theLoop);

 pWnd->Create(NULL, CRect(0, 0, 0, 0), NULL, WS_POPUP);
 
 theLoop.Run();

 pWnd->DestroyWindow();

 _Module.RemoveMessageLoop();
 
 ::CoUninitialize();

 return 0;
}

  创建线程的代码就不贴了,销毁线程则只要向线程窗口发送WM_QUIT消息即可。这个方法在实际应用中个人感觉非常有效。

  有一个问题是当方法参数比较多时,很难通过wParam和lParam传递。这就需要另外定义一个结构,存放各种参数,然后通过wParam传递结构的地址。总之人是活的,灵活运用。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章