亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? apart.cpp

?? COM技術內幕配書源碼
?? CPP
字號:
//
// Apart.cpp
//   - A simple C++ class, CSimpleApartment, encapsulates
//     creating a component on an apartment thread.
//
#include <windows.h>
#include <stdlib.h>
#include <objbase.h>
#include <assert.h>

#define __OUTPROC_SERVER_ // To get the proper definition of trace
#include "Util.h"
#undef __OUTPROC_SERVER_ 

#include "Apart.h"

static inline void trace(char* msg)
	{ Util::Trace("Apartment", msg, S_OK) ;} 
static inline void trace(char* msg, HRESULT hr)
	{ Util::Trace("Apartment", msg, hr) ;}

///////////////////////////////////////////////////////////
//
// Constructor
//
CSimpleApartment::CSimpleApartment() 
{
	m_ThreadId = 0 ;	
	m_hThread  = NULL ;
	m_hCreateComponentEvent = NULL ;
	m_hComponentReadyEvent = NULL ;
	m_pIStream = NULL ;
	m_hr = S_OK ;
	m_piid = NULL ;
	m_pclsid = NULL ;
	m_WaitTime = 500 ;
} 

///////////////////////////////////////////////////////////
//
// Destructor
//
CSimpleApartment::~CSimpleApartment()
{
	// The thread must be stopped before we are deleted
	// because the WorkerFunction is in the derived class.
	assert(m_hThread == NULL) ;
}

///////////////////////////////////////////////////////////
//
// StartThread
//   - Create and start the thread.
//
BOOL CSimpleApartment::StartThread(DWORD WaitTime) 
{
	if (IsThreadStarted())
	{
		return FALSE ;
	}

	// Create the thread.
	m_hThread = ::CreateThread(NULL,              // Default security
	                           0,                 // Default stack size
	                           RealThreadProc,
	                           (void*)this,
	                           CREATE_SUSPENDED,  // Create the thread suspended.
	                           &m_ThreadId) ;     // Get the Thread ID.
	if (m_hThread == NULL)
	{
		trace("StartThread failed to create thread.", GetLastError()) ; 
		return FALSE ;
	}
	trace("StartThread successfully created thread.") ;

	// Create an event to signal the thread to create the component. 
	m_hCreateComponentEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL) ;
	if (m_hCreateComponentEvent == NULL)
	{
		return FALSE ;
	}

	// Create an event for the thread to signal when it is finished. 
	m_hComponentReadyEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL) ;
	if (m_hComponentReadyEvent == NULL)
	{
		return FALSE ;
	}
	trace("StartThread successfully created the events.") ;

	// Initialize the wait time.
	m_WaitTime = WaitTime ;

	// Thread was created suspended; start the thread.
	DWORD r = ResumeThread(m_hThread) ;
	assert(r != 0xffffffff) ;

	// Wait for the thread to start up before we continue.
	WaitWithMessageLoop(m_hComponentReadyEvent) ;

	return TRUE ;
}


///////////////////////////////////////////////////////////
//
// Stop Thread
//
void CSimpleApartment::StopThread()
{
	if (m_hThread != NULL)
	{
		// Stop the thread.
		PostThreadMessage(m_ThreadId, WM_QUIT, 0,0) ;

		// Wait for thread to stop.
		WaitWithMessageLoop(m_hComponentReadyEvent) ;

		m_hThread = NULL ;
	}
}
	
///////////////////////////////////////////////////////////
//
// Current thread status
//
BOOL CSimpleApartment::IsThreadStarted()
{
	return (m_hThread != NULL) ;
}

///////////////////////////////////////////////////////////
//
// Thread procedure
//
DWORD WINAPI CSimpleApartment::RealThreadProc(void* pv) 
{
	CSimpleApartment* pApartment = reinterpret_cast<CSimpleApartment*>(pv) ;
	return pApartment->ClassThreadProc() ;
}

///////////////////////////////////////////////////////////
//
// Thread procedure
//
DWORD CSimpleApartment::ClassThreadProc()
{
	// Initialize the COM Library.
	HRESULT hr = CoInitialize(NULL) ;
	if (SUCCEEDED(hr))
	{
		// Signal that we are starting.
		SetEvent(m_hComponentReadyEvent) ;

		// Wait for the signal to create a component.
		BOOL bContinue = TRUE ;
		while (bContinue )
		{
			switch(::MsgWaitForMultipleObjects(
				       1,
				       &m_hCreateComponentEvent,
				       FALSE,
				       m_WaitTime,
				       QS_ALLINPUT))
			{
			// Create the component.
			case WAIT_OBJECT_0:
				CreateComponentOnThread() ;
				break ;

			// Process Windows messages.
			case (WAIT_OBJECT_0 + 1):
				MSG msg ;
				while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
				{
					if (msg.message == WM_QUIT)
					{
						bContinue = FALSE ;
						break ;
					}
					DispatchMessage(&msg) ;
				}
				break ;

			// Do background processing.
			case WAIT_TIMEOUT:
					WorkerFunction() ; 
					break ;

			default:
				trace("Wait failed.", GetLastError()) ; 
			}
		}
		// Uninitialize the COM Library.
		CoUninitialize() ;
	}

	// Signal that we have finished.
	SetEvent(m_hComponentReadyEvent) ;
	return 0 ;
}


///////////////////////////////////////////////////////////
//
// CreateComponent helper function
//
HRESULT CSimpleApartment::CreateComponent(const CLSID& clsid,
                                          const IID& iid,
                                          IUnknown** ppI)
{
	// Initialize the shared data.
	m_pIStream = NULL ;
	m_piid = &iid ;
	m_pclsid = &clsid ;

	// Signal the thread to create a component.
	SetEvent(m_hCreateComponentEvent) ;

	// Wait for the component to be created.
	trace("Wait for the component to be created.") ;
	if (WaitWithMessageLoop(m_hComponentReadyEvent))
	{
		trace("The wait succeeded.") ;

		if (FAILED(m_hr))        // Did GetClassFactory fail?
		{
			return m_hr ;
		}

		if (m_pIStream == NULL)  // Did the marshaling fail?
		{
			return E_FAIL ;
		}

		trace("Unmarshal the interface pointer.") ;
		// Unmarshal the interface.
		HRESULT hr = ::CoGetInterfaceAndReleaseStream(m_pIStream,
		                                              iid,
		                                              (void**)ppI) ;
		m_pIStream = NULL ;
		if (FAILED(hr))
		{
			trace("CoGetInterfaceAndReleaseStream failed.", hr) ; 
			return E_FAIL ;
		}
		return S_OK ;
	}
	trace("What happened here?") ;
	return E_FAIL ;
}

///////////////////////////////////////////////////////////
//
// CreateComponentOnThread helper function
//   - This function packages the parameters for the
//     CoCreateComponentOnThread function.
//
void CSimpleApartment::CreateComponentOnThread()
{
	IUnknown* pI = NULL ;
	// Call the derived class to actually create the component.
	m_hr = CreateComponentOnThread(*m_pclsid, *m_piid, &pI) ;
	if (SUCCEEDED(m_hr))
	{
		trace("Successfully created component.") ;
		// Marshal the interface pointer to the server.
		HRESULT hr = ::CoMarshalInterThreadInterfaceInStream(*m_piid,
		                                                     pI,
		                                                     &m_pIStream) ;
		assert(SUCCEEDED(hr)) ;

		// Release the pI Pointer.
		pI->Release() ;
	}
	else
	{
		trace("CreateComponentOnThread failed.", m_hr) ;
	}

	trace("Signal the main thread that the component is ready.") ;
	SetEvent(m_hComponentReadyEvent) ;
}

///////////////////////////////////////////////////////////
//
// BOOL WaitWithMessageLoop(HANDLE hEvent)
//
BOOL CSimpleApartment::WaitWithMessageLoop(HANDLE hEvent)
{
	while (TRUE)
	{
		// Wait for the event and for messages.
		DWORD dwReturn = ::MsgWaitForMultipleObjects(1,
		                                             &hEvent,
		                                             FALSE,
		                                             INFINITE,
		                                             QS_ALLINPUT) ;
		if (dwReturn == WAIT_OBJECT_0)
		{
			// Our event happened.
			return TRUE ;
		}
		else if (dwReturn == WAIT_OBJECT_0 + 1)
		{
			// Handle message to keep client alive.
			MSG msg ;
			while(::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
			{
				::DispatchMessage(&msg) ;
			}
		}
		else
		{
			trace("WaitWithMessageLoop failed.", GetLastError()) ; 
			return FALSE ;
		}
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
首页亚洲欧美制服丝腿| 大白屁股一区二区视频| 卡一卡二国产精品| 久久99国产精品尤物| 麻豆精品在线观看| 99久久夜色精品国产网站| 欧美久久久久免费| 亚洲人成网站在线| 中文字幕一区二区视频| 亚洲午夜三级在线| 99国内精品久久| 国产视频一区在线播放| 日本不卡视频一二三区| 成人白浆超碰人人人人| 亚洲精品一区二区三区福利 | 亚洲国产aⅴ天堂久久| 成人爽a毛片一区二区免费| 欧美区视频在线观看| 国产精品久久久久久久久免费丝袜 | 国产精品久久毛片av大全日韩| 日韩电影免费在线看| 91在线观看地址| 国产精品乱码人人做人人爱| 麻豆精品视频在线观看| 7777精品伊人久久久大香线蕉完整版 | 久久久亚洲精品一区二区三区| 日韩精品国产欧美| 337p亚洲精品色噜噜噜| 视频一区视频二区中文字幕| 欧美综合亚洲图片综合区| 亚洲精品国产一区二区精华液| a亚洲天堂av| 日韩精品1区2区3区| 精品视频999| 懂色中文一区二区在线播放| 亚洲精品欧美激情| 日韩欧美不卡一区| 日韩电影在线观看网站| 亚洲自拍欧美精品| 久久精品夜夜夜夜久久| 午夜视频在线观看一区| 在线观看欧美日本| 亚洲影视在线播放| 在线播放91灌醉迷j高跟美女| 中文字幕色av一区二区三区| 国产精品乡下勾搭老头1| www激情久久| 成人久久视频在线观看| 一区二区三区视频在线观看| 欧美亚洲日本国产| 99久久99久久免费精品蜜臀| 日韩精品一区第一页| 亚洲天堂a在线| 日韩欧美亚洲国产精品字幕久久久 | 国产传媒日韩欧美成人| 免费在线观看视频一区| 亚洲男人天堂一区| 中文无字幕一区二区三区| 欧美一级高清片在线观看| 色就色 综合激情| 精品亚洲国内自在自线福利| 欧美美女黄视频| 欧美视频一区二区三区四区| 日韩一区二区三免费高清| 国产免费久久精品| 国产精品成人免费精品自在线观看 | 国产精品一区久久久久| 美女视频一区在线观看| 国产综合色精品一区二区三区| 亚洲国产一二三| 婷婷六月综合网| 久久超碰97中文字幕| 精品一区二区三区影院在线午夜 | xnxx国产精品| 国产欧美综合在线观看第十页| 欧美日韩中文一区| 精品国产伦一区二区三区观看方式| 精品免费一区二区三区| 国产精品女主播在线观看| 亚洲三级在线免费观看| 亚洲成人777| 免费人成黄页网站在线一区二区| 另类小说视频一区二区| 成人网在线免费视频| 91丨九色丨尤物| 久久一二三国产| 亚洲精品五月天| 国产精品456| 日韩一级完整毛片| 亚洲高清一区二区三区| 不卡视频在线观看| 国产日韩欧美高清| 国v精品久久久网| 一区视频在线播放| av综合在线播放| 午夜视频在线观看一区二区| 成人黄色一级视频| 91精品国产综合久久精品麻豆| 久久久久久久电影| 天天爽夜夜爽夜夜爽精品视频| 成人性生交大合| 国产女主播视频一区二区| 日韩二区三区四区| 欧美日韩精品福利| 午夜视频久久久久久| 欧美日韩黄色一区二区| 亚洲一区二区三区四区在线免费观看 | 喷水一区二区三区| 欧美日韩大陆在线| 亚洲伦在线观看| hitomi一区二区三区精品| 国产精品久久久久久妇女6080| 91在线视频在线| 日韩电影在线观看电影| 精品国产91九色蝌蚪| 国产在线精品一区在线观看麻豆| 日韩视频在线观看一区二区| 国产一区二区三区在线观看免费视频| 精品免费国产一区二区三区四区| 精品亚洲aⅴ乱码一区二区三区| 欧美国产一区视频在线观看| 91国内精品野花午夜精品| 免费久久99精品国产| 亚洲欧洲日产国产综合网| 欧美剧情电影在线观看完整版免费励志电影| 日本欧美韩国一区三区| 亚洲欧洲av在线| 精品免费一区二区三区| 欧美日韩黄视频| 日本精品裸体写真集在线观看 | 一区二区三区日本| 久久久精品免费免费| 欧美精品久久天天躁| 99久久久久久| 丁香婷婷深情五月亚洲| 久久99热这里只有精品| 性欧美疯狂xxxxbbbb| 亚洲欧美另类图片小说| 国产精品久久久久久久午夜片| 久久综合色8888| 精品久久久久一区二区国产| 9191久久久久久久久久久| 欧美日韩国产小视频| 欧美日韩一区二区三区不卡| 91福利视频久久久久| 97se亚洲国产综合自在线观| 成人av资源网站| 色综合天天综合给合国产| 成人激情开心网| 欧美精品777| 一本久久a久久免费精品不卡| 91视频在线看| 欧美日韩精品高清| 日韩精品一区二区三区视频| 精品国产三级电影在线观看| 久久久欧美精品sm网站| 中文字幕国产一区| 一区二区三区欧美激情| 日韩高清一区在线| 高清在线观看日韩| 欧美日高清视频| 国产精品天美传媒| 亚洲va国产va欧美va观看| 久久福利资源站| 91福利在线看| 国产精品卡一卡二卡三| 日韩成人av影视| 色综合久久久久综合99| 精品国产污污免费网站入口| 亚洲男人天堂av网| 成人av网站免费| 中文字幕av一区二区三区| 日韩激情视频在线观看| 色呦呦日韩精品| 国产午夜精品一区二区| 青椒成人免费视频| 91精品国产综合久久精品图片| 亚洲永久免费av| 欧美三级视频在线观看| 国产精品不卡一区二区三区| 国产精品自拍三区| 久久精品亚洲精品国产欧美| 久久se精品一区精品二区| 欧美本精品男人aⅴ天堂| 国产精品影视网| 国产精品免费av| 欧美调教femdomvk| 奇米综合一区二区三区精品视频| 欧美午夜精品电影| 日本免费新一区视频| 久久久国产午夜精品| 成人免费看片app下载| 亚洲综合在线第一页| 欧美精品久久久久久久久老牛影院| 麻豆国产精品视频| 亚洲精品福利视频网站| 日韩午夜在线影院| 93久久精品日日躁夜夜躁欧美| 亚洲男人的天堂在线观看| 日韩亚洲欧美一区二区三区|