??xml version="1.0" encoding="utf-8" standalone="yes"?>99久久精品毛片免费播放,亚洲色欲久久久久综合网,欧美日韩精品久久久免费观看http://www.shnenglu.com/michaelgao/category/7399.htmlzh-cnFri, 03 Oct 2008 16:07:40 GMTFri, 03 Oct 2008 16:07:40 GMT60windows 对话?/title><link>http://www.shnenglu.com/michaelgao/archive/2008/10/03/63200.html</link><dc:creator>micheal's tech</dc:creator><author>micheal's tech</author><pubDate>Fri, 03 Oct 2008 13:55:00 GMT</pubDate><guid>http://www.shnenglu.com/michaelgao/archive/2008/10/03/63200.html</guid><wfw:comment>http://www.shnenglu.com/michaelgao/comments/63200.html</wfw:comment><comments>http://www.shnenglu.com/michaelgao/archive/2008/10/03/63200.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/michaelgao/comments/commentRss/63200.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/michaelgao/services/trackbacks/63200.html</trackback:ping><description><![CDATA[Windows 对话?br>  ֐思义Q对话框是应用程序创建的一个窗口,l出用户一些信息或者接收用L输入。Delphi 中没有创建对话框? 模板Q除了通用的对话框如打开对话框、字体对话框、颜色对话框{)。Delphi 本n使用 TForm 创徏对话框。对话框可以使得临时输入的窗口创? 更加Ҏ。不?nbsp;CreateWindow( ) 创徏一个弹出窗口然后在上面d控gQ你只要制作一个资源模板,然后调用 DialogBox 可? 了。本例中我们创徏q用资源模板,然后调用 Windows DialogBox( ) 函数。你可以参?nbsp;Win32 API 帮助? “Dialog Boxes”部分。在E序CZ里我使用 DialogBox( ) 创徏了一个模式对话框。你需要ؓ它准备好一个对话框资源文g “Dlg1.RES”?nbsp;<br><br><br>对话框资源的创徏<br>  你需要?nbsp;brcc32.exe ~译对话框资源。这?nbsp;Delphi 帮助文档中没有详l说明。下面我们开始创Z个非常简单的对话框资?nbsp;.RC 文g?br><br>First DIALOG  12, 10, 206, 86<br>     STYLE WS_POPUP | WS_DLGFRAME | WS_CAPTION<br>     CAPTION " A Dialog Form"<br>     FONT 10, "MS Sans Serif"<br>     {<br>     LTEXT "Simple Dialog"  200, 8, 6, 196, 8<br>     PUSHBUTTON "OK"   IDOK, 48, 71,  32, 12<br>     }<br><br>  q是 C 语言代码Q不?nbsp;Pascal 代码。第一?#8220;First”是资源名字,像下面一行的“MyIcon”?br><br>MyIcon  ICON  Floppy.ico<br><br> 对于 .RC 文g内的图标QDIALOG 是一U资源,12?0?06?6 是对话框的标准的上、左、宽、高参数Q单位不是像素,对话框单位参 ?nbsp;Win32 API 帮助?#8220;GetDialogBaseUnits”Q。上和左与它的父H体的上和左相关Q以父窗体ؓ参考原炏V接下里? 是:STYLE WS_POPUP | WS_DLGFRAME | WS_CAPTION Q这些设|了对话框窗体的创徏风格Q?nbsp;C 语言? ?nbsp;| ?nbsp;Pascal 语言中的 or 一P。还有一些其他的对话框风|<br><br>DS_LOCALEDIT -指定~辑框控件在对话框上 使用E序数据模块的内存。默认情况下Q对话框上的~辑框控件是使用应用E序数据模块之外的内存的。如果没有用这个标志,那么不要向编辑框? ?nbsp;EM_GETHANDLE ?nbsp;EM_SETHANDLE 消息Q因为控件没有存储在E序的数据模块?br><br>DS_MODALFRAME -创徏一个模式对话框Q对话框可以通过指定 WS_CAPTION ?nbsp;WS_SYSMENU l合标题栏和pȝ菜单?br><br>DS_NOIDLEMSG -止 Windows 或其它程序在对话框显C时向它?nbsp;owner H体发?nbsp;WM_ENTERIDLE 消息?br><br>DS_SYSMODAL -创徏一个系l的模式对话框?br><br> 如果你用了 WS_CAPTION 风格Q那?#8220;CAPTION " A Dialog Form"”q行在对话框标题上放上q个字符 Ԍ“FONT 10, "MS Sans Serif"”会讄对话框内所有控件字体和寸。{ ?nbsp;} 对应 Pascal ? ?nbsp;begin ?nbsp;end Q在 { } 之间你可以放|希望出现在对话框上的控ӞPUSHBUTTON 是一个按钮,参数? ?nbsp;PUSHBUTTON 之后QŞ式如Q?br>PUSHBUTTON "Text on Control" IDNUMBER, Left, Top, Width, Height 后面的参Cؓ对话框单位而不是像素。这里创建的对话?nbsp;206 单位宽?6 单位高、左侧距父窗?nbsp;12 单位、顶部距父窗?nbsp;10 单位Q对话框 上有静态文本框和按钮两个控件?br><br>其他对话框控?br>  对话框控件的语法形式为:<br>controlName text, IDnumber, Left, Top, Width, Height, style, extended-style<br><br>DEFPUSHBUTTON "Cancel" IDCANCEL, 8, 67,  32, 12<br>LTEXT "Static Text Left aligned"  201, 5, 21, 196, 24<br>CTEXT "Static Text Centered"     202, 18, 12, 170, 8<br>ICON  "Icon" -1, 1,1,0,0<br>EDITTEXT 300, 9, 47, 180, 50, ES_MULTILINE, WS_EX_CLIENTEDGE<br>CHECKBOX "Check Box", 100, 10, 60, 69, 8<br>AUTOCHECKBOX "Auto CheckBox", 101, 140, 60, 61, 8<br>RADIOBUTTON "radio", 400, 8, 32, 64, 8<br>AUTORADIOBUTTON "needs WS_GROUP", 401, 8, 42, 64, 8, WS_GROUP<br>GROUPBOX "GroupBox", -1, 4,22,150,42<br>   <br>你可以通过攄控gcd名字参数创徏大部?nbsp;Windows 控gQ参见下文的“在对话框中包含常规控?#8221;部分?br><br>  使用 DialogBox(hInstance, lpTemplate, hWndParent, lpDialogFunc);<br>? 见程序代码的“procedure DoDialog”Q你会发现它讄对话框用的一些变量,然后调用 DialogBox( )? lpTemplate 源名U的 PChar cdQ父H体?nbsp;hForm1 QlpDialogFunc 讄为对话框函数的地址Q参见帮助中 ?nbsp;DialogProc 部分Q。这?nbsp;DialogProc cM?nbsp;WndProc Q用于获取对话框消息Q参见代码中 ?nbsp;DialogProc ?nbsp;WM_INITDIALOG 消息被发送后对话框就被创ZQ因此你可以在这里设|控件。由于对话框是从模板创徏的,所? 控g的句柄还不知道,q样可以?nbsp;ID L讉K它们。通过 GetDlgItem(hWnd,IDNUMBER) 获取控g的句柄,你可以用大量控? ?nbsp;SendMessage 或者状态变化(Enable( ) {)。有几个特定的对话框函数Ҏ ID ~号直接使用 QSendDlgItemMessage?nbsp;CheckDlgButton?nbsp;SetDlgItemText?nbsp;GetDlgItemTextQ? ?nbsp;WM_COMMAND 消息中,LOWORD(wParam) 是控g?nbsp;ID L?br><br><br>有待完善…… <br><br><br>对于本文的对话框演示E序Q用的“Dlg1.rc”源文件代码如下:<br><br>Z1 ICON Done2.ICO<br>Z2 ICON Flop.ICO<br><br>First DIALOG  12, 10, 206, 86<br>     STYLE WS_POPUP | WS_DLGFRAME | WS_CAPTION | WS_SYSMENU<br>     CAPTION " A Dialog Form"<br>     FONT 10, "MS Sans Serif"<br>     {<br>     CTEXT "Dialogs are really NON Delphi" 200, 18, 1, 170, 10<br>     ICON  "Z1" -1, 1,1,0,0<br>     ICON  "Z2" -1, 189,1,0,0<br>     CTEXT "Checkbox was Unchecked"     201, 18, 12, 170, 8<br>     LTEXT " "  202, 5, 21, 196, 24<br>     EDITTEXT      300, 14, 47, 100, 10<br>     AUTOCHECKBOX "Show MessageBox", 100, 10, 60, 69, 8<br>     AUTOCHECKBOX "Check me", 101, 140, 60, 61, 8<br>     DEFPUSHBUTTON "OK"   IDOK, 48, 71,  32, 12, WS_GROUP<br>     PUSHBUTTON "set Edit Text"   401, 108, 71,  44, 12,<br>     }<br> <br>  使用 brcc32.exe ~译 Dlg1.rc 文gQ我不知道ؓ什么可以不使用“ #include <windows.h>”Q但是确实通过~译了(生成 Dlg1.RES 文gQ?br><br>对话框程?br>  本程序演CZ创徏与?nbsp;Windows 对话框的ҎQ你需要用上面代码编译得到的 Dlg1.RES 文g?nbsp; <br><br>program Dialogs;<br><br>uses<br>  Windows, Messages, smallUtils;<br>{$R *.RES}<br>{$R Dlg1.RES}<br>var<br>  wClass: TWndClass;<br>  hForm1, hExitBut, hDlgBut, hCheckCB, hEdit1,<br>  hLabel1, Font1, hLabel2, hLabel3: THandle;<br>  mainMsg: TMSG;<br>  Rect1: TRect;<br>  DlgText, DlgEditText: String;<br>  DlgChk, Dlg2Chk: Boolean;<br><br>function DialogProc(hWnd,Msg,wParam,lParam:Longint):Boolean; stdcall;<br>{q里处理对话框消息。有些消息如 WndProc 消息QWM_COMMAND、WM_CLOSEQ列<br>在这里,有些消息QWM_INITDIALOGQ没有列出。在对话?nbsp;Proc l常使用<br> DlgItem ID 而不?nbsp;hWnd }<br>var<br>  OKrect:TRect;<br>begin<br>  Result := False;<br>  case Msg of<br>WM_INITDIALOG: begin<br>                 {WM_INITDIALOG 是设|你?nbsp;Dlg Items 属性的地方Q有些特定的<br>                 DlgItem 函数QSendDlgItemMessage、SetDlgItemTextQ?br>                 Ҏ比较有用。}<br>                 DlgEditText := '';<br>                 SendMessage(hWnd, WM_SETICON, 1, LoadIcon(hInstance,'Z1'));<br>                 {对话框默认用图标,你需要设|图标}<br>                 SendDlgItemMessage(hWnd,200,WM_SETFONT,Font1, 0);<br>                 {SendDlgItemMessage 使用 ID ~号代替 hWnd}<br>                 CheckDlgButton(hWnd,100,BST_CHECKED);<br>                 if SendMessage(hCheckCB,BM_GETCHECK,0,0) = BST_CHECKED then<br>                 begin<br>                   {你可以从ȝ体获取信息来讄对话框}<br>                   SetWindowText(GetDlgItem(hWnd,201),'多选按钮被N?);<br>                   {q里可以使用 SetWindowTextQ但是一样可以?nbsp;SetDlgItemText?br>                   SetDlgItemText(hWnd,201,'查框被勾?);}<br>                   EnableWindow(GetDlgItem(hWnd,101),False);<br>                   {大部分改变窗口的函数对于对话框一h效}<br>                 end;<br>                 {SetWindowText(GetDlgItem(hWnd,202),PChar(DlgText));}<br>                 SetDlgItemText(hWnd,202,PChar(DlgText));<br>                 SetDlgItemText(hWnd,300,PChar(GetWindowStr(hEdit1)));<br>                 GetWindowRect(GetDlgItem(hWnd,IDOK),OKrect);<br>                 SetCursorPos(OKrect.Left+10,OKrect.Top+10);<br>               end;<br>WM_COMMAND: begin<br>              {?nbsp;MessageProc ?nbsp;WM_COMMAND 消息不一PwParam ?nbsp;LParam<br>              有不同的用途。}<br>              if LOWORD(wParam) = IDOK then<br>              begin<br>                {对话框在 LOWORD(wParam) 使用 DlgItem ID}<br>                if (IsDlgButtonChecked(hWnd,101) = BST_CHECKED)<br>                then  Dlg2Chk := True;<br>                if (IsDlgButtonChecked(hWnd,100) = BST_CHECKED) then<br>                begin<br>                  MessageBox(hWnd,'对话框上多选按钮被N?,<br>                    '退出对话框',MB_OK or MB_ICONQUESTION);<br>                  DlgChk := True;<br>                end;<br>                DlgEditText := GetWindowStr(GetDlgItem(hWnd,300));<br>                EndDialog(hWnd,1);<br>                Result := True;<br>              end<br>              else if LOWORD(wParam) = 401<br>                   then SetDlgItemText(hWnd,300, '新的~辑框文?)<br>                   else if LOWORD(wParam) = 101<br>                        then  MessageBox(hWnd,'对话框上多选按钮被单击',<br>                                  '单击?,MB_OK or MB_ICONQUESTION);<br>            end;<br>WM_CLOSE: begin<br>            {?nbsp;MessageProc 不一P你需要?nbsp;EndDialog 退Z个对话框}<br>            EndDialog(hWnd,1);<br>            Result := True;<br>          end;<br>  end;<br>end;<br><br>procedure DoDialog;<br>var<br>  Dsize: TdriveSize;<br>begin<br>  if hLabel3 <> 0 then<br>  begin<br>    DestroyWindow(hLabel3);<br>    while PeekMessage(mainMsg, 0, 0, 0, PM_REMOVE)<br>    do  DispatchMessage(mainMsg);<br>    hLabel3 := 0;<br>  end;<br>  Dsize := DiskSpace('C:\');<br>  DlgText := 'C 盘d量ؓ  '+Int2Str(Dsize.TotalS)+<br>           ' 字节 - 可用I间?nbsp; '+ Int2Str(Dsize.FreeS);<br>  {DlgText 被用于对话框的静态标{控Ӟ你应该在调用 DialogBox( ) 前设|好对话?br>  需要的所有的变量。}<br>  DialogBox(hInstance, 'First', hForm1, @DialogProc);<br>  {DialogBox 根据资?nbsp;DIALOG ?nbsp;'First' 创徏一个模式对话框Q它?nbsp;hForm1 作ؓ<br>  父窗体,?nbsp;DialogProc 作ؓ WndProc (MessageProc)}<br>  {可以从对话框获取q回值}<br>  if DlgChk then<br>  MessageBox(hForm1,'q里 DlgChk = True',<br>      '对话框返回?,MB_OK or MB_ICONQUESTION);<br>  if Dlg2Chk then<br>  begin<br>    hLabel3 := CreateWindow('Static', '"Check me" 多选按钮被N?,<br>         WS_VISIBLE or WS_CHILD or SS_CENTER,6,200,370,29,hForm1,0,hInstance,nil);<br>    SendMessage(hLabel3, WM_SETFONT, Font1,0);<br>  end;<br>  SetWindowText(hLabel2,@DlgEditText[1]);<br>  DlgChk := False;<br>  Dlg2Chk := False;<br>end;<br><br>function MessageProc(hWnd,Msg,wParam,lParam:Integer):Integer; stdcall;<br>begin<br>  case Msg of<br>    WM_COMMAND: if lParam = abs(hExitBut)<br>                then PostMessage(hForm1,WM_CLOSE,0,0)<br>                else if (LParam = abs(hDlgBut))<br>                     then DoDialog;<br>    WM_DESTROY: PostQuitMessage(0);<br>  end; // case 语句l束<br>  Result := DefWindowProc(hWnd,Msg,wParam,lParam);<br>end;<br><br>begin     // ȝ序开?nbsp;//<br>  DlgChk := False;<br>  Dlg2Chk := False;<br>  hLabel3 := 0;<br><br>  Font1 := CreateFont(-16,0,0,0,FW_BOLD,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,<br>   CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,VARIABLE_PITCH or FF_SWISS,'Arial');<br><br>  wClass.hInstance := hInstance;<br>  with wClass do<br>  begin<br>    style :=        CS_PARENTDC or CS_BYTEALIGNWINDOW;<br>    hIcon :=        LoadIcon(hInstance,'MAINICON');<br>    lpfnWndProc :=  @MessageProc;<br>    hbrBackground:= COLOR_BTNFACE+1;<br>    lpszClassName:= 'Form Class';<br>    hCursor :=      LoadCursor(0,IDC_ARROW);<br>  end;<br>  RegisterClass(wClass);<br><br>  SetRect(Rect1,0,0,430,300);<br>  if not AdjustWindowRect(Rect1,WS_CAPTION or WS_MINIMIZEBOX or WS_SYSMENU,False)<br>  then SetRect(Rect1,0,0,438,328);<br><br>  hForm1 := CreateWindow(wClass.lpszClassName, '对话框演C程?,<br>    WS_CAPTION or WS_MINIMIZEBOX or WS_SYSMENU or WS_VISIBLE,<br>    (GetSystemMetrics(SM_CXSCREEN) div 2)-200,<br>    (GetSystemMetrics(SM_CYSCREEN) div 2)-160,<br>    Rect1.Right-Rect1.Left, Rect1.Bottom-Rect1.Top,<br>    0, 0, hInstance, nil);<br><br>  hLabel1 := CreateWindow('Static', '对话框演C?,<br>         WS_VISIBLE or WS_CHILD or SS_CENTER,8,8,388,22,hForm1,0,hInstance,nil);<br>  SendMessage(hLabel1,WM_SETFONT,Font1,0);<br><br>  hLabel2 := CreateWindow('Static',<br>         '在下面输入你x|到对话框的文字'#10'对话框编辑框如数的文字将在此昄',<br>         WS_VISIBLE or WS_CHILD or SS_LEFT,10,38,290,28,hForm1,0,hInstance,nil);<br>  SendMessage(hLabel2,WM_SETFONT,GetStockObject(ANSI_VAR_FONT),0);<br><br>  hExitBut := CreateWindow('Button','退 ?,<br>    WS_VISIBLE or WS_CHILD or BS_PUSHBUTTON or BS_TEXT,<br>    350,270,74,24, hForm1,0, hInstance,nil);<br><br>  hEdit1 := CreateWindowEx(WS_EX_CLIENTEDGE,'Edit','q里输入的文字将昄在对话框?,<br>    WS_VISIBLE or WS_CHILD or ES_LEFT or ES_AUTOHSCROLL,<br>    16,78,410,21,hForm1,0,hInstance,nil);<br>  SendMessage(hEdit1,WM_SETFONT,GetStockObject(ANSI_VAR_FONT),0);<br><br>  hDlgBut := CreateWindow('Button','昄对话?,<br>    WS_VISIBLE or WS_CHILD or BS_PUSHBUTTON or BS_TEXT,<br>    30,160,144,24, hForm1,0, hInstance,nil);<br>  SendMessage(hDlgBut, WM_SETFONT, GetStockObject(ANSI_VAR_FONT),0);<br><br>  hCheckCB := CreateWindow('Button','对话框多选检按?,<br>    WS_CHILD or BS_AUTOCHECKBOX or WS_VISIBLE,<br>    20,130,190,24, hForm1,0,hInstance,nil);<br>  SendMessage(hCheckCB, WM_SETFONT, GetStockObject(ANSI_VAR_FONT),0);<br><br>  while GetMessage(mainMsg,0,0,0) do<br>  begin<br>    TranslateMessage(mainMsg);<br>    DispatchMessage(mainMsg);<br>  end;<br>  DeleteObject(Font1);<br>  DlgText := '';<br>  DlgEditText := '';<br>end.<br><br> <br><br>在对话框中包含常规控?br>  Z在对话框里创建预定义的控件类Q可以用如下的一般语法,参数为:<br><br>ClassName text, IDnumber, x, y, width, height , style , extended-style<br>  X ?nbsp;width 是水qx向单位,是对话框基本宽度单位?nbsp;1/4 QY ?nbsp;height 是竖直方向单位,是对话框基本高度单位?nbsp;1 /8 。当前对话框基本单位是计机从当前系l字体的高度和宽度得到的QGetDialogBaseUnits( ) 函数可以q回对话框基本单位的对应 像素倹{?br><br>ControlName - 预定义的控g的类名,比如 BUTTON?nbsp;COMBOBOX?nbsp;EDIT?nbsp;LISTBOX?nbsp;SCROLLBAR?nbsp;STATIC {?br><br>text - ? 定控件上昄的文本。文本位|在控g指定寸之内或者接q控件。这个参数是有双引号Q?Q括h?nbsp;0 到多个字W。字W串自动以零l束q在资源文gq回 l果中{换成 Unicode 字符。默认情况下Q双引号括v的字W是 ANSI 字符Q交换码序被认为是按位交换码顺序。如果字W串加上 L 前缀Q? 字符串被认ؓ是宽字符l成Q交换码序被认为是两位交换码,q就?nbsp;Unicode 字符。如果双引号本n在文本内Q那么需要连l用双引号两次? And W号Q?amp;Q放在文本中表示后面跟着的字W是控g的助记符Q加速字W)Q当控g昄的时候,& 不会出现Q后面的字符会自动加上下 划线昄Q用户可以通过按下下划U助记符来选择q个控g。ؓ了在字符串中使用 & 字符Q你需要连l两ơ用(&&Q?br><br>IDnumber - 指定控g标识。这个gؓ Word cdQ介?nbsp;0 ?nbsp;65,535 之间?br><br>x - l出控g在对话框客户区域左边距,q个gؓ Word cdQ介?nbsp;0 ?nbsp;65,535 之间。这个坐标u在对话框的客户区域的左边~ؓ 0 对话框单位?br><br>y - l出控g在对话框客户区域上边距,q个gؓ Word cdQ介?nbsp;0 ?nbsp;65,535 之间。这个坐标u在对话框的客户区域的上边~ؓ 0 对话框单位?br><br>width - ? 定控件宽度,q个gؓ Word cdQ介?nbsp;1 ?nbsp;65,535 之间。宽度单位ؓ 1/4 字符? Specifies the width of the control. This value must be a Word value in the range 1 through 65,535. The width is in 1/4-character units. <br>height - 指定控g高度Q这个gؓ Word cdQ介?nbsp;1 ?nbsp;65,535 之间。宽度单位ؓ 1/8 字符?nbsp;<br><br>style - 指定控g的风根{利用逻辑或操作( | Q组合多个风根{?nbsp;<br><br>extended-style - 指定扩展风格QWS_EX_xxxQ。你必须l定一U风g便用扩展风?img src ="http://www.shnenglu.com/michaelgao/aggbug/63200.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/michaelgao/" target="_blank">micheal's tech</a> 2008-10-03 21:55 <a href="http://www.shnenglu.com/michaelgao/archive/2008/10/03/63200.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Debug ?Release ~译方式的本质区?/title><link>http://www.shnenglu.com/michaelgao/archive/2008/06/18/53909.html</link><dc:creator>micheal's tech</dc:creator><author>micheal's tech</author><pubDate>Wed, 18 Jun 2008 09:30:00 GMT</pubDate><guid>http://www.shnenglu.com/michaelgao/archive/2008/06/18/53909.html</guid><wfw:comment>http://www.shnenglu.com/michaelgao/comments/53909.html</wfw:comment><comments>http://www.shnenglu.com/michaelgao/archive/2008/06/18/53909.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/michaelgao/comments/commentRss/53909.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/michaelgao/services/trackbacks/53909.html</trackback:ping><description><![CDATA[<p>一、Debug ?Release ~译方式的本质区?/p> <p>    Debug 通常UCؓ调试版本Q它包含调试信息Qƈ且不作Q何优化,便于E序员调试程序。Release UCؓ发布版本Q它往往是进行了各种优化Q得程序在代码大小和运行速度上都是最优的Q以便用户很好地使用?br>    Debug ?Release 的真正秘密,在于一l编译选项。下面列Z分别针对二者的选项Q当焉此之外还有其他一些,?Fd /FoQ但区别q不重要Q通常他们也不会引?Release 版错误,在此不讨论)<br>    <br>Debug 版本Q?br> /MDd /MLd ?/MTd   使用 Debug runtime library(调试版本的运行时d数库)<br> /Od                 关闭优化开?br> /D "_DEBUG"         相当?#define _DEBUG,打开~译调试代码开?主要针对<br>                     assert函数)<br> /ZI                 创徏 Edit and continue(~辑l箋)数据库,q样在调试过<br>                     E中如果修改了源代码不需重新~译<br> /GZ                 可以帮助捕获内存错误<br> /Gm                 打开最化重链接开养I减少链接旉<br>                     <br>Release 版本Q?nbsp;      <br> /MD /ML ?/MT      使用发布版本的运行时d数库<br> /O1 ?/O2          优化开养I使程序最或最?br> /D "NDEBUG"         关闭条g~译调试代码开?即不~译assert函数)<br> /GF                 合ƈ重复的字W串Qƈ字W串帔R攑ֈ只读内存Q防?br>                     被修?/p> <p>    实际上,Debug ?Release q没有本质的界限Q他们只是一l编译选项的集合,~译器只是按照预定的选项行动。事实上Q我们甚臛_以修改这些选项Q从而得C化过的调试版本或是带跟踪语句的发布版本?br>    <br>二、哪些情况下 Release 版会出错</p> <p>    有了上面的介l,我们再来逐个对照q些选项看看 Release 版错误是怎样产生?br>    <br> 1. Runtime LibraryQ链接哪U运行时d数库通常只对E序的性能产生影响。调试版本的 Runtime Library 包含了调试信息,q用了一些保护机制以帮助发现错误Q因此性能不如发布版本。编译器提供?Runtime Library 通常很稳定,不会造成 Release 版错误;倒是׃ Debug ?Runtime Library 加强了对错误的检,如堆内存分配Q有时会出现 Debug 有错?Release 正常的现象。应当指出的是,如果 Debug 有错Q即?Release 正常Q程序肯定是?Bug 的,只不q可能是 Release 版的某次q行没有表现出来而已?br> <br> 2. 优化Q这是造成错误的主要原因,因ؓ关闭优化时源E序基本上是直接译的,而打开优化后编译器会作Zpd假设。这c错误主要有以下几种Q?br> <br>    (1) 帧指?Frame Pointer)省略Q简U?FPO Q:在函数调用过E中Q所有调用信息(q回地址、参敎ͼ以及自动变量都是攑֜栈中的。若函数的声明与实现不同Q参数、返回倹{调用方式)Q就会生错误————但 Debug 方式下,栈的讉K通过 EBP 寄存器保存的地址实现Q如果没有发生数l越界之cȝ错误Q或是越?#8220;不多”Q,函数通常能正常执行;Release 方式下,优化会省?EBP 栈基址指针Q这样通过一个全局指针讉K栈就会造成q回地址错误是程序崩溃。C++ 的强cdҎ能查出大多数这L错误Q但如果用了强制cd转换Q就不行了。你可以?Release 版本中强制加?/Oy- ~译选项来关掉指针省略Q以定是否此类错误。此c错误通常有:<br>     <br>     ?MFC 消息响应函数书写错误。正的应ؓ<br>      afx_msg LRESULT OnMessageOwn(WPARAM wparam, LPARAM lparam);<br>      ON_MESSAGE 宏包含强制类型{换。防止这U错误的Ҏ之一是重定义 ON_MESSAGE 宏,把下列代码加?stdafx.h 中(?include "afxwin.h"之后Q?函数原Ş错误时编译会报错<br>      #undef ON_MESSAGE<br>      #define ON_MESSAGE(message, memberFxn) \<br>      { message, 0, 0, 0, AfxSig_lwl, \<br>      (AFX_PMSG)(AFX_PMSGW)(static_cast< LRESULT (AFX_MSG_CALL \<br>      CWnd::*)(WPARAM, LPARAM) > (&memberFxn) },<br>      <br>    (2) volatile 型变量:volatile 告诉~译器该变量可能被程序之外的未知方式修改Q如pȝ、其他进E和U程Q。优化程序ؓ了ɽE序性能提高Q常把一些变量放在寄存器中(cM?register 关键字)Q而其他进E只能对该变量所在的内存q行修改Q而寄存器中的值没变。如果你的程序是多线E的Q或者你发现某个变量的g预期的不W而你信已正的讄了,则很可能遇到q样的问题。这U错误有时会表现为程序在最快优化出错而最优化正常。把你认为可疑的变量加上 volatile 试试?br>    <br>    (3) 变量优化Q优化程序会Ҏ变量的用情况优化变量。例如,函数中有一个未被用的变量Q在 Debug 版中它有可能掩盖一个数l越界,而在 Release 版中Q这个变量很可能被优化调Q此时数l越界会破坏栈中有用的数据。当Ӟ实际的情况会比这复杂得多。与此有关的错误有:<br>     ?非法讉KQ包括数l越界、指针错误等。例?br>         void fn(void)<br>         {<br>           int i;<br>           i = 1;<br>           int a[4];<br>           {<br>             int j;<br>             j = 1;<br>           }<br>           a[-1] = 1;//当然错误不会q么明显Q例如下标是变量<br>           a[4] = 1;<br>         }<br>       j 虽然在数l越界时已出了作用域Q但其空间ƈ未收回,因?i ?j ׃掩盖界。?Release 版由?i、j q未其很大作用可能会被优化掉Q从而栈被破坏?/p> <p>3. _DEBUG ?NDEBUG Q当定义?_DEBUG Ӟassert() 函数会被~译Q?NDEBUG 时不被编译。除此之外,VC++中还有一pd断言宏。这包括Q?/p> <p>    ANSI C 断言         void assert(int expression );<br>    C Runtime Lib 断言  _ASSERT( booleanExpression );<br>                        _ASSERTE( booleanExpression );<br>    MFC 断言            ASSERT( booleanExpression );<br>                        VERIFY( booleanExpression );<br>                        ASSERT_VALID( pObject );<br>                        ASSERT_KINDOF( classname, pobject );<br>    ATL 断言            ATLASSERT( booleanExpression );<br>    此外QTRACE() 宏的~译也受 _DEBUG 控制?/p> <p>所有这些断a都只?Debug版中才被~译Q而在 Release 版中被忽略。唯一的例外是 VERIFY() 。事实上Q这些宏都是调用?assert() 函数Q只不过附加了一些与库有关的调试代码。如果你在这些宏中加入了ME序代码Q而不只是布尔表达式(例如赋倹{能改变变量值的函数调用 {)Q那?Release 版都不会执行q些操作Q从而造成错误。初学者很Ҏ犯这c错误,查找的方法也很简单,因ؓq些宏都已在上面列出Q只要利?VC++ ?Find in Files 功能在工E所有文件中扑ֈ用这些宏的地方再一一查即可。另外,有些高手可能q会加入 #ifdef _DEBUG 之类的条件编译,也要注意一下?br>    Z值得一提的?VERIFY() 宏,q个宏允怽程序代码放在布表辑ּ里。这个宏通常用来?Windows API 的返回倹{有些h可能个原因而滥?VERIFY() Q事实上q是危险的,因ؓ VERIFY() q反了断a的思想Q不能ɽE序代码和调试代码完全分,最l可能会带来很多ȝ。因此,专家们徏议尽量少用这个宏?/p> <p>4. /GZ 选项Q这个选项会做以下q些?/p> <p>    (1) 初始化内存和变量。包括用 0xCC 初始化所有自动变量,0xCD ( Cleared Data ) 初始化堆中分配的内存Q即动态分配的内存Q例?new Q,0xDD ( Dead Data ) 填充已被释放的堆内存Q例?delete Q,0xFD( deFencde Data ) 初始化受保护的内存(debug 版在动态分配内存的前后加入保护内存以防止越界访问)Q其中括号中的词是微软徏议的助记词。这样做的好处是q些值都很大Q作为指针是不可能的Q而且 32 位系l中指针很少是奇数|在有些系l中奇数的指针会产生q行旉误)Q作为数g很少遇到Q而且q些g很容易L认,因此q很有利于在 Debug 版中发现 Release 版才会遇到的错误。要特别注意的是Q很多h认ؓ~译器会?0 来初始化变量Q这是错误的Q而且q样很不利于查找错误Q?br>    (2) 通过函数指针调用函数Ӟ会通过查栈指针验证函数调用的匹配性。(防止原Ş不匹配)<br>    (3) 函数q回前检查栈指针Q确认未被修攏V(防止界讉K和原形不匚wQ与W二合在一起可大致模拟帧指针省?FPO Q?br>    <br>    通常 /GZ 选项会造成 Debug 版出错?Release 版正常的现象Q因?Release 版中未初始化的变量是随机的,q有可能使指针指向一个有效地址而掩盖了非法讉K?br>    <br>除此之外Q?Gm /GF {选项造成错误的情冉|较少Q而且他们的效果显而易见,比较Ҏ发现?/p> <p>三、怎样“调试” Release 版的E序</p> <p>    遇到 Debug 成功?Release p|Q显然是一件很沮的事Q而且往往无从下手。如果你看了以上的分析,l合错误的具体表玎ͼ很快扑և了错误,固然很好。但如果一时找不出Q以下给Z一些在q种情况下的{略?br>    <br>    1. 前面已经提过QDebug ?Release 只是一l编译选项的差别,实际上ƈ没有什么定义能区分二者。我们可以修?Release 版的~译选项来羃错误范围。如上所qͼ可以?Release 的选项逐个改ؓ与之相对?Debug 选项Q如 /MD 改ؓ /MDd?O1 改ؓ /OdQ或q行旉优化改ؓE序大小优化。注意,一ơ只改一个选项Q看改哪个选项旉误消失,再对应该选项相关的错误,针对性地查找。这些选项?Project\Settings... 中都可以直接通过列表选取Q通常不要手动修改。由于以上的分析已相当全面,q个Ҏ是最有效的?/p> <p>    2. 在编E过E中p时常注意试 Release 版本Q以免最后代码太多,旉又很紧?br>    <br>    3. ?Debug 版中使用 /W4 警告U别Q这样可以从~译器获得最大限度的错误信息Q比?if( i =0 )׃引v /W4 警告。不要忽略这些警告,通常q是你程序中?Bug 引v的。但有时 /W4 会带来很多冗余信息,?未用的函数参数 警告Q而很多消息处理函数都会忽略某些参数。我们可以用<br>      #progma warning(disable: 4702) //止<br>      //...<br>      #progma warning(default: 4702) //重新允许<br>来暂时禁止某个警告,或?br>      #progma warning(push, 3) //讄警告U别?/W3<br>      //...<br>      #progma warning(pop) //重设?/W4<br>来暂时改变警告别,有时你可以只在认为可疑的那一部分代码使用 /W4?/p>     4.你也可以?Debug 一栯试你?Release 版,只要加入调试W号。在 Project/Settings... 中,选中 Settings for "Win32 Release"Q选中 C/C++ 标签QCategory ?GeneralQDebug Info ?Program Database。再?Link 标签 Project options  最后加?"/OPT:REF" (引号不要?。这栯试器p使用 pdb 文g中的调试W号。但调试时你会发现断点很难设|,变量也很难找到——这些都被优化过了。不qo人庆q的是,Call Stack H口仍然工作正常Q即使指针被优化,栈信息(特别是返回地址Q仍然能扑ֈ。这对定位错误很有帮助? <br> <img src ="http://www.shnenglu.com/michaelgao/aggbug/53909.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/michaelgao/" target="_blank">micheal's tech</a> 2008-06-18 17:30 <a href="http://www.shnenglu.com/michaelgao/archive/2008/06/18/53909.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.tkfh.net.cn" target="_blank">ۺϳ˾þôƬ91</a>| <a href="http://www.ybwsf.cn" target="_blank">þõӰ</a>| <a href="http://www.suzhougarden.cn" target="_blank">þݺҹҹ</a>| <a href="http://www.baicar.cn" target="_blank">޹Ʒһþhs</a>| <a href="http://www.52galaxy.cn" target="_blank">޾ƷҹVAþó</a>| <a href="http://www.021-10000.cn" target="_blank">þþþþAv뾫Ʒר</a>| <a href="http://www.energygrass.cn" target="_blank">þþƷ99Ӱ</a>| <a href="http://www.bao5888.cn" target="_blank">ɫþþþSWAGƷ</a>| <a href="http://www.have123.cn" target="_blank">þþ97ɫ</a>| <a href="http://www.h8443.cn" target="_blank">þseֻоƷ</a>| <a href="http://www.simple521.cn" target="_blank">ɫۺϾþ</a>| <a href="http://www.wenmis.cn" target="_blank">þ㽶߿ۿ</a>| <a href="http://www.wzorg.cn" target="_blank">޾ƷþþӰԺӰƬ</a>| <a href="http://www.youk6.cn" target="_blank">91þ㽶Ů߿</a>| <a href="http://www.gmbs.com.cn" target="_blank">þþþþþƷο</a>| <a href="http://www.allywll-800.cn" target="_blank">ƷۺϾþĻ</a>| <a href="http://www.djmb.net.cn" target="_blank">ۺ˾þôý</a>| <a href="http://www.rct7.cn" target="_blank">Ůaaaþþü</a>| <a href="http://www.oysport.cn" target="_blank">þþƷ99þþ</a>| <a href="http://www.uzhp.cn" target="_blank">97Ʒ˾þþô߽</a>| <a href="http://www.mortels.cn" target="_blank">þ</a>| <a href="http://www.054q.cn" target="_blank">þ99Ʒþþþþ</a>| <a href="http://www.hit5.cn" target="_blank">þù޾Ʒ鶹</a>| <a href="http://www.dlucai.cn" target="_blank">þþþAVۺ</a>| <a href="http://www.lafei-pingtai.cn" target="_blank">ľþþƷww16</a>| <a href="http://www.52liansuo.com.cn" target="_blank">þþþƷþþþþ</a>| <a href="http://www.renliu123.cn" target="_blank">Ʒպҹþ</a>| <a href="http://www.191c.cn" target="_blank">þùƷþþ</a>| <a href="http://www.loufengxinxi.cn" target="_blank">99þѹػ</a>| <a href="http://www.fengguan1688.cn" target="_blank">ھƷþ</a>| <a href="http://www.shyk888.cn" target="_blank">þAV뾫Ʒ</a>| <a href="http://www.exye.cn" target="_blank">ھƷþþþӰԺ</a>| <a href="http://www.pchenshimin.com.cn" target="_blank">þþþ</a>| <a href="http://www.bao5888.cn" target="_blank">պþӰԺ</a>| <a href="http://www.htja.com.cn" target="_blank">ۺۺϾþ69</a>| <a href="http://www.sanbaotong.cn" target="_blank">Ʒۺþþþþ</a>| <a href="http://www.znkt.net.cn" target="_blank">þþþӰԺŮ </a>| <a href="http://www.2blood.cn" target="_blank">69ۺϾþþƷ</a>| <a href="http://www.6wx.com.cn" target="_blank">ŷսþþþþþþ </a>| <a href="http://www.diycook.cn" target="_blank">ھƷþþþþþ97ţţ </a>| <a href="http://www.zequndesign.com.cn" target="_blank">þþþƷ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>