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

隨筆-90  評論-947  文章-0  trackbacks-0
 

灰常感謝各位達人昨天的熱心回帖,讓我受益匪淺。我仰望夜空,群星點點,就如各位的點睛之語,在無盡的蒼穹閃耀。這讓我深深地意識到,在這里,不僅可以分享成果,也可以分享困惑、分享寂寞。(開場白到此結束~)

在平常的編程中,我發現很容易遇到這種結構:

(1號方案)

BOOL foo()
{
   
BOOL bRet = FALSE;

   
HANDLE hProcess = OpenProcess(...);

   
if (hProcess != NULL)
    {
       
HANDLE hToken = OpenProcessToken(hProcess, ...);

       
if (hToken != NULL)
        {
           
// ...

           
if (LookupPrivilegeValue(...))
            {
               
if (AdjustTokenPrivileges(hToken, ...))
                {
                   
bRet = TRUE;
                }
            }

           
CloseHandle(hToken);
        }

       
CloseHandle(hProcess);
    }

   
return bRet;
}

如上寫法,容易造成縮進級別不斷增加。為了避免這種情況,可以改成:

(2號方案)

BOOL foo()
{
   
HANDLE hProcess = OpenProcess(...);

   
if (hProcess == NULL)
    {
       
return FALSE;
    }

   
HANDLE hToken = OpenProcessToken(hProcess, ...);

   
if (hToken == NULL)
    {
       
CloseHandle(hProcess);

       
return FALSE;
    }

   
// ...

   
if (!LookupPrivilegeValue(...))
    {
       
CloseHandle(hToken);
       
CloseHandle(hProcess);

       
return FALSE;
    }

   
if (!AdjustTokenPrivileges(hToken, ...))
    {
       
CloseHandle(hToken);
       
CloseHandle(hProcess);

       
return FALSE;
    }

   
CloseHandle(hToken);
   
CloseHandle(hProcess);

   
return TRUE;
}

這樣,又引來了新的問題,每次 return FALSE 時的清理任務比較麻煩,要是每步操作都引進新的 HANDLE 的話,后續的清理工作就變得非常繁重。有人推薦do…while(0)的結構,有人推薦goto。這兩種形式分別是——

do…while(0)

(3號方案)

BOOL foo()
{
   
HANDLE hProcess = OpenProcess(...);

   
if (hProcess == NULL)
    {
       
return FALSE;
    }

   
BOOL bRet = FALSE;

   
do
   
{
       
HANDLE hToken = OpenProcessToken(hProcess, ...);

       
if (hToken == NULL)
        {
           
break;
        }

       
// ...

       
BOOL bRetInner = FALSE;

       
do
       
{
           
if (!LookupPrivilegeValue(...))
            {
               
break;
            }

           
if (!AdjustTokenPrivileges(hToken, ...))
            {
               
break;
            }

           
bRetInner = TRUE;

        }
while (0);

       
CloseHandle(hToken);

       
if (!bRetInner)
        {
           
break;
        }

       
bRet = TRUE;

    }
while (0);

   
CloseHandle(hProcess);

   
return bRet;
}

這種結構可以避免每次 return FALSE 前的一堆清理工作,但缺點是,有幾個依賴性的 HANDLE,就要嵌套幾層的 do…while(0),有時候也會遇到需要三四層嵌套的情形。

goto

(4.1號方案)

BOOL foo
()
{
   
BOOL bRet = FALSE;

   
HANDLE hProcess = OpenProcess(...);

   
if (hProcess == NULL)
    {
       
goto CLEAR;
    }

   
HANDLE hToken = OpenProcessToken(hProcess, ...);

   
if (hToken == NULL)
    {
       
goto CLEAR;
    }

   
// ...

   
if (!LookupPrivilegeValue(...))
    {
       
goto CLEAR;
    }

   
if (!AdjustTokenPrivileges(hToken, ...))
    {
       
goto CLEAR;
    }

   
bRet = TRUE;

CLEAR:
   
if (hToken != NULL)
    {
       
CloseHandle(hToken);
    }

   
if (hProcess != NULL)
    {
       
CloseHandle(hProcess);
    }

   
return bRet;
}
(4.2號方案)

BOOL foo
()
{
   
BOOL bRet = FALSE;

   
HANDLE hProcess = OpenProcess(...);

   
if (hProcess == NULL)
    {
       
goto ERROR_LEVEL0;
    }

   
HANDLE hToken = OpenProcessToken(hProcess, ...);

   
if (hToken == NULL)
    {
       
goto ERROR_LEVEL1;
    }

   
// ...

   
if (!LookupPrivilegeValue(...))
    {
       
goto ERROR_LEVEL2;
    }

   
if (!AdjustTokenPrivileges(hToken, ...))
    {
       
goto ERROR_LEVEL2;
    }

   
bRet = TRUE;

ERROR_LEVEL2:
   
CloseHandle(hToken);
ERROR_LEVEL1:
   
CloseHandle(hProcess);
ERROR_LEVEL0:
   
return bRet;
}

(左邊和右邊哪種好一點。。。?)

在這種情形下,goto 的方案似乎是完美的。但是 goto 如果遇到 C++,缺點體現出來了。下面這一段,現在是 do…while(0) 結構(只有一層嵌套,這種結構用在這里還算合理):

BOOL foo()
{
   
HRESULT hr = CoInitializeEx(0, COINIT_MULTITHREADED);

   
while (true)
    {
       
if (FAILED(hr))
        {
           
break;
        }

       
hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);

       
if (FAILED(hr))
        {
           
break;
        }

       
CComPtr<IWbemLocator> pLoc = NULL;
       
hr = pLoc.CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER);

       
if (FAILED(hr))
        {
           
break;
        }

       
CComPtr<IWbemServices> pSvc = NULL;
       
hr = pLoc->ConnectServer(_T("ROOT\\CIMV2"), NULL, NULL, NULL, 0, NULL, NULL, &pSvc);

       
if (FAILED(hr))
        {
           
break;
        }

       
hr = CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);

       
if (FAILED(hr))
        {
           
break;
        }

       
CComPtr<IEnumWbemClassObject> pEnum = NULL;
       
_bstr_t bstrLang = _T("WQL");
       
_bstr_t bstrSql = _T("SELECT * FROM __InstanceCreationEvent WITHIN 10")
           
_T("WHERE TargetInstance ISA 'Win32_LogonSession' AND (TargetInstance.LogonType = 2 OR TargetInstance.LogonType = 11)");
       
hr = pSvc->ExecNotificationQuery(bstrLang, bstrSql, WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnum);

       
if (FAILED(hr))
        {
           
break;
        }

       
ULONG uCount = 1;
       
CComPtr<IWbemClassObject> pNext = NULL;
       
hr = pEnum->Next(WBEM_INFINITE, uCount, &pNext, &uCount);

       
if (FAILED(hr))
        {
           
break;
        }

       
// ...

       
break;
    }

   
CoUninitialize();

   
return SUCCEEDED(hr);
}

如果改成 goto,則需要把所有需要對象的定義全放到最前面來,不然 goto 會跳過他們的初始化,編譯不過。但是,所有對象都放到最前面定義,又違反了即用即聲明的規則,而且太多了也容易混淆。

最后,問題是,如果遇到 C++ 的、多層嵌套的,大家一般如何組織代碼呢?

謝謝!

posted @ 2010-03-30 09:55 溪流 閱讀(2812) | 評論 (26)編輯 收藏

我的觀點可能有點激進,我覺得單件模式啥也不是,純粹是個全局變量的貞潔牌坊而已。全局變量如果有必要,用就用了,何必偽裝;如無必要,就算穿上單件模式的馬甲,到頭來也會搞得一片狼籍——隨處可見GetInstance。

歡迎討論~

posted @ 2010-03-29 10:58 溪流 閱讀(4517) | 評論 (63)編輯 收藏

如題,不知道這樣說是不是清楚了。

就是說,我們把新的類引入我們自己的工程后,

如果我們的工程打開了預編譯頭,就需要在.cpp加上#include <stdafx.h>,或者關閉本工程或者那個cpp的預編譯頭選項;如果我們的工程關閉了預編譯頭,就要確保那個.cpp里沒有#include <stdafx.h>。

這樣感覺很不爽。如果是用別人的成品庫,我會覺得最好不改別人的代碼,于是只好改工程里的選項,麻煩。如果自己寫個類,也想讓用的人(雖然通常是我自己)不要每次遇到這個麻煩。

有沒有某種方法,在代碼里加上類似:
#pragma precompileheader(close)
然后就不用管stdafx.h了,直接把文件加到工程里就好了

posted @ 2010-03-29 10:30 溪流 閱讀(8885) | 評論 (17)編輯 收藏

網上提得較多的是 2K/XP 的句柄表,以及句柄分配算法。其中 Win2K 的句柄表在 _EPROCESS + 0x128 處,WinXP 在 _EPROCESS + 0x0c4 處。Vista 和 Win7 找遍了 Internet 沒找到,于是只好下載符號表,裝系統自己找。其實也就 dt _EPROCESS 一下了。Vista 在 _EPROCESS + 0x0dc 處,Win7 在 _EPROCESS + 0x0f4 處。以上均是 32 位系統下的地址。句柄分配算法在 Vista 和 Win7 中都沒有變化,和 XP 一樣(至少我的測試結果是這樣的)。

小記一筆。明天繼續看 64 位的。

==================================================
WinXP x64: 0x158
Vista x64: 0x160
Win7 x64: 0x200

posted @ 2009-11-17 19:18 溪流 閱讀(797) | 評論 (0)編輯 收藏

陸陸續續搞了一個多月了,不過其實也就一開始的幾天和最近幾天在好好搞。

前兩天把 Set、Map 寫完的時候,突然發現我還是完全沒有理解 STL 的迭代器所玩的花樣。其中的類型萃取我看出來了,其余的都沒有。我這里的迭代器是很土的,每個容器自顧自的(盡管很“巧合”有幾個一樣的接口)。

String 類我還想繼續拓展功能。不過沒想好的就是要不要有 Format 功能:如果沒有,使用上或許偶爾會有一點點不方便(如果也不提供數值和字符串相互轉換的函數的話);如果有,基本上不會去手工解釋 %d、%s 之類的了,那么勢必要用到 sprintf 之類的東西了,那么我的零依賴的設想就落空了。

MultiSet 和 MultiMap 有點兒傾向于不提供了,真有需求的到時候去 Set<List<T>>、Map<List<T>> 好了。

文件在此,點擊下載(還沒測試仔細,可能有不少 Bug,甚至可能某些函數有語法錯誤沒測到,這點請諒解)

 

請各位給點意見~

posted @ 2009-11-09 22:01 溪流 閱讀(2194) | 評論 (32)編輯 收藏
僅列出標題
共18頁: First 10 11 12 13 14 15 16 17 18 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲电影免费在线 | 欧美二区在线看| 亚洲欧美一区在线| 99av国产精品欲麻豆| 91久久精品国产91久久| 亚洲高清一区二区三区| 亚洲二区精品| 亚洲乱码国产乱码精品精98午夜| 亚洲二区在线| 亚洲国产美女| 亚洲精品在线视频观看| 一本久道久久久| 亚洲欧美日韩国产一区二区| 亚洲在线观看免费| 欧美在线一级视频| 免费亚洲网站| 亚洲精品日产精品乱码不卡| 亚洲三级免费观看| 亚洲国语精品自产拍在线观看| 亚洲福利视频在线| 999亚洲国产精| 亚洲综合视频网| 欧美一级片在线播放| 久久久久久有精品国产| 欧美 日韩 国产 一区| 亚洲电影一级黄| 亚洲靠逼com| 午夜精品福利一区二区三区av| 久久成人精品电影| 欧美欧美天天天天操| 国产精品视频网| 亚洲国产精品一区二区三区| 一级成人国产| 免费不卡在线视频| 亚洲天堂男人| 欧美成人一区二区三区在线观看| 久久精品夜夜夜夜久久| 亚洲电影免费| 欧美一区二区播放| 欧美视频日韩视频| 亚洲高清资源| 欧美一区二区三区在线观看视频| 欧美国产一区二区| 欧美一区二区三区免费视| 欧美区在线播放| 在线成人欧美| 久久久久网站| 亚洲欧美日韩一区| 欧美日韩综合另类| 亚洲激情网站| 久久综合伊人77777麻豆| 制服诱惑一区二区| 欧美日韩成人在线| 99精品久久久| 亚洲高清一区二| 老色鬼精品视频在线观看播放| 国产精品一区二区你懂的| 亚洲精品乱码| 免费在线观看日韩欧美| 欧美一区二区三区在线免费观看| 欧美日韩免费在线视频| 亚洲国产视频一区| 免费在线成人av| 麻豆精品精华液| 亚洲高清一二三区| 欧美国产在线视频| 欧美精品18+| 一区二区三区四区精品| 99精品国产99久久久久久福利| 欧美日韩国产高清| 亚洲欧美国产日韩天堂区| 亚洲无毛电影| 韩日成人av| 亚洲黄页视频免费观看| 欧美色另类天堂2015| 亚洲综合色自拍一区| 亚洲一区二区三区免费在线观看| 国产免费观看久久黄| 久久久天天操| 欧美高清视频在线| 亚洲欧美日本日韩| 欧美在线中文字幕| 夜夜嗨一区二区| 午夜久久久久久| 亚洲大片av| 久久国产精彩视频| 一区二区在线看| 久久人人精品| 久久国产精彩视频| 国产日韩欧美另类| 欧美在线观看网站| 亚洲在线视频观看| 蜜桃久久精品一区二区| 欧美天天在线| 欧美va天堂va视频va在线| 亚洲一二三四区| 欧美a级一区| 一区二区亚洲精品| 欧美一区三区二区在线观看| 亚洲第一级黄色片| 久久精品夜色噜噜亚洲aⅴ| 男女激情视频一区| 激情视频一区二区| 亚洲愉拍自拍另类高清精品| 欧美福利在线观看| 久久精品二区亚洲w码| 国产麻豆综合| 午夜精品福利一区二区三区av | 一本一道久久综合狠狠老精东影业 | 亚洲国产天堂久久综合网| 欧美在线免费观看| 亚洲一区二区精品视频| 欧美日韩国产一区二区| 亚洲美女毛片| 亚洲高清视频中文字幕| 欧美华人在线视频| 亚洲国产精品久久久久秋霞不卡| 性欧美办公室18xxxxhd| 日韩视频精品在线观看| 欧美高清视频www夜色资源网| 亚洲国产成人精品久久| 蜜桃久久精品乱码一区二区| 欧美在线观看一区| 激情欧美一区| 欧美在线播放一区| 国内自拍视频一区二区三区 | 国产精品久久波多野结衣| 亚洲精品一级| 亚洲免费av电影| 国产精品高清网站| 欧美一区二区啪啪| 久久久久久久久久久久久久一区| 另类尿喷潮videofree| 激情久久一区| 亚洲乱码日产精品bd| 久久精品一区蜜桃臀影院| 一区二区视频免费完整版观看| 卡一卡二国产精品| 久久综合色播五月| 亚洲精品孕妇| 亚洲图片欧美日产| 久久在精品线影院精品国产| 久久久久国产精品午夜一区| 久久久精品一区| 亚洲精品美女久久7777777| 亚洲日本中文| 国产亚洲欧美日韩在线一区| 老鸭窝毛片一区二区三区| 欧美一区二区视频观看视频| 久久国产精品久久国产精品| 久久久伊人欧美| 一区二区三区**美女毛片| 一区二区三区成人| 老司机精品导航| 亚洲午夜精品久久久久久app| 亚洲欧美日韩国产一区| 亚洲第一区在线观看| 日韩视频免费观看| 国产在线精品二区| 一区二区三区色| 亚洲国产中文字幕在线观看| 中文精品一区二区三区| 亚洲高清免费视频| 亚洲女优在线| 欧美三级电影精品| 欧美在线免费看| 亚洲一区二区三区在线看| 狂野欧美一区| 久久久久一区二区| 国产精品日韩欧美一区二区| 免费日韩av电影| 国产精品一香蕉国产线看观看 | 亚洲午夜电影网| 国产网站欧美日韩免费精品在线观看 | 亚洲一区二区三区在线视频| 亚洲高清中文字幕| 久久精品国产免费观看| 亚洲欧美日韩国产综合在线 | ●精品国产综合乱码久久久久| 亚洲理伦电影| 亚洲欧美激情诱惑| 欧美激情一区二区久久久| 国产午夜精品一区二区三区欧美 | 一区二区免费看| 亚洲国产经典视频| 欧美一级淫片aaaaaaa视频| 亚洲一区美女视频在线观看免费| 久热国产精品视频| aa级大片欧美| 亚洲电影在线看| 久久五月激情| 免费观看一级特黄欧美大片| 国产伦精品一区二区三区免费迷| 一区二区三区**美女毛片| 一区二区高清视频在线观看| 久久aⅴ乱码一区二区三区| 日韩午夜三级在线| 亚洲影视九九影院在线观看| 欧美日韩亚洲一区二区| 日韩午夜剧场|