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

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在线| 性色av香蕉一区二区| 欧美一区二区三区在线| 一本色道久久88综合日韩精品 | 欧美激情精品久久久久久久变态| 久久久999精品免费| 欧美一区综合| 久久久久免费视频| 你懂的网址国产 欧美| 麻豆精品一区二区综合av| 蜜臀久久99精品久久久画质超高清| 久久一区二区三区四区| 欧美激情精品久久久久久黑人 | 欧美顶级艳妇交换群宴| 免费一区视频| 欧美日韩日本国产亚洲在线 | 欧美性猛片xxxx免费看久爱| 国产精品久久婷婷六月丁香| 国产午夜精品理论片a级探花| 国产在线国偷精品产拍免费yy| 亚洲免费伊人电影在线观看av| 99视频日韩| 欧美xx69| 一本色道**综合亚洲精品蜜桃冫 | 亚洲高清自拍| 亚洲作爱视频| 嫩草国产精品入口| 91久久在线视频| 国产亚洲欧美一区在线观看| 国产一区二区三区在线观看免费 | 亚洲国产欧美一区二区三区久久| 一区二区三区视频免费在线观看 | 免费永久网站黄欧美| 亚洲国产精品久久人人爱蜜臀 | 美女日韩欧美| 亚洲另类自拍| 欧美在线亚洲综合一区| 激情成人av| 午夜亚洲伦理| 亚洲一区二区三区在线| 欧美激情综合网| 一本色道婷婷久久欧美| 日韩午夜激情av| 欧美日韩福利| 亚洲午夜伦理| 激情久久影院| 91久久久久久久久| 欧美日韩在线播放一区| 黄网动漫久久久| 日韩午夜av在线| 久久精品日韩欧美| 欧美在线一二三| 国产精品乱人伦中文| 国产日韩欧美不卡在线| 国产精品久久久久av免费| 久久久久久久综合色一本| 欧美日韩一区视频| 亚洲缚视频在线观看| 国产麻豆精品久久一二三| 亚洲黄一区二区三区| 好吊色欧美一区二区三区四区| 91久久久久久| 韩国av一区二区三区四区| 日韩亚洲国产欧美| 一区久久精品| 亚洲一区三区电影在线观看| 亚洲日本欧美| 欧美在线观看网址综合| 国产精品v日韩精品v欧美精品网站| 亚洲精品日韩综合观看成人91| 亚洲欧美综合精品久久成人| 91久久久亚洲精品| 久久精品一二三| 日韩午夜精品| 一区三区视频| 国产精品二区三区四区| 久久精品91久久久久久再现| 欧美激情在线观看| 亚洲福利视频二区| 欧美三级电影一区| 亚洲一区二区不卡免费| 农村妇女精品| 欧美成人日本| 欧美国产日产韩国视频| 亚洲国产一区二区三区高清| 久热精品视频在线观看| 亚洲精品乱码视频| 久久成人国产| 亚洲国产一成人久久精品| 亚洲欧洲视频| 国产亚洲va综合人人澡精品| 卡通动漫国产精品| 亚洲色无码播放| 欧美大片一区| 亚洲视频在线观看一区| 国产主播精品在线| 久久成人久久爱| 午夜一区二区三区在线观看| 99精品国产在热久久婷婷| 亚洲美女淫视频| 欧美在线播放视频| 亚洲综合日韩| 国产精品初高中精品久久| 性欧美激情精品| 快射av在线播放一区| 午夜精品国产精品大乳美女| 激情av一区二区| 韩国欧美一区| 国产一区二区精品丝袜| 国产精品国产三级欧美二区| 欧美成人首页| 欧美.www| 亚洲性色视频| 一区二区日韩精品| 在线综合欧美| 日韩亚洲视频在线| 亚洲国产91| 亚洲精品综合精品自拍| 亚洲毛片av在线| 亚洲巨乳在线| 亚洲最黄网站| 伊人春色精品| 国产亚洲精品一区二555| 国产亚洲欧美一级| 国模精品一区二区三区| 国产精品美女久久久久aⅴ国产馆| 欧美午夜精彩| 国产深夜精品福利| 国产毛片一区二区| 欧美激情片在线观看| 国产精品国产三级国产aⅴ浪潮| 欧美日韩精品免费| 国产精品麻豆欧美日韩ww| 国产精品永久在线| 亚洲成色999久久网站| 亚洲一区欧美激情| 欧美成人精品h版在线观看| 亚洲精品乱码久久久久久按摩观 | 欧美精品激情| 国产精品日韩在线一区| 在线精品高清中文字幕| 小黄鸭精品aⅴ导航网站入口| 欧美国产91| 久久免费午夜影院| 国产精品毛片| 在线中文字幕一区| 日韩午夜av在线| 欧美久久久久久久久| 亚洲国产精品久久久久久女王| 欧美一级视频| 午夜精品久久久久久久99樱桃 | 亚洲欧美另类在线| 国产精品久久国产精麻豆99网站| 亚洲国产精品va| 欧美激情国产日韩精品一区18| 亚洲一区精彩视频| 国产乱码精品| 久久影院亚洲| 久久精品30| 久久久999精品| 国产一区二区三区精品久久久| 亚洲欧美日韩人成在线播放| 中文在线不卡| 国产一区二区三区久久久| 久久久女女女女999久久| 欧美一级欧美一级在线播放| 激情综合色综合久久| 欧美激情精品久久久| 欧美黄色影院| 久久精品国产99精品国产亚洲性色| 亚洲一区日韩| 狠狠干综合网| 99re6热在线精品视频播放速度| 欧美日韩一区二区在线观看视频 | 国产精品国产亚洲精品看不卡15| 午夜在线观看欧美| 久久精品动漫| 亚洲欧美一区二区三区久久| 久久免费黄色| 日韩一区二区电影网| 欧美超级免费视 在线| 欧美精品一区二区蜜臀亚洲| 日韩网站在线观看| 一区电影在线观看| 国产精品国产三级国产| 亚洲午夜高清视频| 亚洲第一福利视频| 久久精品人人| 136国产福利精品导航网址应用 | 久久亚洲综合色| 欧美三区免费完整视频在线观看| 亚洲电影观看| 欧美xxxx在线观看| 亚洲午夜精品久久| 久久久久亚洲综合| 亚洲激情在线激情| 亚洲影音一区| 一色屋精品视频免费看| 免费在线看成人av| 在线观看日韩av电影|