附录a2 建构环境.htm

来自「Windows2000后台服务程序开发手册」· HTM 代码 · 共 312 行 · 第 1/3 页

HTM
312
字号
<DIV id=printBody>
<TABLE id=middle 
style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all; TEXT-ALIGN: left" 
cellSpacing=0 cellPadding=0 align=center>
  <TBODY>
  <TR>
    <TD class=ml></TD>
    <TD class=mm vAlign=top><BR>
      <DIV align=center>
      <H1 class=aTitle>Windows2000 服务器端应用程序开发设计指南-附录</H1></DIV>
      <TABLE width="97%" align=center>
        <TBODY>
        <TR>
          <TD width=502>
            <DIV align=center>[日期:2006-11-6&nbsp;&nbsp;&nbsp;&nbsp;来源:<A 
            href="http://www.acejoy.com/" target=_blank>ACE开发者</A><SPAN 
            id=SourceLabel></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;作者:Jeffrey Richter 
            Jason D. Clark<SPAN id=AuthorLabel>]</SPAN></DIV></TD>
          <TD align=right width=209>
            <DIV align=center>[字体: <INPUT title=把正文字体缩小 style="HEIGHT: 16px" onclick="fontSize('m','ArticleBody')" type=button value=小> 
<INPUT title=把正文字体扩大 style="HEIGHT: 16px" onclick="fontSize('b','ArticleBody')" type=button value=大> 
<INPUT title=转为简体中文模式 style="HEIGHT: 16px" onclick="bodytojt('ArticleBody')" type=button value=简> 
<INPUT title=转为繁体中文模式 style="HEIGHT: 16px" onclick="bodytoft('ArticleBody')" type=button value=繁> 
            <A href="javascript:fontColor('ArticleBody')"><IMG alt=字体颜色 
            src="附录A2 建构环境.files/fgcolor.gif" align=absMiddle 
            border=0></A>]</DIV></TD></TR></TBODY></TABLE>
      <TABLE cellSpacing=5 cellPadding=0 width="100%" align=center border=0>
        <TBODY>
        <TR>
          <TD vAlign=top>
            <TABLE cellSpacing=0 cellPadding=10 align=left border=0>
              <TBODY>
              <TR>
                <TD></TD></TR></TBODY></TABLE>
            <DIV class=content id=ArticleBody 
            style="PADDING-RIGHT: 10px; DISPLAY: block; PADDING-LEFT: 10px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px">
            <P class=content>
            <TABLE border=0>
              <TBODY style="LINE-HEIGHT: 25px">
              <TR>
                <TD align=middle><FONT style="LINE-HEIGHT: 25px" face=arial 
                  color=#000000 size=2><FONT style="LINE-HEIGHT: 25px" 
                  face=arial color=#3e80d7 size=2><B 
                  style="LINE-HEIGHT: 25px">&nbsp;列表B-3&nbsp;</B></FONT>AutoBuf.h标头文件</FONT></TD></TR></TBODY></TABLE>
            <CENTER></CENTER></A><A style="LINE-HEIGHT: 25px" name=102004>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e70d7 
            size=5><B style="LINE-HEIGHT: 25px">UI Layout C++ 类别(UILayout.h)<BR 
            style="LINE-HEIGHT: 25px">  </B></FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>本书中许多范例应用程序允许使用者重新设定主视窗的大小。当然,重新设定主视窗大小会导致所有的子控制项被重新配置或重设大小。CUILayout 
            C++ 类别列于列表B-4中,它封装了所有子控制项的重新配置与重设大小的逻辑。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>每一个应用程序支援一个重设大小的主视窗,它们将会建立一个CUILayout物件。在该视窗的Dlg_OnInitDialog函数中,CUILayout物件的Initialize方法被呼叫去设定父视窗的handle和视窗的最小宽度与高度。然后CUILayout物件的AnchorControl或AnchorControls方法会被重覆地呼叫,以识别每一个子控制项视窗以及该控制项应如何依据父视窗而被固定。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>当主视窗执行了它的Dlg_OnSize函数时,它只需去呼叫CUILayout物件的AdjustControls方法,传递主视窗之客户区(Client 
            area)的宽度及高度给它即可。为了保持它与父视窗的的相对位置,AdjustControls方法将会自动地重新配置及重设所有子控制项大小。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>当主视窗执行了Dlg_OnGetMinMaxInfo函数时,它需要去呼叫CUILayout物件的HandleMinMax方法。此方法设定了MINMAXINFO结构的成员,让使用者不会因为将视窗缩得太小而遮住了任何的子控制项。</FONT></P>
            <DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT 
            style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">UILayout.h <BR>/******************************************************************** <BR>模组: UILayout.h <BR>通告: Copyright (c)2000 Jeffrey Richter <BR>目的: 当一个父视窗被重设大小后,此类别会管理子视窗的位置及大小 <BR>&nbsp;&nbsp;&nbsp;&nbsp; 请参阅附录B <BR>****************************************, ****************************/ <BR>#pragma once&nbsp;&nbsp; // 编辑单元时,需包含此标头档 <BR>/////////////////////////////////////////////////////////////////////////////// <BR>#include "..\CmnHdr.h" //请参阅附录A <BR>/////////////////////////////////////////////////////////////////////////////// <BR>class CUILayout { <BR>public: <BR> enum ANCHORPOINT { <BR>&nbsp;&nbsp;AP_TOPLEFT, <BR>&nbsp;&nbsp;AP_TOPMIDDLE, <BR>&nbsp;&nbsp;AP_TOPRIGHT, <BR>&nbsp;&nbsp;AP_MIDDLERIGHT, <BR>&nbsp;&nbsp;AP_BOTTOMRIGHT, <BR>&nbsp;&nbsp;AP_BOTTOMMIDDLE, <BR>&nbsp;&nbsp;AP_BOT TOMLEFT, <BR>&nbsp;&nbsp;AP_MIDDLELEFT, <BR>&nbsp;&nbsp;AP_CENTER <BR> }; <BR>public: <BR> void Initialize(HWND hwndParent, int nMinWidth = 0, int nMinHeight = 0); <BR> BOOL AnchorControl(ANCHORPOINT apUpperLeft, ANCHORPOINT apLowerRight, int nID,BOOL&nbsp;&nbsp;<BR> fRedraw = FALSE); <BR> BOOL AnchorControls(ANCHORPOINT apUpperLeft, ANCHORPOINT apLowerRight, BOOL fRedraw, ...); <BR> BOOL AdjustControls(int cx, int cy); <BR> void HandleMinMax(PMINMAXINFO pMinMax) <BR>&nbsp;&nbsp;{ pMinMax-&gt;ptMinTrackSize = m_ptMinParentDims; } <BR>private: <BR> struct CONTROL { <BR>&nbsp;&nbsp;int m_nID; <BR>&nbsp;&nbsp;BOOL m_fRedraw; <BR>&nbsp;&nbsp;ANCHORPOINT m_apUpperLeft; <BR>&nbsp;&nbsp;ANCHORPOINT m_apLowerRight; <BR>&nbsp;&nbsp;POINT m_ptULDelta; <BR>&nbsp;&nbsp;POINT m_ptLRDelta; <BR> }; <BR>private: <BR> void PixelFromAnchorPoint(ANCHORPOINT ap, <BR>&nbsp;&nbsp;int cxParent, int cyParent, PPOINT ppt); <BR>private: <BR> CONTROL m_CtrlInfo[255]; // 允许一个对话方块样板中的最大控制项 <BR> int&nbsp;&nbsp;m_nNumControls; <BR> HWND m_hwndParent; <BR> POINT m_ptMinParentDims; <BR>}; <BR>/////////////////////////////////////////////////////////////////////////////// <BR>#ifdef UILAYOUT_IMPL <BR>/////////////////////////////////////////////////////////////////////////////// <BR>void CUILayout::Initialize(HWND hwndParent, int nMinWidth, int nMinHeight) { <BR> m_hwndParent = hwndParent; <BR> m_nNumControls = 0; <BR> if ((nMinWidth == 0) || (nMinHeight == 0)) { <BR>&nbsp;&nbsp;RECT rc; <BR>&nbsp;&nbsp;GetWindowRect(m_hwndParent, &amp;rc); <BR>&nbsp;&nbsp;m_ptMinParentDims.x = rc.right - rc.left; <BR>&nbsp;&nbsp;m_ptMinParentDims.y = rc.bottom - rc.top; <BR> } <BR> if (nMinWidth != 0)m_ptMinParentDims.x = nMinWidth; <BR> if (nMinHeight != 0)m_ptMinParentDims.y = nMinHeight; <BR>} <BR>/////////////////////////////////////////////////////////////////////////////// <BR>BOOL CUILayout::AnchorControl(ANCHORPOINT apUpperLeft, <BR> ANCHORPOINT apLowerRight, int nID, BOOL fRedraw) { <BR> BOOL fOk = FALSE; <BR> try { <BR>&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;HWND hwndControl = GetDlgItem(m_hwndParent, nID); <BR>&nbsp;&nbsp;if (hwndControl == NULL)goto leave; <BR>&nbsp;&nbsp;if (m_nNumControls &gt;= chDIMOF(m_CtrlInfo)) goto leave; <BR>&nbsp;&nbsp;m_CtrlInfo[m_nNumControls].m_nID = nID; <BR>&nbsp;&nbsp;m_CtrlInfo[m_nNumControls].m_fRedraw = fRedraw; <BR>&nbsp;&nbsp;m_CtrlInfo[m_nNumControls].m_apUpperLeft = apUpperLeft; <BR>&nbsp;&nbsp;m_CtrlInfo[m_nNumControls].m_apLowerRight = apLowerRight; <BR>&nbsp;&nbsp;RECT rcControl; <BR>&nbsp;&nbsp;GetWindowRect(hwndControl, &amp;rcControl); // 遮住控制项的coords <BR>&nbsp;&nbsp;// 转换coords至相对父视窗的类型 <BR>&nbsp;&nbsp;MapWindowPoints(HWND_DESKTOP, m_hwndParent, (PPOINT) &amp;rcControl, 2); <BR>&nbsp;&nbsp;RECT rcParent; <BR>&nbsp;&nbsp;GetClientRect(m_hwndParent, &amp;rcParent); <BR>&nbsp;&nbsp;POINT pt; <BR>&nbsp;&nbsp;PixelFromAnchorPoint(apUpperLeft, rcParent.right, rcParent.bottom, &amp;pt); <BR>&nbsp;&nbsp;m_CtrlInfo[m_nNumControls].m_ptULDelta.x = pt.x - rcControl.left; <BR>&nbsp;&nbsp;m_CtrlInfo[m_nNumControls].m_ptULDelta.y = pt.y - rcControl.top; <BR>&nbsp;&nbsp;PixelFromAnchorPoint(apLowerRight, rcParent.right, rcParent.bottom, &amp;pt); <BR>&nbsp;&nbsp;m_CtrlInfo[m_nNumControls].m_ptLRDelta.x = pt.x - rcControl.right; <BR>&nbsp;&nbsp;m_CtrlInfo[m_nNumControls].m_ptLRDelta.y = pt.y - rcControl.bottom; <BR>&nbsp;&nbsp;m_nNumControls++; <BR>&nbsp;&nbsp;fOk = TRUE; <BR>&nbsp;&nbsp;} <BR> leave:; <BR> } <BR> catch (...) { <BR> } <BR> chASSERT(fOk); <BR> return(fOk); <BR>} <BR>/////////////////////////////////////////////////////////////////////////////// <BR>BOOL CUILayout::AnchorControls(ANCHORPOINT apUpperLeft, <BR> ANCHORPOINT apLowerRight, BOOL fRedraw, ...) { <BR> BOOL fOk = TRUE; <BR> va_list arglist; <BR> va_start(arglist,fRedraw); <BR> int nID = va_arg(arglist,int); <BR> while (fOk &amp;&amp; (nID != -1)) { <BR>&nbsp;&nbsp;fOk = fOk &amp;&amp; AnchorControl(apUpperLeft, apLowerRight, nID, fRedraw); <BR>&nbsp;&nbsp;nID = va_arg(arglist, int); <BR> } <BR> va_end(arglist); <BR> return(fOk); <BR>} <BR>/////////////////////////////////////////////////////////////////////////////// <BR>BOOL CUILayout::AdjustControls(int cx, int cy) { <BR> BOOL fOk = FALSE; <BR> // 建立由已存在之所有控制项组成的区域 <BR> HRGN hrgnPaint = CreateRectRgn(0, 0, 0, 0); <BR> for (int n = 0; n &lt;m_nNumControls; n++) { <BR>&nbsp;&nbsp;HWND hwndControl = GetDlgItem(m_hwndParent, m_CtrlInfo[n].m_nID); <BR>&nbsp;&nbsp;RECT rcControl; <BR>&nbsp;&nbsp;GetWindowRect(hwndControl, &amp;rcControl); // Screen coords of control <BR>&nbsp;&nbsp;// 转换coords至相对父视窗的类别 <BR>&nbsp;&nbsp;MapWindowPoints(HWND_DESKTOP, m_hwndParent, (PPOINT) &amp;rcControl, 2); <BR>&nbsp;&nbsp;HRGN hrgnTemp = CreateRectRgnIndirect(&amp;rcControl); <BR>&nbsp;&nbsp;CombineRgn(hrgnPaint, hrgnPaint, hrgnTemp, RGN_OR); <BR>&nbsp;&nbsp;DeleteObject(hrgnTemp); <BR> } <BR> for (n = 0; n &lt; m_nNumControls; n++) { <BR>&nbsp;&nbsp;// 取得控制项的上/左边界,并使用父视窗的宽度/高度 <BR>&nbsp;&nbsp;RECT rcControl; <BR>&nbsp;&nbsp;PixelFromAnchorPoint(m_CtrlInfo[n].m_apUpperLeft, <BR>&nbsp;&nbsp; cx, cy, (PPOINT) &amp;rcControl); <BR>&nbsp;&nbsp;rcControl.left -= m_CtrlInfo[n].m_ptULDelta.x; <BR>&nbsp;&nbsp;rcControl.top&nbsp;&nbsp;-= m_CtrlInfo[n].m_ptULDelta.y; <BR>&nbsp;&nbsp;// 取得控制项的下/右边界,并使用父视窗的宽度/高度 <BR>&nbsp;&nbsp;PixelFromAnchorPoint(m_CtrlInfo[n].m_apLowerRight, <BR>&nbsp;&nbsp; cx, cy, (PPOINT) &amp;rcControl.right); <BR>&nbsp;&nbsp;rcControl.right -= m_CtrlInfo[n].m_ptLRDelta.x; <BR>&nbsp;&nbsp;rcControl.bottom -= m_CtrlInfo[n].m_ptLRDelta.y; <BR>&nbsp;&nbsp;// 控制项的位置/大小 <BR>&nbsp;&nbsp;HWND hwndControl = GetDlgItem(m_hwndParent, m_CtrlInfo[n].m_nID); <BR>&nbsp;&nbsp;MoveWindow(hwndControl, rcControl.left, rcControl.top, <BR>&nbsp;&nbsp; rcControl.right - rcControl.left, <BR>&nbsp;&nbsp; rcControl.bottom - rcControl.top, FALSE); <BR>&nbsp;&nbsp;if (m_CtrlInfo[n].m_fRedraw) { <BR>&nbsp;&nbsp; InvalidateRect(hwndControl, NULL, FALSE); <BR>&nbsp;&nbsp;} else { <BR>&nbsp;&nbsp; // 移除被控制项的新位置占用的区域 <BR>&nbsp;&nbsp; HRGN hrgnTemp = CreateRectRgnIndirect(&amp;rcControl); <BR>&nbsp;&nbsp; CombineRgn(hrgnPaint, hrgnPaint, hrgnTemp, RGN_DIFF); <BR>&nbsp;&nbsp; DeleteObject(hrgnTemp); <BR>&nbsp;&nbsp; // 使控制项自己重画 <BR>&nbsp;&nbsp; InvalidateRect(hwndControl, NULL, TRUE); <BR>&nbsp;&nbsp; SendMessage(hwndControl, WM_NCPAINT, 1, 0); <BR>&nbsp;&nbsp; UpdateWindow(hwndControl); <BR>&nbsp;&nbsp;} <BR> } <BR> // 画出对话方块之客户区的新显示部份 <BR> HDC hdc = GetDC(m_hwndParent); <BR> HBRUSH hbrColor = CreateSolidBrush(GetSysColor(COLOR_3DFACE)); <BR> FillRgn(hdc, hrgnPaint, hbrColor); <BR> DeleteObject(hbrColor); <BR> ReleaseDC(m_hwndParent, hdc); <BR> DeleteObject(hrgnPaint); <BR> return(fOk); <BR>} <BR>/////////////////////////////////////////////////////////////////////////////// <BR>void CUILayout::PixelFromAnchorPoint(ANCHORPOINT ap, <BR> int cxParent, int cyParent, PPOINT ppt){ <BR> ppt-&gt;x = ppt-&gt;y = 0; <BR> switch (ap) { <BR> case AP_TOPMIDDLE: <BR> case AP_CENTER: <BR> case AP_BOTTOMMIDDLE: <BR>&nbsp;&nbsp;ppt-&gt;x = cxParent / 2; <BR>&nbsp;&nbsp;break; <BR> case AP_TOPRIGHT: <BR> case AP_MIDDLERIGHT: <BR> case AP_BOTTOMRIGHT: <BR>&nbsp;&nbsp;ppt-&gt;x = cxParent; <BR>&nbsp;&nbsp;break; <BR> } <BR>switch|(ap){ <BR> case AP_MIDDLELEFT: <BR> case AP_CENTER: <BR> case AP_MIDDLERIGHT: <BR>&nbsp;&nbsp;ppt-&gt;y = cyParent / 2; <BR>&nbsp;&nbsp;break; <BR> case AP_BOTTOMLEFT: <BR> case AP_BOTTOMMIDDLE: <BR> case AP_BOTTOMRIGHT: <BR>&nbsp;&nbsp;ppt-&gt;y = cyParent; <BR>&nbsp;&nbsp;break; <BR> } <BR>} <BR>/////////////////////////////////////////////////////////////////////////////// <BR>#endif&nbsp;&nbsp; // UILAYOUT_IMPL <BR>///////////////////////////////// End of File /////////////////////////////////</PRE></FONT></DIV>
            <CENTER style="LINE-HEIGHT: 25px">
            <TABLE border=0>
              <TBODY style="LINE-HEIGHT: 25px">
              <TR>
                <TD align=middle><FONT style="LINE-HEIGHT: 25px" face=arial 
                  color=#000000 size=2><FONT style="LINE-HEIGHT: 25px" 
                  face=arial color=#3e80d7 size=2><B 
                  style="LINE-HEIGHT: 25px">&nbsp;列表B-4&nbsp;</B></FONT>UILayout.h标头文件</FONT></TD></TR></TBODY></TABLE></CENTER></A><A 
            style="LINE-HEIGHT: 25px" name=102005>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e70d7 
            size=5><B style="LINE-HEIGHT: 25px">I/O Completion Port C++ 
            类别(IOCP.h)<BR style="LINE-HEIGHT: 25px">  </B></FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>列表B-5中为简单的CIOCP C++ 类别,它只包装了Windows之I/O完成连接埠(I/O completion 
            port)的核心物件函数。所有的方法皆为内嵌的,所以当您使用此类别时不会有效能损失的情形。此函数的包装允许您用一个更逻辑的介面来操作一个I/O完成连接埠物件。</FONT></P>
            <DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT 
            style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">IOCP.h <BR>/******************************************************************** <BR>模组:IOCP.h <BR>通告:Copyright (c)2000 Jeffrey Richter <BR>目的:此类别包装了一个I/O Completion Port <BR> 请参阅附录B <BR>********************************************************************/ <BR>#pragma once&nbsp;&nbsp; // 在编辑单元时必须包含此标头档 <BR>/////////////////////////////////////////////////////////////////////////////// <BR>#include "..\CmnHdr.h" // 请参阅附录A <BR>/////////////////////////////////////////////////////////////////////////////// <BR>class CIOCP { <BR>public: <BR> CIOCP(int nMaxConcurrency = -1) { <BR>&nbsp;&nbsp;m_hIOCP = NULL; <BR>&nbsp;&nbsp;if (nMaxConcurrency != -1) <BR>&nbsp;&nbsp; (void) Create(nMaxConcurrency); <BR> } <BR> ~CIOCP() { <BR>&nbsp;&nbsp;if (m_hIOCP != NULL) <BR>&nbsp;&nbsp; chVERIFY(CloseHandle(m_hIOCP)); <BR> } <BR> BOOL Create(int nMaxConcurrency = 0) { <BR>&nbsp;&nbsp;m_hIOCP = CreateIoCompletionPort( <BR>&nbsp;&nbsp; INVALID_HANDLE_VALUE, NULL, 0, nMaxConcurrency); <BR>&nbsp;&nbsp;chASSERT(m_hIOCP != NULL); <BR>&nbsp;&nbsp;return(m_hIOCP != NULL); <BR> } <BR> BOOL AssociateDevice(HANDLE hDevice, ULONG_PTR CompKey) { <BR>&nbsp;&nbsp;BOOL fOk = (CreateIoCompletionPort(hDevice, m_hIOCP, CompKey, 0) <BR>&nbsp;&nbsp; == m_hIOCP); <BR>&nbsp;&nbsp;chASSERT(fOk); <BR>&nbsp;&nbsp;return(fOk); <BR> } <BR> BOOL AssociateSocket(SOCKET hSocket, ULONG_PTR CompKey) { <BR>&nbsp;&nbsp;return(AssociateDevice((HANDLE)hSocket, CompKey)); <BR> } <BR>BOOL PostStatus(ULONG_PTR CompKey, DWORD dwNumBytes = 0, <BR>&nbsp;&nbsp;OVERLAPPED* po = NULL) { <BR>&nbsp;&nbsp;BOOL fOk = PostQueuedCompletionStatus(m_hIOCP, dwNumBytes, CompKey, po); <BR>&nbsp;&nbsp;chASSERT(fOk); <BR>&nbsp;&nbsp;return(fOk); <BR> } <BR> BOOL GetStatus(ULONG_PTR* pCompKey, PDWORD pdwNumBytes, <BR>&nbsp;&nbsp;OVERLAPPED** ppo, DWORD dwMilliseconds = INFINITE) { <BR>&nbsp;&nbsp;return(GetQueuedCompletionStatus(m_hIOCP, pdwNumBytes, <BR>&nbsp;&nbsp; pCompKey, ppo,dwMilliseconds)); <BR> } <BR>private: <BR> HANDLE m_hIOCP; <BR>}; <BR>///////////////////////////////// End of File /////////////////////////////////</PRE></FONT></DIV>
            <CENTER style="LINE-HEIGHT: 25px">
            <TABLE border=0>
              <TBODY style="LINE-HEIGHT: 25px">
              <TR>
                <TD align=middle><FONT style="LINE-HEIGHT: 25px" face=arial 
                  color=#000000 size=2><FONT style="LINE-HEIGHT: 25px" 
                  face=arial color=#3e80d7 size=2><B 
                  style="LINE-HEIGHT: 25px">&nbsp;列表B-5&nbsp;</B></FONT>IOCP.h标头文件</FONT></TD></TR></TBODY></TABLE></CENTER></A><A 
            style="LINE-HEIGHT: 25px" name=102006>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e70d7 
            size=5><B style="LINE-HEIGHT: 25px">Security Information C++ 
            类别(SecInfo.h)<BR style="LINE-HEIGHT: 25px">  </B></FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>CsecInfo类别列于列表B-6中,它是一个非常小的IsecurityInformation之COM介面包装,即那些为了编辑一个物件的安全性而用来呼叫EditSecurity至程序的一般对话方块。CsecInfo类别仅实作Iunknown介面所需的成员,所以您的程序代码不需担心在使用EditSecurity时与COM相关的部份。</FONT></P>
            <P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000 
            size=2>如果您选择使用CsecInfo类别,那么您应该从它取得您所拥有的类别并实作基础类别的纯虚拟函数。</FONT></P>
            <DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT 
            style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">SecInfo.h <BR>/******************************************************************** <BR>模组: SecInfo.h <BR>通告: Copyright (c)2000 Jeffrey Richter <BR>目的: 此类别包装了那些被用来呼叫EditSecurity函数中使用的IsecurityInformation介面。 <BR>&nbsp;&nbsp; 请参阅附录B <BR>********************************************************************/ <BR>#pragma once&nbsp;&nbsp; // 一旦编辑单元时需包含此标头档 <BR>/////////////////////////////////////////////////////////////////////////////// <BR>#include "..\CmnHdr.h" // 请参阅附录A <BR>#include &lt;aclapi.h&gt; <BR>#include &lt;aclui.h&gt; <BR>/////////////////////////////////////////////////////////////////////////////// <BR>class CSecInfo:public ISecurityInformation { <BR>public: <BR> CSecInfo() { m_nRef = 1; m_fMod = FALSE; } <BR> BOOL IsModified() { return(m_fMod); } <BR>protected: <BR> virtual ~CSecInfo() {} <BR>protected: <BR> void Modified() { m_fMod = TRUE; } <BR> static GUID m_guidNULL; <BR> static SI_ACCESS m_siAccessAllRights[]; <BR>private: <BR> ULONG&nbsp;&nbsp;m_nRef; <BR> BOOL&nbsp;&nbsp;m_fMod; <BR>public: <BR> HRESULT WINAPI QueryInterface(REFIID riid, PVOID* ppvObj); <BR> ULONG WINAPI AddRef(); <BR> ULONG WINAPI Release(); <BR> HRESULT UseStandardAccessRights(const GUID* pguidObjectType, DWORD dwFlags, <BR>&nbsp;&nbsp;PSI_ACCESS* ppAccess, ULONG* pcAccesses, ULONG* piDefaultAccess); <BR>protected: <BR> HRESULT WINAPI GetObjectInformation(PSI_OBJECT_INFO pObjectInfo) = 0; <BR> HRESULT WINAPI GetSecurity(SECURITY_INFORMATION RequestedInformation, <BR>&nbsp;&nbsp;PSECURITY_DESCRIPTOR* ppSecurityDescriptor, BOOL fDefault) = 0; <BR> HRESULT WINAPI SetSecurity(SECURITY_INFORMATION SecurityInformation, <BR>&nbsp;&nbsp;PSECURITY_DESCRIPTOR pSecurityDescriptor) = 0; <BR> HRESULT WINAPI GetAccessRights(const GUID* pguidObjectType, <BR>&nbsp;&nbsp;DWORD dwFlags, // SI_EDIT_AUDITS, SI_EDIT_PROPERTIES <BR>&nbsp;&nbsp;PSI_ACCESS *ppAccess, ULONG *pcAccesses, ULONG *piDefaultAccess) = 0; <BR> HRESULT WINAPI MapGeneric(const GUID *pguidObjectType, <BR>&nbsp;&nbsp;UCHAR *pAceFlags, ACCESS_MASK *pMask) = 0; <BR> HRESULT WINAPI GetInheritTypes(PSI_INHERIT_TYPE* ppInheritTypes, <BR>&nbsp;&nbsp;ULONG *pcInheritTypes); <BR> HRESULT WINAPI PropertySheetPageCallback(HWND hwnd, UINT uMsg, <BR>&nbsp;&nbsp;SI_PAGE_TYPE uPage); <BR> PSECURITY_DESCRIPTOR&nbsp;&nbsp;<BR>&nbsp;&nbsp;LocalAllocSDCopy(PSECURITY_DESCRIPTOR psd); <BR>}; <BR>/////////////////////////////////////////////////////////////////////////////// <BR>#ifdef SECINFO_IMPL <BR>/////////////////////////////////////////////////////////////////////////////// <BR>GUID CSecInfo::m_guidNULL = GUID_NULL; <BR>#define RIGHT(code, text, fGeneral, fSpecific) \ <BR> {&amp;m_guidNULL, code, L ##text,&nbsp;&nbsp; \ <BR>&nbsp;&nbsp;(0 |(fGeneral ?SI_ACCESS_GENERAL : 0) | \ <BR>&nbsp;&nbsp; (fSpecific ?SI_ACCESS_SPECIFIC : 0)) } <BR>static SI_ACCESS CSecInfo::m_siAccessAllRights[] == { <BR> RIGHT(DELETE, "DELETE", TRUE, FALSE), <BR> RIGHT(READ_CONTROL, "READ_CONTROL", TRUE, FALSE), <BR> RIGHT(WRITE_DAC, "WRITE_DAC", TRUE, FALSE), <BR> RIGHT(WRITE_OWNER, "WRITE_OWNER", TRUE, FALSE), <BR> RIGHT(SYNCHRONIZE, "SYNCHRONIZE", TRUE, FALSE), <BR> RIGHT(STANDARD_RIGHTS_REQUIRED, "STANDARD_RIGHTS_REQUIRED", TRUE, FALSE), <BR> RIGHT(STANDARD_RIGHTS_READ, "STANDARD_RIGHTS_READ", TRUE, FALSE), <BR> RIGHT(STANDARD_RIGHTS_WRITE, "STANDARD_RIGHTS_WRITE", TRUE, FALSE), <BR> RIGHT(STANDARD_RIGHTS_EXECUTE, "STANDARD_RIGHTS_EXECUTE", TRUE, FALSE), <BR> RIGHT(STANDARD_RIGHTS_ALL, "STANDARD_RIGHTS_ALL", TRUE, FALSE), <BR> RIGHT(SPECIFIC_RIGHTS_ALL, "SPECIFIC_RIGHTS_ALL", TRUE, FALSE), <BR> RIGHT(ACCESS_SYSTEM_SECURITY, "ACCESS_SYSTEM_SECURITY", TRUE, FALSE), <BR> RIGHT(MAXIMUM_ALLOWED, "MAXIMUM_ALLOWED", TRUE, FALSE), <BR>}; <BR>/////////////////////////////////////////////////////////////////////////////// <BR>PSECURITY_DESCRIPTOR CSecInfo::LocalAllocSDCopy(PSECURITY_DESCRIPTOR pSD) { <BR> DWORD dwSize = 0; <BR> SECURITY_DESCRIPTOR_CONTROL sdc; <BR> PSECURITY_DESCRIPTOR pSDNew = NULL; <BR> DWORD dwVersion; <BR> __try { <BR>&nbsp;&nbsp;if (pSD == NULL) __leave; <BR>&nbsp;&nbsp;if (!GetSecurityDescriptorControl(pSD, &amp;sdc, &amp;dwVersion)) __leave; <BR>&nbsp;&nbsp;if ((sdc &amp; SE_SELF_RELATIVE) != 0) { <BR>&nbsp;&nbsp; dwSize = GetSecurityDescriptorLength(pSD); <BR>&nbsp;&nbsp; if (dwSize == 0) __leave; <BR>&nbsp;&nbsp; pSDNew = LocalAlloc(LPTR, dwSize); <BR>&nbsp;&nbsp; if (pSDNew == NULL)__leave; <BR>&nbsp;&nbsp; CopyMemory(pSDNew, pSD, dwSize); <BR>&nbsp;&nbsp;} else { <BR>&nbsp;&nbsp; if (MakeSelfRelativeSD(pSD, NULL, &amp;dwSize)) __leave; <BR>&nbsp;&nbsp; else if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) __leave; <BR>&nbsp;&nbsp; pSDNew = LocalAlloc(LPTR, dwSize); <BR>&nbsp;&nbsp; if (pSDNew == NULL) __leave; <BR>&nbsp;&nbsp; if (!MakeSelfRelativeSD(pSD, pSDNew, &amp;dwSize)) { <BR>&nbsp;&nbsp;&nbsp;&nbsp;LocalFree(pSDNew); <BR>&nbsp;&nbsp;&nbsp;&nbsp;pSDNew = NULL; <BR>&nbsp;&nbsp; } <BR>&nbsp;&nbsp;} <BR> } <BR> __ finally { <BR> } <BR> return(pSDNew); <BR>} <BR>/////////////////////////////////////////////////////////////////////////////// <BR>HRESULT CSecInfo::QueryInterface(REFIID riid, PVOID* ppvObj) { <BR> HRESULT hr = E_NOINTERFACE; <BR> if ((riid == IID_ISecurityInformation) || (riid == IID_IUnknown)) { <BR>&nbsp;&nbsp;*ppvObj = this; <BR>&nbsp;&nbsp;AddRef(); <BR>&nbsp;&nbsp;hr = S_OK; <BR> } <BR> return(hr); <BR>} <BR>/////////////////////////////////////////////////////////////////////////////// <BR>ULONG CSecInfo::AddRef() { <BR> m_nRef++; <BR> return(m_nRef); <BR>} <BR>/////////////////////////////////////////////////////////////////////////////// <BR>ULONG CSecInfo::Release() { <BR> ULONG nRef =--m_nRef; <BR> if (m_nRef == 0) <BR>&nbsp;&nbsp;delete this; <BR> return(nRef); <BR>} <BR>/////////////////////////////////////////////////////////////////////////////// <BR>HRESULT CSecInfo::UseStandardAccessRights(const GUID* pguidObjectType, <BR> DWORD dwFlags, PSI_ACCESS* ppAccess, ULONG* pcAccesses, <BR> ULONG* piDefaultAccess) { <BR> *ppAccess = m_siAccessAllRights; <BR> *pcAccesses = chDIMOF(m_siAccessAllRights); <BR> *piDefaultAccess = 0; <BR> return(S_OK); <BR>} <BR>/////////////////////////////////////////////////////////////////////////////// <BR>HRESULT CSecInfo::GetInheritTypes(PSI_INHERIT_TYPE*ppInheritTypes, <BR> ULONG* pcInheritTypes) { <BR> *ppInheritTypes = NULL; <BR> *pcInheritTypes = 0; <BR> return(S_OK); <BR>} <BR>/////////////////////////////////////////////////////////////////////////////// <BR>HRESULT CSecInfo::PropertySheetPageCallback(HWND hwnd, UINT uMsg, <BR> SI_PAGE_TYPE uPage) { <BR> return(S_OK); <BR>} <BR>/////////////////////////////////////////////////////////////////////////////// <BR>#pragma comment(lib, "ACLUI.lib")&nbsp;&nbsp; // 强迫连结此程序库 <BR>/////////////////////////////////////////////////////////////////////////////// <BR>#endif&nbsp;&nbsp; // SECINFO_IMPL <BR>///////////////////////////////// End of File /////////////////////////////////</PRE></FONT></DIV>
            <CENTER style="LINE-HEIGHT: 25px">
            <P></P>
            <P class=content_page><A 
            href="http://www.acejoy.com/Html/Article/network/6920061106222109_P2.html">上一页</A>&nbsp;&nbsp;<A 
            href="http://www.acejoy.com/Html/Article/network/6920061106222109.html">[1]</A>&nbsp;<A 
            href="http://www.acejoy.com/Html/Article/network/6920061106222109_P2.html">[2]</A>&nbsp;<STRONG><FONT 
            color=#ff0033>[3]</FONT></STRONG>&nbsp;<A 
            href="http://www.acejoy.com/Html/Article/network/6920061106222109_P4.html">[4]</A>&nbsp;&nbsp;<A 
            href="http://www.acejoy.com/Html/Article/network/6920061106222109_P4.html">下一页</A></P></DIV><BR><BR></CENTER></TD></TR></TBODY></TABLE>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?