COM學習筆記(六)

 簡單地調用組件:

一。組件的啓動和釋放

組件是運行在分佈式環境中的,如果啓動組件就會遇到一個大的問題。想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多看看,掌握思想。

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