• <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://m.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   管理


            7777精品伊人久久久大香线蕉| av国内精品久久久久影院| 国产亚州精品女人久久久久久| 国产精品成人99久久久久| 老司机午夜网站国内精品久久久久久久久 | 欧美精品一区二区久久| 久久精品国产精品亚洲精品| 久久精品国产99久久无毒不卡| 国产99精品久久| 99久久国产综合精品女同图片| 99久久人妻无码精品系列蜜桃 | 亚洲国产精品无码久久98| 久久精品国产一区| 99蜜桃臀久久久欧美精品网站| 国产L精品国产亚洲区久久| 亚洲中文精品久久久久久不卡| 99久久精品国产毛片| 午夜精品久久久久久99热| 久久精品国产99久久丝袜 | 日本精品久久久久影院日本| 99久久免费国产精精品| 久久狠狠爱亚洲综合影院| 久久久黄色大片| 亚洲国产精品一区二区三区久久 | 久久久久久曰本AV免费免费| 久久久久久国产a免费观看不卡| 久久久久久国产精品免费无码| 婷婷国产天堂久久综合五月| 久久精品一区二区国产| 国内精品久久久久久久97牛牛| 久久综合久久综合亚洲| 久久久久久久久久久免费精品| 成人精品一区二区久久| 国产精品久久久天天影视香蕉| 99久久精品费精品国产| 精品久久国产一区二区三区香蕉| AAA级久久久精品无码区| 成人精品一区二区久久久| 精品水蜜桃久久久久久久| 国产精品美女久久久久AV福利| 久久av高潮av无码av喷吹|