青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運轉,開心的工作
簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

手工加載未注冊的 COM 組件

Posted on 2010-02-16 15:43 S.l.e!ep.¢% 閱讀(1449) 評論(0)  編輯 收藏 引用 所屬分類: COM

手工加載未注冊的 COM 組件

二 14, 2010

有時候我們運行程序的時候, 可能某個組件在系統內并不存在, 所以我們自己將這個組件打包在我們的安裝包內, 但并不將其注冊進系統. 這樣做的目的就是盡量少的影響原有的系統. 組件只是在我們的應用程序需要的時候才加載進去. 不用的時候將其卸載.

用這種途徑創建組件實例的主要思路就是, 調用組件 DLL 導出的 DllGetClassObject 函數, 創建類廠 IClassFactory 的實例, 然后用 IClassFactory::CreateInstance 函數創建目標接口指針的實例.

以下是用法:

1. 將某個組件加載進程序

1 TCHAR szXmlPath[MAX_PATH] = { 0 };
2 GetModuleFileName(NULL, szXmlPath, _countof(szXmlPath));
3 PathRemoveFileSpec(szXmlPath);
4 PathAppend(szXmlPath, _T( "msxml4.dll" ));
5 TinyInitComLibrary(szXmlPath, __uuidof(DOMDocument40));

2. 使用組件

1 CComPtr<IXMLDOMDocument2> spXMLDoc;
2 hr = spXMLDoc.CoCreateInstance(__uuidof(DOMDocument40));
3 if (FAILED(hr)) {
4 ???? hr = TinyCoCreateInstance(__uuidof(DOMDocument40), NULL, CLSCTX_ALL,
5 ???????? __uuidof(IXMLDOMDocument2), ( void **)&spXMLDoc);
6 ???? if (FAILED(hr)) {
7 ???????? return E_FAIL
8 ???? }
9 }

3. 將所有強制加載的組件卸載

1 TinyReleaseAllComLibrary();


以下是實現的源代碼:

001 #ifndef __TINY_CREATE_COM_OBJ_H__
002 #define __TINY_CREATE_COM_OBJ_H__?? 1
003 ??
004 typedef HRESULT (WINAPI * PFN_DllCanUnloadNow)( void );
005 typedef HRESULT (WINAPI * PFN_DllGetClassObject)(REFCLSID rclsid, REFIID riid, LPVOID * ppv);
006 ??
007 #include <vector>
008 #include <algorithm>
009 ??
010 typedef struct COM_OBJ_DLL_CONTAINER
011 {
012 ???? HINSTANCE hDllInst;
013 ???? CLSID clsObject;
014 } COM_OBJ_DLL_CONTAINER ;
015 ??
016 typedef std::vector<COM_OBJ_DLL_CONTAINER> COM_LIB_ARR_TYPE;
017 ??
018 __declspec ( selectany ) COM_LIB_ARR_TYPE * g_vecComLib = NULL;
019 ??
020 __inline HRESULT WINAPI TinyInitComLibrary( LPCTSTR lpszObjHostPath, REFCLSID rclsid)
021 {
022 ???? if (NULL == g_vecComLib) {
023 ???????? g_vecComLib = new COM_LIB_ARR_TYPE();
024 ???? }
025 ??
026 ???? HRESULT hr = E_FAIL;
027 ???? COM_OBJ_DLL_CONTAINER tmp = { 0 };
028 ???? tmp.hDllInst = LoadLibrary(lpszObjHostPath);
029 ???? if (tmp.hDllInst)
030 ???? {
031 ???????? tmp.clsObject = rclsid;
032 ???????? g_vecComLib->push_back(tmp);
033 ???????? hr = S_OK;
034 ???? }
035 ???? return hr;
036 }
037 ??
038 __inline HRESULT WINAPI TinyReleaseComLibrary(REFCLSID rclsid)
039 {
040 ???? HRESULT hr = E_FAIL;
041 ???? if (NULL == g_vecComLib) {
042 ???????? return hr;
043 ???? }
044 ??
045 ???? COM_LIB_ARR_TYPE::iterator it;
046 ???? for (it=g_vecComLib->begin(); it!=g_vecComLib->end(); it++)
047 ???? {
048 ???????? if (IsEqualCLSID(it->clsObject, rclsid))
049 ???????? {
050 ???????????? BOOL bCanUnload = TRUE;
051 ???????????? PFN_DllCanUnloadNow pfn_DllCanUnloadNow = NULL;
052 ???????????? pfn_DllCanUnloadNow = (PFN_DllCanUnloadNow) GetProcAddress(it->hDllInst, "DllCanUnloadNow" );
053 ???????????? if (pfn_DllCanUnloadNow && S_OK != pfn_DllCanUnloadNow()) {
054 ???????????????? bCanUnload = FALSE;
055 ???????????? }
056 ??
057 ???????????? if (bCanUnload) {
058 ???????????????? FreeLibrary(it->hDllInst);
059 ???????????????? g_vecComLib->erase(it);
060 ???????????????? hr = S_OK;
061 ???????????? }
062 ???????????? break ;
063 ???????? }
064 ???? }
065 ??
066 ???? if (0 == g_vecComLib->size()) {
067 ???????? delete g_vecComLib;
068 ???????? g_vecComLib = NULL;
069 ???? }
070 ??
071 ???? return hr;
072 }
073 ??
074 __inline HRESULT WINAPI TinyReleaseAllComLibrary( void )
075 {
076 ???? HRESULT hr = S_OK;
077 ???? if (NULL == g_vecComLib) {
078 ???????? return hr;
079 ???? }
080 ??
081 ???? COM_LIB_ARR_TYPE::iterator it;
082 ???? for (it=g_vecComLib->begin(); it!=g_vecComLib->end(); it++)
083 ???? {
084 ???????? FreeLibrary(it->hDllInst);
085 ???? }
086 ???? g_vecComLib->clear();
087 ???? delete g_vecComLib;
088 ???? g_vecComLib = NULL;
089 ???? return hr;
090 }
091 ??
092 __inline HRESULT WINAPI TinyCoCreateInstance(IN REFCLSID rclsid, IN LPUNKNOWN pUnkOuter,
093 ?????????????????????????????????????????? IN DWORD dwClsContext, IN REFIID riid, OUT LPVOID FAR* ppv)
094 {
095 ???? HRESULT hr = E_FAIL;
096 ??
097 ???? if (g_vecComLib==NULL)
098 ???? {
099 ???????? __asm int 3;
100 ???????? return hr;
101 ???? }
102 ??
103 ???? COM_LIB_ARR_TYPE::iterator it;
104 ??
105 ???? for (it=g_vecComLib->begin(); it!=g_vecComLib->end(); it++)
106 ???? {
107 ???????? if (IsEqualCLSID(it->clsObject, rclsid))
108 ???????? {
109 ???????????? PFN_DllGetClassObject pfn_DllGetClassObject = NULL;
110 ???????????? pfn_DllGetClassObject = (PFN_DllGetClassObject) GetProcAddress(it->hDllInst, "DllGetClassObject" );
111 ???????????? if (pfn_DllGetClassObject) {
112 ???????????????? CComQIPtr<IClassFactory> spClsFact;
113 ???????????????? hr = pfn_DllGetClassObject(rclsid, __uuidof(IClassFactory), ( void **)&spClsFact);
114 ???????????????? if (SUCCEEDED(hr))
115 ???????????????? {
116 ???????????????????? hr = spClsFact->CreateInstance(NULL, riid, ppv);
117 ???????????????? }
118 ???????????? }
119 ???????????? break ;
120 ???????? }
121 ???? }
122 ???? return hr;
123 }
124 ??
125 #endif? // __TINY_CREATE_COM_OBJ_H__
by free2000fly | Categories: 技術心得 | Tagged: |
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            蜜臀av性久久久久蜜臀aⅴ四虎| 久久午夜电影网| 国产精品久久久久久av福利软件| 久久精品国产免费观看| 久久成人18免费网站| 亚洲欧美日韩天堂| 久久精品亚洲乱码伦伦中文| 久久久久综合一区二区三区| 美国十次了思思久久精品导航| 欧美激情1区2区| 99视频一区二区| 欧美一区二区三区在线观看| 久久综合九色综合欧美就去吻 | 久久久久久久成人| 美女黄毛**国产精品啪啪| 亚洲日韩第九十九页| 中文av字幕一区| 欧美专区在线观看一区| 欧美黑人国产人伦爽爽爽| 国产精品黄页免费高清在线观看| 国产欧美日韩一区| 亚洲日韩欧美一区二区在线| 亚洲一区中文字幕在线观看| 久久精品日韩| 亚洲老司机av| 久久亚洲欧美国产精品乐播| 欧美视频中文字幕| 久久久国产精品亚洲一区| 亚洲欧洲日产国码二区| 日韩视频在线免费观看| 欧美一级久久| 亚洲高清精品中出| 午夜久久tv| 欧美日韩成人综合天天影院| 伊人久久亚洲美女图片| 午夜国产精品视频免费体验区| 欧美成人精品| 久久国产精彩视频| 国产伦理精品不卡| 亚洲婷婷在线| 亚洲国产片色| 裸体歌舞表演一区二区| 一区二区三区精品视频在线观看| 香蕉国产精品偷在线观看不卡| 欧美日韩一区不卡| 99re热这里只有精品视频| 欧美α欧美αv大片| 欧美亚洲一区二区三区| 国产精品qvod| 一区二区三区高清| 亚洲三级网站| 欧美精品二区三区四区免费看视频| 激情久久五月天| 久久―日本道色综合久久| 午夜欧美大片免费观看| 国产精品国产成人国产三级| 在线亚洲成人| 一区二区三区四区五区精品| 欧美日韩高清在线观看| a4yy欧美一区二区三区| 亚洲人成人99网站| 欧美理论电影在线观看| 一本色道久久综合一区 | 毛片一区二区三区| 国产在线拍偷自揄拍精品| 性色av一区二区三区在线观看| 99精品免费视频| 亚洲伦理在线观看| 国产精品白丝黑袜喷水久久久| 亚洲一区在线播放| 亚洲午夜久久久久久久久电影院 | 亚洲免费影院| 国产婷婷一区二区| 久久久久久久欧美精品| 久久超碰97人人做人人爱| 1000部国产精品成人观看| 男人的天堂成人在线| 欧美护士18xxxxhd| 亚洲欧美日韩国产成人| 欧美主播一区二区三区美女 久久精品人| 国产亚洲精品7777| 亚洲欧美国产va在线影院| 国内成人精品视频| 欧美激情一区三区| 欧美日精品一区视频| 欧美一区二区三区电影在线观看| 亚洲欧美日韩一区| 久久九九免费视频| 亚洲精品久久久久久久久| av成人手机在线| 国产一区二区中文| 亚洲激情在线播放| 国产欧美一区视频| 亚洲国产精品va在线看黑人 | 日韩一区二区精品视频| 国产日韩欧美亚洲| 亚洲三级影院| 韩国av一区二区三区四区| 最新国产精品拍自在线播放| 国产精品嫩草影院av蜜臀| 你懂的视频一区二区| 国产精品久久久久久亚洲调教| 美国十次了思思久久精品导航| 欧美视频二区| 欧美成人在线网站| 国产视频一区在线观看一区免费| 亚洲国产小视频| 好男人免费精品视频| 一本久道综合久久精品| 在线看欧美日韩| 欧美一级黄色录像| 宅男66日本亚洲欧美视频| 久久精品国产一区二区三| 亚洲一区二区视频| 欧美极品色图| 亚洲电影有码| 亚洲国产精品精华液网站| 性欧美videos另类喷潮| 午夜久久久久久久久久一区二区| 欧美日韩精品在线| 亚洲精选在线观看| 99精品国产在热久久| 欧美国产极速在线| 欧美高清在线一区| 亚洲高清av在线| 老妇喷水一区二区三区| 久热re这里精品视频在线6| 一区二区免费在线播放| 一区二区三区自拍| 欧美伊人久久| 久久久一本精品99久久精品66| 国产精品色在线| 亚洲一区在线看| 午夜国产精品视频| 国产日韩精品一区二区浪潮av| 一区二区激情视频| 午夜免费在线观看精品视频| 欧美系列精品| 亚洲一区日本| 久久国产直播| 国模精品一区二区三区色天香| 午夜伦理片一区| 久久一区二区三区国产精品| 国产综合网站| 久久人体大胆视频| 亚洲欧美日韩国产一区二区| 亚洲激情影院| 亚洲视频欧美视频| 国产精品女主播| 亚洲欧美综合国产精品一区| 久久久精品网| 在线日韩欧美视频| 欧美日韩国产麻豆| 亚洲欧美精品中文字幕在线| 欧美在线视频a| 亚洲第一精品福利| 欧美三级黄美女| 欧美在线播放一区| 亚洲国产精品va在线看黑人| 亚洲免费在线视频| 国语自产在线不卡| 欧美人体xx| 午夜一区二区三区不卡视频| 欧美**字幕| 亚洲免费视频中文字幕| 激情伊人五月天久久综合| 嫩草国产精品入口| 午夜精品久久久久久| 欧美成人午夜视频| 亚洲视频一区二区免费在线观看| 国产日韩精品一区二区浪潮av| 久久亚洲春色中文字幕久久久| 亚洲国产另类精品专区| 欧美性猛交视频| 久久亚洲午夜电影| 亚洲一区二区视频在线| 欧美国产专区| 欧美中文字幕精品| 日韩亚洲欧美高清| 狠狠v欧美v日韩v亚洲ⅴ| 欧美精品一区二区三区在线播放| 中文亚洲免费| 亚洲日本国产| 欧美高清不卡在线| 久久se精品一区精品二区| 91久久在线视频| 国产精一区二区三区| 欧美日韩一区三区| 欧美成人高清视频| 久久激情五月激情| 亚洲一区二区三区777| 亚洲精品1区2区| 美国三级日本三级久久99| 欧美一区网站| 亚洲一二三级电影| 99精品欧美| 亚洲精品免费一二三区| 亚洲第一页自拍| 影音先锋另类| 精品99一区二区|