關於套間的第二個程序,疑問多多

組件程序十分簡單,組件的線程模型爲STA,代碼如下:


STDMETHODIMP CTheMath::Add(long IOp1, long IOp2, long* plResult)
{
 *plResult = IOp1 + IOp2;
 printf("IOp1 + IOp2 = %d", *plResult);

 return S_OK;
}

調用組件的程序代碼如下:

// ATLSTLExe.cpp : 定義控制檯應用程序的入口點。
//

#include "stdafx.h"
#include <windows.h>
#include <commctrl.h>
#include <iostream>

#include "ATLSTATest.h"
#include "ATLSTATest_i.c"

using namespace  std;

int ExeProc(LPVOID p)
{
 CoInitializeEx(0, COINIT_MULTITHREADED);
 ITheMath *ptrMath;

 HRESULT hr = CoCreateInstance(CLSID_TheMath,
  NULL,
  CLSCTX_SERVER,
  IID_ITheMath,
  (void **)&ptrMath);

 if FAILED(hr)
 {
  cout<<"Get ptrMath error!"<<endl;
  CoUninitialize();
  return -1;
 }

 cout<<"Now Begin to create file!"<<endl;

 long* plresult;
 ptrMath->Add(100, 200, plresult);
 cout<<"100+200 = "<<*plresult<<endl;
 ptrMath->Release();
 CoUninitialize();
 return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
 int i;
 i = 0;
 HANDLE hr;
 DWORD ThreadID;

 hr = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ExeProc, (LPVOID)&i, 0, &ThreadID);

  if (hr)
    CloseHandle(hr);

 MSG msg;
 while (GetMessage(&msg, NULL, 0, 0))
 {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 }

 return 0;
}

當上述代碼中紅色部分改爲:

CoInitializeEx(0, COINIT_APARTMENTTHREADED);  //STA

程序提示如下調試信息:

加載模塊: ATLSTLExe.exe
加載模塊: ole32.dll
加載模塊: coredll.dll
Get ptrMath error!
線程 'ExeProc' (0xe7a47242) 已退出,返回值爲 -1 (0xffffffff)。

當代碼不變的時候,com爲組件創建一個STA套間,調用組件的程序中創建的線程運行在MTA套間中,對於跨套間的調用,com自動列集接口,實現同步,調試信息如下:

加載模塊: ATLSTLExe.exe
加載模塊: ole32.dll
加載模塊: coredll.dll
加載模塊: oleaut32.dll
加載模塊: atlstatest.dll
Now Begin to create file!
IOp1 + IOp2 = 300100+200 = 300
卸載模塊: atlstatest.dll
卸載模塊: oleaut32.dll
線程 'ExeProc' (0x87a1e95a) 已退出,返回值爲 0 (0x0)。

以上輸出表明程序運行正常,哪位網友能說說原因?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章