• <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>
            SmartPtr
            本博客已搬至:http://www.cnblogs.com/baiyanhuang/
            posts - 29,comments - 176,trackbacks - 0
            By SmartPtr(http://www.shnenglu.com/SmartPtr/)

              同事工作中遇到這個(gè)問(wèn)題,不想在創(chuàng)建對(duì)象失敗時(shí)才知道原來(lái)對(duì)應(yīng)的COM對(duì)象不可用。自己項(xiàng)目中用到了這個(gè),遂總結(jié)一下,希望對(duì)大家有用。
              要判斷一個(gè)COM對(duì)象是否有用,首先要判斷該COM對(duì)象的CLSID是否在注冊(cè)表中注冊(cè),但注冊(cè)了并不能保證其可用,因?yàn)槿绻艺`刪了該COM對(duì)象的載體-DLL(或exe),該COM對(duì)象仍然不能正確創(chuàng)建。所以我們還要判斷該載體文件是否存在,兩者都通過(guò)了,該COM對(duì)象才可正確創(chuàng)建。
               直接看代碼:
            bool IsCOMAvailable(CString strGUID)
            {
                
            // 1. Try to open the HKEY_CLASSES_ROOT\CLSID\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} key
                CString strKeyName = _T("CLSID\\"+ strGUID;
                HKEY hClsidKey;
                
            if( ::RegOpenKeyEx( HKEY_CLASSES_ROOT, strKeyName, 0, KEY_QUERY_VALUE, &hClsidKey ) == ERROR_SUCCESS )
                {
                    
            // 2. Continue to open CLSID\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\InProcServer32\(Default)
                    HKEY hInProcServer32Key;
                    
            if( ::RegOpenKeyEx( hClsidKey, _T( "InProcServer32" ), 0, KEY_QUERY_VALUE, &hInProcServer32Key ) == ERROR_SUCCESS )
                    {
                        TCHAR tszServerPathName[_MAX_PATH];
                        DWORD dwSize 
            = sizeof( tszServerPathName );
                        DWORD dwType;
                        
            // 3. Get the com dll path
                        if( ::RegQueryValueEx( hInProcServer32Key, NULL, NULL, &dwType, (LPBYTE)tszServerPathName, &dwSize ) == ERROR_SUCCESS )
                        {
                            
            if( dwType != REG_SZ )
                                
            return false;
                            
            // 4. If the dll file exist
                            CFileFind fileFind;
                            
            if(fileFind.FindFile(tszServerPathName))
                                
            return true;
                        }
                        ::CloseHandle(hInProcServer32Key);
                    }

                    ::CloseHandle(hClsidKey);
                }
                
            return false;
            }
            posted on 2007-07-06 21:30 SmartPtr 閱讀(1812) 評(píng)論(7)  編輯 收藏 引用

            FeedBack:
            # re: 如何判斷一個(gè)COM對(duì)象是否可用
            2007-07-06 21:36 | 萬(wàn)連文
            這個(gè)直接看返回值比較好。  回復(fù)  更多評(píng)論
              
            # re: 如何判斷一個(gè)COM對(duì)象是否可用
            2007-07-06 21:44 | SmartPtr
            假設(shè)講我的COM組件在系統(tǒng)運(yùn)行一段時(shí)間后,在某個(gè)操作中才會(huì)被創(chuàng)建出來(lái),而此時(shí)如果此對(duì)象無(wú)法創(chuàng)建,系統(tǒng)的任務(wù)就無(wú)法完成,此時(shí)用戶(hù)就要問(wèn)了:“早干嘛去了,先讓我瞎忙活那么長(zhǎng)時(shí)間, 不行早說(shuō)嘛”, 呵呵,開(kāi)個(gè)玩笑, 其實(shí)這就是我們同事遇到的現(xiàn)實(shí)問(wèn)題。 但如果我在一開(kāi)始就試圖創(chuàng)建全部的COM對(duì)象而只為了判斷其是否可創(chuàng)建,似乎消耗大了點(diǎn),邏輯上也不太合理。  回復(fù)  更多評(píng)論
              
            # re: 如何判斷一個(gè)COM對(duì)象是否可用
            2007-07-06 23:36 | DC
            我覺(jué)得也是直接看返回值比較好,因?yàn)槟愕倪@個(gè)操作只能確認(rèn)COM對(duì)象是否存在,至于能否創(chuàng)建成功還不一定。  回復(fù)  更多評(píng)論
              
            # re: 如何判斷一個(gè)COM對(duì)象是否可用
            2007-07-07 20:07 | 萬(wàn)連文
            對(duì)一種技術(shù)的濫用,不規(guī)范使用是需要制止而不是想辦法包庇縱容,那樣只會(huì)是的系統(tǒng)越來(lái)越糟糕。  回復(fù)  更多評(píng)論
              
            # re: 如何判斷一個(gè)COM對(duì)象是否可用
            2007-07-07 20:17 | SmartPtr
            to 萬(wàn)連文
            可否解釋一下, 實(shí)在是看不明白。。。。。  回復(fù)  更多評(píng)論
              
            # re: 如何判斷一個(gè)COM對(duì)象是否可用
            2007-07-09 09:53 | SuperPlayeR
            我個(gè)人理解萬(wàn)連文的意思就是說(shuō),針對(duì)你講述的這種情況,實(shí)際是因?yàn)閏om組件沒(méi)有被注冊(cè)造成了,而顯然使用COM技術(shù)的規(guī)范性操作當(dāng)然是先注冊(cè)這個(gè)組件再使用。而博主您的想法也是通過(guò)讀取注冊(cè)表看該組件是否注冊(cè)了,其實(shí)也是一種不規(guī)范使用。  回復(fù)  更多評(píng)論
              
            # re: 如何判斷一個(gè)COM對(duì)象是否可用
            2007-07-09 19:54 | SmartPtr
            To SuperPlyeR:

            不僅是沒(méi)有注冊(cè)造成的, 應(yīng)該說(shuō)是某些異常操作使得該COM組件不可用, 可以是沒(méi)有注冊(cè),也可以是注冊(cè)后注冊(cè)信息被誤操作覆蓋, 也可以是該DLL被刪除, 總之, 在系統(tǒng)運(yùn)行之前先檢測(cè)一下這些東西是否都是ready的, 如果不是, 那就不要進(jìn)去先。

            之前有朋友說(shuō)直接創(chuàng)建該COM對(duì)象來(lái)判斷, 但我覺(jué)得創(chuàng)建組件只是去做判斷,不太可取  回復(fù)  更多評(píng)論
              

            只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            人妻丰满AV无码久久不卡| 久久福利资源国产精品999| 人妻少妇精品久久| 久久99精品国产麻豆蜜芽| 大美女久久久久久j久久| 成人国内精品久久久久影院VR| 久久精品国产91久久麻豆自制| 久久99免费视频| 精品久久久久久国产牛牛app| 一本久久久久久久| 久久久精品久久久久久| 久久久久无码精品国产app| 欧美色综合久久久久久| 久久久久久久波多野结衣高潮| 久久这里都是精品| 乱亲女H秽乱长久久久| 72种姿势欧美久久久久大黄蕉| 久久福利青草精品资源站| 青青国产成人久久91网| 国产亚州精品女人久久久久久 | www亚洲欲色成人久久精品| 国产高潮久久免费观看| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区| 久久99国产一区二区三区| 久久夜色精品国产噜噜亚洲a| 色欲av伊人久久大香线蕉影院| 久久久亚洲欧洲日产国码二区| 精品国产乱码久久久久久浪潮| 久久久黄色大片| 久久久久免费精品国产| 久久婷婷五月综合成人D啪| 97久久精品人妻人人搡人人玩| 久久精品国产一区二区电影| 久久精品中文无码资源站| 久久无码av三级| 亚洲午夜久久久久久久久久| 国产成人精品久久亚洲高清不卡| 国产毛片欧美毛片久久久| 99久久精品免费看国产免费| 久久国语露脸国产精品电影| 99久久免费国产精品|