簡單地調用組件:
一。組件的啓動和釋放
組件是運行在分佈式環境中的,如果啓動組件就會遇到一個大的問題。想C++中的new函數,它有沒有考慮遠程的實現呢?因此啓動組件,調用接口的功能,就由COM系統來實現了。
當調用組件的時候,其實是依靠代理(運行在本地)和存根(運行在遠端)之間的通訊完成的。具體來說,當客戶程序通過 CoCreateInstance() 函數啓動組件,則代理接管該調用,它和存根通訊,存根則它所在的本地(相對於客戶程序來說就是遠程了)執行 new 操作加載對象。
當你把接口指針賦值給(保存到)另一個變量中的時候,請調用AddRef();
GetWindowText(HWND, LPSTR, int),居然要這塊內存的大小,只能估摸着給個大一些的空間了。
函數內部根據實際需要動態申請內存,而且調用者釋放
COM的申請,重新申請和釋放:
CoTaskMemAlloc();
CoTaskRealloc();
CoTaskMemFree();
參數傳遞方向
示例一、由 CLSID 得到 ProgID。
::CoInitialize( NULL );
HRESULT hr;
// {000209FF-0000-0000-C000-000000000046} = word.application.9
CLSID clsid = {0x209ff,0,0,{0xc0,0,0,0,0,0,0,0x46}};
LPOLESTR lpwProgID = NULL;
hr = ::ProgIDFromCLSID( clsid, &lpwProgID );
if ( SUCCEEDED(hr) )
{
::MessageBoxW( NULL, lpwProgID, L"ProgID", MB_OK );
IMalloc * pMalloc = NULL;
hr = ::CoGetMalloc( 1, &pMalloc ); // 取得 IMalloc
if ( SUCCEEDED(hr) )
{
pMalloc->Free( lpwProgID ); // 釋放ProgID內存
pMalloc->Release(); // 釋放IMalloc
}
}
::CoUninitialize();
CString BrowseFolder(HWND hWnd, LPCTSTR lpTitle)
{
// 調用 SHBrowseForFolder 取得目錄(文件夾)名稱
// 參數 hWnd: 父窗口句柄
// 參數 lpTitle: 窗口標題
char szPath[MAX_PATH]={0};
BROWSEINFO m_bi;
m_bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT;
m_bi.hwndOwner = hWnd;
m_bi.pidlRoot = NULL;
m_bi.lpszTitle = lpTitle;
m_bi.lpfn = NULL;
m_bi.lParam = NULL;
m_bi.pszDisplayName = szPath;
LPITEMIDLIST pidl = ::SHBrowseForFolder( &m_bi );
if ( pidl )
{
if( !::SHGetPathFromIDList ( pidl, szPath ) ) szPath[0]=0;
IMalloc * pMalloc = NULL;
if ( SUCCEEDED ( ::SHGetMalloc( &pMalloc ) ) ) // 取得IMalloc分配器接口
{
pMalloc->Free( pidl ); // 釋放內存
pMalloc->Release(); // 釋放接口
}
}
return szPath;
}
這邊就需要理解這邊的意思了,掌握思想。花時間集合MSDN多看看,掌握思想。