﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-天空是蓝色的-随笔分类-C/C++</title><link>http://www.blogjava.net/bluesky/category/5633.html</link><description>做好软件为中国
#gcc -c helloworld.c -o helloworld.o //编译目标文件
#gcc helloworld.o -o helloworld //编译成可执行exe
#helloworld //运行exe</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 20:41:31 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 20:41:31 GMT</pubDate><ttl>60</ttl><item><title>C++libs </title><link>http://www.blogjava.net/bluesky/archive/2006/06/01/49530.html</link><dc:creator>bluesky</dc:creator><author>bluesky</author><pubDate>Thu, 01 Jun 2006 04:48:00 GMT</pubDate><guid>http://www.blogjava.net/bluesky/archive/2006/06/01/49530.html</guid><wfw:comment>http://www.blogjava.net/bluesky/comments/49530.html</wfw:comment><comments>http://www.blogjava.net/bluesky/archive/2006/06/01/49530.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bluesky/comments/commentRss/49530.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bluesky/services/trackbacks/49530.html</trackback:ping><description><![CDATA[[c++libs]<a href="http://www.libsdl.org/"><br />http://www.libsdl.org/</a><br /><a href="http://www.wxwidgets.org/">http://www.wxwidgets.org/</a><br /><a href="http://www.fltk.org/">http://www.fltk.org/</a><br /><a href="http://www.boost.org/">http://www.boost.org/</a><br /><a href="http://www.zlib.net/">http://www.zlib.net/</a><br /><a href="http://expat.sourceforge.net/">http://expat.sourceforge.net/</a><br /><a href="http://www.eskimo.com/~weidai/cryptlib.html">http://www.eskimo.com/~weidai/cryptlib.html</a><br /><a href="http://glut.org/">http://glut.org/</a><br /><a href="http://gborg.postgresql.org/project/libpqxx/projdisplay.php">http://gborg.postgresql.org/project/libpqxx/projdisplay.php</a><br /><a href="http://www.sgi.com/tech/stl/">http://www.sgi.com/tech/stl/</a><br /><a href="http://stlport.org/">http://stlport.org/</a><br /><a href="http://sourceforge.net/projects/blitz/">http://sourceforge.net/projects/blitz/</a><br /><a href="http://www.cs.wustl.edu/~schmidt/ACE.html">http://www.cs.wustl.edu/~schmidt/ACE.html</a><br /><a href="http://www.sourceforge.net/projects/tinyxml">http://www.sourceforge.net/projects/tinyxml<br /></a><br /><br /><a href="http://www.tinybutstrong.com/">http://www.tinybutstrong.com/</a> [a php templates engine]<br /><img src ="http://www.blogjava.net/bluesky/aggbug/49530.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bluesky/" target="_blank">bluesky</a> 2006-06-01 12:48 <a href="http://www.blogjava.net/bluesky/archive/2006/06/01/49530.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Minimal wxWidgets sample~~</title><link>http://www.blogjava.net/bluesky/archive/2006/05/15/46144.html</link><dc:creator>bluesky</dc:creator><author>bluesky</author><pubDate>Sun, 14 May 2006 16:00:00 GMT</pubDate><guid>http://www.blogjava.net/bluesky/archive/2006/05/15/46144.html</guid><wfw:comment>http://www.blogjava.net/bluesky/comments/46144.html</wfw:comment><comments>http://www.blogjava.net/bluesky/archive/2006/05/15/46144.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bluesky/comments/commentRss/46144.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bluesky/services/trackbacks/46144.html</trackback:ping><description><![CDATA[
		<p>/////////////////////////////////////////////////////////////////////////////<br />// Name:        minimal.cpp<br />// Purpose:     Minimal wxWidgets sample<br />// Author:      Julian Smart<br />// Modified by:<br />// Created:     04/01/98<br />// RCS-ID:      $Id: minimal.cpp,v 1.67 2005/02/20 16:14:03 JS Exp $<br />// Copyright:   (c) Julian Smart<br />// Licence:     wxWindows licence<br />/////////////////////////////////////////////////////////////////////////////</p>
		<p>// ============================================================================<br />// declarations<br />// ============================================================================</p>
		<p>// ----------------------------------------------------------------------------<br />// headers<br />// ----------------------------------------------------------------------------</p>
		<p>// For compilers that support precompilation, includes "wx/wx.h".<br />#include &lt;string&gt;<br />#include &lt;iostream&gt;<br />#include "wx/wxprec.h"</p>
		<p>#ifdef __BORLANDC__<br />    #pragma hdrstop<br />#endif</p>
		<p>// for all others, include the necessary headers (this file is usually all you<br />// need because it includes almost all "standard" wxWidgets headers)<br />#ifndef WX_PRECOMP<br />    #include "wx/wx.h"<br />#endif<br />// ----------------------------------------------------------------------------<br />// resources<br />// ----------------------------------------------------------------------------</p>
		<p>// the application icon (under Windows and OS/2 it is in resources and even<br />// though we could still include the XPM here it would be unused)<br />#if !defined(__WXMSW__) &amp;&amp; !defined(__WXPM__)<br />    #include "sample.xpm"<br />#endif</p>
		<p>// ----------------------------------------------------------------------------<br />// private classes<br />// ----------------------------------------------------------------------------</p>
		<p>// Define a new application type, each program should derive a class from wxApp<br />class MyApp : public wxApp<br />{<br />public:<br />    // override base class virtuals<br />    // ----------------------------</p>
		<p>    // this one is called on application startup and is a good place for the app<br />    // initialization (doing it here and not in the ctor allows to have an error<br />    // return: if OnInit() returns false, the application terminates)<br />    virtual bool OnInit();<br />};</p>
		<p>// Define a new frame type: this is going to be our main frame<br />class MyFrame : public wxFrame<br />{<br />public:<br />    // ctor(s)<br />    MyFrame(const wxString&amp; title);<br /> wxButton *WxButton1;<br />    wxTextCtrl *wxTextCtrl1;<br />        wxTextCtrl *wxTextCtrl2;<br />    // event handlers (these functions should _not_ be virtual)<br />    void OnQuit(wxCommandEvent&amp; event);<br />    void OnAbout(wxCommandEvent&amp; event);<br />void WxButton1Click(wxCommandEvent&amp; event);<br />private:<br />    // any class wishing to process wxWidgets events must use this macro<br />    DECLARE_EVENT_TABLE()<br />};</p>
		<p>// ----------------------------------------------------------------------------<br />// constants<br />// ----------------------------------------------------------------------------</p>
		<p>// IDs for the controls and the menu commands<br />enum<br />{<br /> ID_WXBUTTON1 = 1001,<br />    // menu items<br />    <br />    Minimal_Quit = wxID_EXIT,</p>
		<p>    // it is important for the id corresponding to the "About" command to have<br />    // this standard value as otherwise it won't be handled properly under Mac<br />    // (where it is special and put into the "Apple" menu)<br />    Minimal_About = wxID_ABOUT</p>
		<p>};</p>
		<p>// ----------------------------------------------------------------------------<br />// event tables and other macros for wxWidgets<br />// ----------------------------------------------------------------------------</p>
		<p>// the event tables connect the wxWidgets events with the functions (event<br />// handlers) which process them. It can be also done at run-time, but for the<br />// simple menu events like this the static method is much simpler.<br />BEGIN_EVENT_TABLE(MyFrame, wxFrame)<br />    EVT_MENU(Minimal_Quit,  MyFrame::OnQuit)<br />    EVT_MENU(Minimal_About, MyFrame::OnAbout)<br />    EVT_BUTTON(ID_WXBUTTON1,MyFrame::WxButton1Click)<br />END_EVENT_TABLE()</p>
		<p>// Create a new application object: this macro will allow wxWidgets to create<br />// the application object during program execution (it's better than using a<br />// static object for many reasons) and also implements the accessor function<br />// wxGetApp() which will return the reference of the right type (i.e. MyApp and<br />// not wxApp)<br />IMPLEMENT_APP(MyApp)</p>
		<p>// ============================================================================<br />// implementation<br />// ============================================================================</p>
		<p>// ----------------------------------------------------------------------------<br />// the application class<br />// ----------------------------------------------------------------------------</p>
		<p>// 'Main program' equivalent: the program execution "starts" here<br />bool MyApp::OnInit()<br />{<br />    // create the main application window<br />    MyFrame *frame = new MyFrame(_T("helloworld-test"));</p>
		<p>    // and show it (the frames, unlike simple controls, are not shown when<br />    // created initially)<br />    frame-&gt;Show(true);</p>
		<p>    // success: wxApp::OnRun() will be called which will enter the main message<br />    // loop and the application will run. If we returned false here, the<br />    // application would exit immediately.<br />    return true;<br />}</p>
		<p>// ----------------------------------------------------------------------------<br />// main frame<br />// ----------------------------------------------------------------------------</p>
		<p>// frame constructor<br />MyFrame::MyFrame(const wxString&amp; title)<br />       : wxFrame(NULL, wxID_ANY, title)<br />{</p>
		<p>    // set the frame icon<br />    SetIcon(wxICON(sample));</p>
		<p>#if wxUSE_MENUS<br />    wxMenu *fileMenu = new wxMenu;<br />    wxMenu *helpMenu = new wxMenu;<br />    helpMenu-&gt;Append(Minimal_About, _T("&amp;About...\tF1"), _T("Show about dialog"));</p>
		<p>    fileMenu-&gt;Append(Minimal_Quit, _T("E&amp;xit\tAlt-X"), _T("Quit this program"));</p>
		<p>
				<br />    wxMenuBar *menuBar = new wxMenuBar();<br />    menuBar-&gt;Append(fileMenu, _T("&amp;系统"));<br />    menuBar-&gt;Append(helpMenu, _T("&amp;帮助"));</p>
		<p>    // ... and attach this menu bar to the frame<br />    SetMenuBar(menuBar);<br />   <br />#endif // wxUSE_MENUS</p>
		<p>#if wxUSE_STATUSBAR<br />    // create a status bar just for fun (by default with 1 pane only)<br />    CreateStatusBar(2);<br />    SetStatusText(_T("helloworld-test"));<br />#endif // wxUSE_STATUSBAR<br /> wxPanel* p = new wxPanel(this, -1);<br />   wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );<br />   <br />   <br />/*    topsizer-&gt;Add(<br />    new wxStaticText( p, wxID_ANY, _T("An explanation (wxALIGN_RIGHT).") ),<br />    wxSizerFlags().Align(wxALIGN_RIGHT).Border(wxALL &amp; ~wxBOTTOM, 5));</p>
		<p>
				<br />  topsizer-&gt;Add(<br />    new wxTextCtrl( p, wxID_ANY, _T("My text (wxEXPAND)."), wxDefaultPosition, wxSize(100,60), wxTE_MULTILINE),<br />    wxSizerFlags(1).Expand().Border(wxALL, 5));</p>
		<p>
				<br />  wxBoxSizer *statsizer = new wxStaticBoxSizer(<br />    new wxStaticBox(p, wxID_ANY, _T("A wxStaticBoxSizer")), wxVERTICAL );<br />  statsizer-&gt;Add(<br />    new wxStaticText(p, wxID_ANY, _T("And some TEXT inside it")),<br />    wxSizerFlags().Center().Border(wxALL, 30));<br />  topsizer-&gt;Add(<br />    statsizer,<br />    wxSizerFlags(1).Expand().Border(wxALL, 10));*/<br />   <br />   <br />    wxGridSizer *gridsizer = new wxGridSizer(2, 5, 5);<br />    <br />    gridsizer-&gt;Add(new wxStaticText(p, wxID_ANY, _T("Label")),<br />                   wxSizerFlags().Align(wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL));<br />                   wxTextCtrl1 = new wxTextCtrl(p, wxID_ANY, _T(""));<br />    gridsizer-&gt;Add(wxTextCtrl1,<br />                   wxSizerFlags(1).Align(wxGROW | wxALIGN_CENTER_VERTICAL));<br />    gridsizer-&gt;Add(new wxStaticText(p, wxID_ANY, _T("Another label")),<br />                   wxSizerFlags().Align(wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL));<br />                   <br />                   wxTextCtrl2 = new wxTextCtrl(p, wxID_ANY, _T(""));<br />                   <br />    gridsizer-&gt;Add(wxTextCtrl2,<br />                   wxSizerFlags(1).Align(wxGROW | wxALIGN_CENTER_VERTICAL));<br />    gridsizer-&gt;Add(new wxStaticText(p, wxID_ANY, _T("Final label")),<br />                   wxSizerFlags().Align(wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL));<br />    gridsizer-&gt;Add(new wxTextCtrl(p, wxID_ANY, _T("")),<br />                   wxSizerFlags().Align(wxGROW | wxALIGN_CENTER_VERTICAL));<br />     topsizer-&gt;Add(<br />        gridsizer,<br />        wxSizerFlags().Proportion(1).Expand().Border(wxALL, 10));<br />        <br />     wxBoxSizer *button_box = new wxBoxSizer( wxHORIZONTAL );<br />  button_box-&gt;Add(<br />     new wxButton( p, wxID_ANY, _T("Two buttons in a box") ),<br />     wxSizerFlags().Border(wxALL, 7));<br />     <br />  <br />   WxButton1 = new wxButton(p, ID_WXBUTTON1, _T("WxButton1"), wxPoint(142,184), wxSize(75,25), 0, wxDefaultValidator, wxT("WxButton1"));<br />  <br />       button_box-&gt;Add(WxButton1,  wxSizerFlags().Border(wxALL, 7));<br />  button_box-&gt;Add(<br />     new wxButton( p, wxID_ANY, _T("(wxCENTER)") ),<br />     wxSizerFlags().Border(wxALL, 7));</p>
		<p>  topsizer-&gt;Add(button_box, wxSizerFlags().Center());</p>
		<p>  p-&gt;SetSizer( topsizer );<br />  </p>
		<p>      topsizer-&gt;SetSizeHints( this );<br />    </p>
		<p>}</p>
		<p>
				<br />// event handlers</p>
		<p>void MyFrame::OnQuit(wxCommandEvent&amp; WXUNUSED(event))<br />{<br />    // true is to force the frame to close<br />    Close(true);<br />}</p>
		<p>void MyFrame::OnAbout(wxCommandEvent&amp; WXUNUSED(event))<br />{<br />    wxString msg;<br />    msg.Printf( _T("helloworld-test.\n")<br />                _T("helloworld-test"));<br />                </p>
		<p>    wxMessageBox(msg, _T("About Minimal"), wxOK | wxICON_INFORMATION, this);<br />}<br />void MyFrame::WxButton1Click(wxCommandEvent&amp;  WXUNUSED(event))<br />{<br /> </p>
		<p>
				<br /> wxString n1 = wxTextCtrl1-&gt;GetValue();<br /> wxString n2 = wxTextCtrl1-&gt;GetValue();<br /> std::string nx = (std::string)n1;<br /> std::cout &lt;&lt; nx &lt;&lt;std::endl;<br /> wxString msg;<br /> msg.Printf( _T(n1));</p>
		<p>    wxMessageBox(msg, _T("About Minimal"), wxOK | wxICON_INFORMATION, this);<br />}<br /></p>
<img src ="http://www.blogjava.net/bluesky/aggbug/46144.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bluesky/" target="_blank">bluesky</a> 2006-05-15 00:00 <a href="http://www.blogjava.net/bluesky/archive/2006/05/15/46144.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用libpqxx总结</title><link>http://www.blogjava.net/bluesky/archive/2006/05/11/45612.html</link><dc:creator>bluesky</dc:creator><author>bluesky</author><pubDate>Thu, 11 May 2006 02:52:00 GMT</pubDate><guid>http://www.blogjava.net/bluesky/archive/2006/05/11/45612.html</guid><wfw:comment>http://www.blogjava.net/bluesky/comments/45612.html</wfw:comment><comments>http://www.blogjava.net/bluesky/archive/2006/05/11/45612.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bluesky/comments/commentRss/45612.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bluesky/services/trackbacks/45612.html</trackback:ping><description><![CDATA[<p>Using libpq(c api) and libpqxx(c++ api) to connect postgresql-8.1.3 on WindowsXP<br />need MinGW Msys postgresql-8.1.3 source baggage<br />I use libpqxx-2.5.5 look at the libpqxx-2.5.5\win32\Intall.txt</p>
<p>--------------------------------------------------------------------<br />Getting Started with MinGW and MSYS<br />(based on contribution by Michael J. Pedersen, 2004-08-17)</p>
<p>MSYS is a Unix-like environment for Windows.&nbsp; Once you have this installed,<br />building libpqxx should be a lot more like it is under Unix except that the<br />locations of libraries and such aren't sufficiently standardized.</p>
<p>Packages to download if you don't have them already:<br />1) MinGW (<a href="http://www.mingw.org/">http://www.mingw.org/</a>), plus any updates.<br />2) MSYS (<a href="http://www.mingw.org/">http://www.mingw.org/</a>), again with any updates.<br />3) w32api (<a href="http://www.mingw.org/">http://www.mingw.org/</a>).<br />4) PostgreSQL (<a href="http://www.postgresql.org/">http://www.postgresql.org/</a>).<br />5) zlib (<a href="http://www.zlib.org/">http://www.zlib.org/</a>).</p>
<p>It is generally recommended to get the latest versions of these packages.</p>
<p>Compiling and installing PostgreSQL before you get to libpqxx:<br />1) Install MinGW (install to c:\mingw)<br />2) Install MSYS--but not into MinGW directory tree!<br />3) Run MSYS (Start-&gt;Programs-&gt;MinGW-&gt;MSYS-&gt;msys)<br />4) Extract, compile, and install zlib<br />&nbsp;&nbsp;&nbsp; # From main source directory of zlib:<br />&nbsp;&nbsp;&nbsp; <font color="#ff6600">./configure --prefix=c:/mingw/local &amp;&amp; make &amp;&amp; make install</font><br />5) Extract, compile, and install postgres<br />&nbsp;&nbsp;&nbsp; # From main source directory of PostgreSQL:<br />&nbsp;&nbsp;&nbsp;<font color="#ff0000"> ./configure --prefix=c:/mingw/local --with-includes=c:/mingw/local/include --with-libs=c:/mingw/local/lib&nbsp; &amp;&amp; make &amp;&amp; make install<br /></font>&nbsp;&nbsp; 重要:把C:\mingw\local\bin设置环境变量PATH中<br />6) Extract, compile, and install libpqxx<br />&nbsp;&nbsp;&nbsp; <font color="#ff0000">export LDFLAGS=-lws2_32 &amp;&amp;&nbsp; ./configure --prefix=c:/mingw/local --disable-shared --enable-static --disable-thread-safety &amp;&amp; make &amp;&amp; make install<br /></font>---------------------------------------------------------------------<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;Uing it in eclpise cdt<br />&nbsp;1、设置环境变量PATH C:\mingw\local\lib 使程序能连接到libpq.dll<br />&nbsp;2、&nbsp;-I &quot;C:\MinGW\local\include&quot; <br />&nbsp;&nbsp;-I &quot;C:\MinGW\libpqxx-2.5.5\include&quot;<br />&nbsp;3、&nbsp;-l&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;pqxx<br />&nbsp;&nbsp;&nbsp;pq<br />&nbsp;&nbsp;&nbsp;ws2_32<br />&nbsp;&nbsp;&nbsp;wsock32<br />&nbsp;&nbsp;&nbsp;注意顺序<br />&nbsp;&nbsp;-L&nbsp;<br />&nbsp;&nbsp;&nbsp;&quot;C:\MinGW\local\lib&quot;<br />&nbsp;&nbsp;&nbsp;&quot;C:\MinGW\lib&quot;<br />&nbsp;4、测试代码<br />&nbsp;pqlib C库 \postgresql-8.1.3\src\test\examples<br />&nbsp;pqlibxx C++ libpqxx-2.5.5\test&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; <br /></p><img src ="http://www.blogjava.net/bluesky/aggbug/45612.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bluesky/" target="_blank">bluesky</a> 2006-05-11 10:52 <a href="http://www.blogjava.net/bluesky/archive/2006/05/11/45612.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>use eclipse to develope c or c++ On Windows platform</title><link>http://www.blogjava.net/bluesky/archive/2006/05/09/45146.html</link><dc:creator>bluesky</dc:creator><author>bluesky</author><pubDate>Tue, 09 May 2006 01:40:00 GMT</pubDate><guid>http://www.blogjava.net/bluesky/archive/2006/05/09/45146.html</guid><wfw:comment>http://www.blogjava.net/bluesky/comments/45146.html</wfw:comment><comments>http://www.blogjava.net/bluesky/archive/2006/05/09/45146.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bluesky/comments/commentRss/45146.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bluesky/services/trackbacks/45146.html</trackback:ping><description><![CDATA[<p>use eclipse to develope c or c++ On Windows platform <br />of course you need j2sdk<br />1 download eclipse platform and cdt plugins from eclipse official site <a href="http://www.eclipse.org/">http://www.eclipse.org/</a><br />2 download GNU c/c++ compilers I use MinGW <a href="http://www.mingw.org">http://www.mingw.org</a> <br />I use the MinGW-3.1.0-1.exe <br />2.1 Install MinGW say:D:/MinGW<br />2.2 set environment<br />&nbsp;<br />&nbsp;Path D:\MinGW\bin;<br />&nbsp;C_INCLUDE_PATH D:\MinGW\include;<br />&nbsp;CPLUS_INCLUDE_PATH &nbsp;D:\MinGW\include\c++\3.2.3;D:\MinGW\include\c++\3.2.3\mingw32;D:\MinGW\include\c++\3.2.3\backward;D:\MinGW\include;<br />&nbsp;LIBRARY_PATH&nbsp;D:\MinGW\lib;<br />&nbsp;change the D:\MinGW\bin\mingw32-make.exe file name to make.exe<br />&nbsp;<br />3 also download the Msys from MinGW.org<br />3.1 Install Msys</p>
<p>4 downloads wxWidgets-2.6.3.zip from <a href="http://www.wxwidgets.org/">http://www.wxwidgets.org/</a>&nbsp;<br />4.1 building it<br />&nbsp;unzip it first say:D:\MinGW\wxWidgets-2.6.3<br />&nbsp;&gt; cd D:\MinGW\wxWidgets-2.6.3\build\msw<br />&nbsp; &nbsp;&gt; make -f makefile.gcc BUILD=release<br />&nbsp; &nbsp;&gt; cd D:\MinGW\wxWidgets-2.6.3\samples\minimal<br />&nbsp; &nbsp;&gt; make -f makefile.gcc BUILD=release<br />4.2 use wxWidgets-2.6.3 in eclipse <br />&nbsp;Properties for a c++ project<br />&nbsp;GCC C++ Compiler<br />&nbsp;&nbsp;Preprocessor(-D) &nbsp;_WINDOWS<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WIN32<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__WIN95__<br />&nbsp;&nbsp;Directories&nbsp;&nbsp;&quot;D:\MinGW\lib\gcc-lib\mingw32\3.2.3\include&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;D:\MinGW\wxWidgets-2.6.3\include&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;D:\MinGW\wxWidgets-2.6.3\lib\gcc_lib\msw&quot;<br />&nbsp;GCC C++ Linker<br />&nbsp;&nbsp;Libraries<br />&nbsp;&nbsp;&nbsp;Libraries(-l)<br />&nbsp;&nbsp;&nbsp;&nbsp;wxmsw26_adv<br />&nbsp;&nbsp;&nbsp;&nbsp;wxmsw26_core<br />&nbsp;&nbsp;&nbsp;&nbsp;wxbase26<br />&nbsp;&nbsp;&nbsp;&nbsp;wxtiff<br />&nbsp;&nbsp;&nbsp;&nbsp;wxjpeg<br />&nbsp;&nbsp;&nbsp;&nbsp;wxpng<br />&nbsp;&nbsp;&nbsp;&nbsp;wxzlib<br />&nbsp;&nbsp;&nbsp;&nbsp;wxregex<br />&nbsp;&nbsp;&nbsp;&nbsp;wxexpat<br />&nbsp;&nbsp;&nbsp;&nbsp;kernel32<br />&nbsp;&nbsp;&nbsp;&nbsp;user32<br />&nbsp;&nbsp;&nbsp;&nbsp;gdi32<br />&nbsp;&nbsp;&nbsp;&nbsp;comdlg32<br />&nbsp;&nbsp;&nbsp;&nbsp;winspool<br />&nbsp;&nbsp;&nbsp;&nbsp;winmm<br />&nbsp;&nbsp;&nbsp;&nbsp;shell32<br />&nbsp;&nbsp;&nbsp;&nbsp;comctl32<br />&nbsp;&nbsp;&nbsp;&nbsp;ole32<br />&nbsp;&nbsp;&nbsp;&nbsp;oleaut32<br />&nbsp;&nbsp;&nbsp;&nbsp;uuid<br />&nbsp;&nbsp;&nbsp;&nbsp;rpcrt4<br />&nbsp;&nbsp;&nbsp;&nbsp;advapi32<br />&nbsp;&nbsp;&nbsp;&nbsp;wsock32<br />&nbsp;&nbsp;&nbsp;&nbsp;odbc32<br />&nbsp;&nbsp;&nbsp;Library search path(-L)<br />&nbsp;&nbsp;&nbsp;&nbsp;&quot;D:\MinGW\lib&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&quot;D:\MinGW\wxWidgets-2.6.3\lib\gcc_lib&quot;</p>
<p>5 Install some libs tools on eclpise<br />ACE_wrappers build with Msys &nbsp;<a href="http://www.cs.wustl.edu/~schmidt/ACE.html">http://www.cs.wustl.edu/~schmidt/ACE.html</a><br />mysql++-2.1.1 build with makefile and need the mysql source src zip file&nbsp;<a href="http://www.tangentsoft.net/mysql++/">http://www.tangentsoft.net/mysql++/</a>&nbsp;<br />STLport-4.6.2&nbsp;<a href="http://stlport.org">http://stlport.org</a><br />STLsgi-3.3&nbsp;<a href="http://www.sgi.com/tech/stl">http://www.sgi.com/tech/stl</a><br />boost_1_33_1 &nbsp;&nbsp;<a href="http://www.boost.org/">http://www.boost.org/</a></p>
<p>look the readme file will help you build</p>
<p><br /><a href="http://www.freebyte.com/programming/cpp/">http://www.freebyte.com/programming/cpp/</a></p><img src ="http://www.blogjava.net/bluesky/aggbug/45146.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bluesky/" target="_blank">bluesky</a> 2006-05-09 09:40 <a href="http://www.blogjava.net/bluesky/archive/2006/05/09/45146.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Visual C++ ActiveX Control for hosting Office documents in Visual Basic or HTML</title><link>http://www.blogjava.net/bluesky/archive/2006/04/27/43457.html</link><dc:creator>bluesky</dc:creator><author>bluesky</author><pubDate>Thu, 27 Apr 2006 01:03:00 GMT</pubDate><guid>http://www.blogjava.net/bluesky/archive/2006/04/27/43457.html</guid><wfw:comment>http://www.blogjava.net/bluesky/comments/43457.html</wfw:comment><comments>http://www.blogjava.net/bluesky/archive/2006/04/27/43457.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bluesky/comments/commentRss/43457.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bluesky/services/trackbacks/43457.html</trackback:ping><description><![CDATA[<a href="http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/q311/7/65.asp&amp;NoWebContent=1">http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/q311/7/65.asp&amp;NoWebContent=1</a><img src ="http://www.blogjava.net/bluesky/aggbug/43457.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bluesky/" target="_blank">bluesky</a> 2006-04-27 09:03 <a href="http://www.blogjava.net/bluesky/archive/2006/04/27/43457.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Free C++ (and C)</title><link>http://www.blogjava.net/bluesky/archive/2006/04/24/42832.html</link><dc:creator>bluesky</dc:creator><author>bluesky</author><pubDate>Mon, 24 Apr 2006 06:54:00 GMT</pubDate><guid>http://www.blogjava.net/bluesky/archive/2006/04/24/42832.html</guid><wfw:comment>http://www.blogjava.net/bluesky/comments/42832.html</wfw:comment><comments>http://www.blogjava.net/bluesky/archive/2006/04/24/42832.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bluesky/comments/commentRss/42832.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bluesky/services/trackbacks/42832.html</trackback:ping><description><![CDATA[<a href="http://www.freebyte.com/programming/cpp/">http://www.freebyte.com/programming/cpp/</a><br /><br />
<table cellspacing="20" width="720" border="0" class="maintable">
    <tbody>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.anjuta.org/" target="_blank"><font color="#660000">Anjuta</font></a></td>
            <td valign="top">Free open-source IDE for C and C++ on <strong>Linux</strong>/GTK/GNOME.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.borland.com/bcppbuilder/freecompiler/" target="_blank"><font color="#660000">Borland C++</font></a></td>
            <td valign="top">This well known compiler from Borland (for <strong>Windows</strong> and DOS) can now be downloaded for free (legally)!</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.codeblocks.org/" target="_blank"><font color="#660000">Code::Blocks Studio</font></a></td>
            <td valign="top">A freeware open-source C++ IDE for Windows and Linux. It supports these compilers: GCC (MingW / Linux GCC), MSVC++, Digital Mars, Borland C++ 5.5, Open Watcom.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.bloodshed.net/devcpp.html" target="_blank"><font color="#660000">Dev-C++</font></a></td>
            <td valign="top">A full-featured Integrated Development Environment (IDE) for the C/C++ programming language. Freeware for <strong>Windows</strong>.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.ibiblio.org/onebase/onebaselinux.com/About/features/developgo.php" target="_blank"><font color="#660000">DevelopGo</font></a></td>
            <td valign="top">For Linux. Over 11 Languages, 5 popular Integrated Development Environments, 4 GUI designers, 5 GUI toolkits, extensive language bindings, wide collection of offline documentation and with core Onebase support all in a Single LiveCD. After signing up for a $10 download account, have free access to all Onebase Products, including upgrades.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.digitalmars.com/" target="_blank"><font color="#660000">Digital Mars</font></a></td>
            <td valign="top">Free C and C++ Compilers and IDE's for Win32, Win16, DOS32 and DOS, command line and GUI versions, tutorials, sample code, online updates, Standard Template Library, etc.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.rhide.com/" target="_blank"><font color="#660000">djgpp</font></a></td>
            <td valign="top">A port of the GNU compiler and programming tools to MS DOS.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.eclipse.org/cdt/" target="_blank"><font color="#660000">Eclipse CDT</font></a></td>
            <td valign="top">C and C++ Integrated Development Environment (IDE) for the Eclipse platform implemented in Java. </td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://msdn.microsoft.com/mobility/othertech/eVisualc/" target="_blank"><font color="#660000">Embedded Visual C++</font></a></td>
            <td valign="top">Free Visual C++ compiler for Windows Mobile and Windows CE.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://gcc.gnu.org/" target="_blank"><font color="#660000">GNU C++/C Compiler</font></a></td>
            <td valign="top">GCC, the GNU Compiler Collection (freeware, open source, multi-platform), includes front ends for C, C++, Objective-C, Fortran, Java, and Ada. The GCC documentation section can be found <a href="http://gcc.gnu.org/onlinedocs/gcc-4.0.2/gcc/index.html" target="_blank"><font color="#660000">here</font></a>.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.intel.com/cd/software/products/asmo-na/eng/compilers/clin/219856.htm" target="_blank"><font color="#660000">Intel C++ compiler</font></a></td>
            <td valign="top">Free <strong>Linux</strong> C++ compiler from Intel. Freeware for non-commercial use. It uses either the command line or the optional Eclipse-based integrated development environment (Eclipse IDE runs on IA-32 only).</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.kdevelop.org/" target="_blank"><font color="#660000">KDevelop</font></a></td>
            <td valign="top">Free open-source IDE for <strong>Linux</strong>/KDE which supports many programming languages. </td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.cs.virginia.edu/~lcc-win32/" target="_blank"><font color="#660000">LCC-Win</font></a></td>
            <td valign="top">Free C compiler/IDE for Windows . Contains compiler, debugger, resource compiler, resource editor, etc etc. Freeware for non-commercial use only.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://developer.apple.com/tools/mpw-tools/" target="_blank"><font color="#660000">Macintosh<br />Programmer's Workshop</font></a></td>
            <td valign="top">Free C++ compilers, debuggers, assemblers, documentation and related tools for the <strong>MAC</strong> platform.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.mingw.org/" target="_blank"><font color="#660000">MinGW</font></a></td>
            <td valign="top">'Minimalist GNU for Windows'. A collection of freely available and freely distributable Windows specific header files and import libraries combined with GNU toolsets that allow one to produce native Windows programs that do not rely on any 3rd-party C runtime DLLs. MinGW comes with the GNU C++ compiler.<br />See also <a href="http://www.thisiscool.com/gcc_mingw.htm" target="_blank"><font color="#660000">GCC/GCJ for MingW</font></a>.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.parinyasoft.com/" target="_blank"><font color="#660000">MinGW Developer Studio</font></a></td>
            <td valign="top">An IDE for the GNU C/C++ Compiler. Freeware for Windows and Linux.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.openwatcom.org/" target="_blank"><font color="#660000">Open Watcom</font></a></td>
            <td valign="top">Freeware open source C++ (and Fortran) compilers for Windows. Plans for Open Watcom include porting the compiler to the Linux and FreeBSD platforms</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.smorgasbordet.com/pellesc/" target="_blank"><font color="#660000">Pelles C</font></a></td>
            <td valign="top">A complete development kit for Windows and Pocket PC. It contains an IDE, optimizing C compiler, a linker, a resource compiler, a message compiler, a make utility, a debugger, install builders and much more. For Windows and Pocket PC.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.fifsoft.com/relo" target="_blank"><font color="#660000">Relo</font></a></td>
            <td valign="top">A Windows C/C++ IDE for MinGW and Borland C++ compilers. Freeware, open-source for Windows.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.rhide.com/" target="_blank"><font color="#660000">Rhide</font></a></td>
            <td valign="top">An IDE with which you can develop and debug in C, C++, Pascal and other languages and compilers which can be called from Rhide. Suitable for Linux text-console and DOS / DJGPP.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://fabrice.bellard.free.fr/tcc/" target="_blank"><font color="#660000">Tiny C Compiler</font></a></td>
            <td valign="top">Freeware, small and fast C-compiler for Linux.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://upp.sourceforge.net/" target="_blank"><font color="#660000">Ultimate++</font></a></td>
            <td valign="top">Ultimate++ consists of Set of cross-platform <strong>Windows</strong> and <strong>Linux</strong> libraries (&quot;packages&quot;), widgets (user-interface elements) an IDE, a lay-out designer for designing dialogs, image designer for designing graphical elements, language editor for managing internationalized text strings, etc. </td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.objectcentral.com/vide.htm" target="_blank"><font color="#660000">V IDE</font></a></td>
            <td valign="top">Integrated Development Environment for the GNU g++ compiler, Borland C++ 5.5, and the standard Sun Java Development Kit. Suitable for Windows and Linux.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://lab.msdn.microsoft.com/express/visualc/" target="_blank"><font color="#660000">Visual C++ Express</font></a></td>
            <td valign="top">Free Visual C++ compiler for Windows by Microsoft.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://visual-mingw.sourceforge.net/" target="_blank"><font color="#660000">Visual-MinGW</font></a></td>
            <td valign="top">Freeware open-source IDE for Windows. An Integrated Development Environment for MinGW compiler.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.widestudio.org/EE/" target="_blank"><font color="#660000">WideStudio</font></a></td>
            <td valign="top">An open source, Integrated Development Environment for developing GUI applications based on the MWT(Multi-Platform Widget Toolkit). Supported platforms: Windows, WindowsCE, Linux, FreeBSD, SOLARIS, MacOSX, etc. </td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://wxdsgn.sourceforge.net/" target="_blank"><font color="#660000">wx-Devcpp</font></a></td>
            <td valign="top">wxWidgets form designer plugin for Dev-C++ which can help you to create Dialogs and Frames for <a href="http://www.wxwidgets.org/" target="_blank"><font color="#660000">wxWidgets</font></a> visually.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://developer.apple.com/tools/xcode/" target="_blank"><font color="#660000">XCode</font></a></td>
            <td valign="top">Integrated development environment (IDE) for creating <strong>Mac OS X</strong> Universal Binaries that run natively on PowerPC and Intel-based Macintosh computers. Freeware.</td>
        </tr>
    </tbody>
</table>
<br />
<table cellspacing="20" width="720" border="0" class="maintable">
    <tbody>
        <tr>
            <th valign="top" colspan="2">Non-free C++ Compilers and IDE's</th>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.codeforge.com/" target="_blank"><font color="#660000">Code Forge</font></a></td>
            <td valign="top">Professional Integrated Development Environment for Unix/Linux with project management features and edit/compile/debug support for over 30 programming languages. The IDE has preconfigured support for all major free and commercial compilers on the market today, such as GCC.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.newplanetsoftware.com/jcc/" target="_blank"><font color="#660000">Code Crusader</font></a></td>
            <td valign="top">IDE for Linux-Intel, Linux-PPC and Solaris. Supports over 30 programming languages. It comes with the JX GUI Application framework, which is built directly on top of Xlib.</td>
        </tr>
        <tr>
            <td colspan="2"><a name="freecppguilibraries"></a>&nbsp;</td>
        </tr>
        <tr>
            <th valign="top" colspan="2">Free C++ GUI Libraries</th>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.fltk.org/" target="_blank"><font color="#660000">FLTK</font></a></td>
            <td valign="top">A cross-platform C++ GUI toolkit for UNIX/Linux, Windows, and MacOS X providing modern GUI functionality without the usual bloat. It also supports 3D graphics via OpenGL and its built-in GLUT emulation.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.fox-toolkit.org/" target="_blank"><font color="#660000">Fox Toolkit</font></a></td>
            <td valign="top">Cross-platform C++ user-interface library, freeware, open-source.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.memecode.com/lgi.php" target="_blank"><font color="#660000">LGI</font></a></td>
            <td valign="top">Cross-platform C++ framework for abstracting out all the operating system dependencies that you can produce portable code. It handles all the graphical interface functions, threading and semaphores, network connectivity and lots of other bits and pieces to help build small, fast and reliable applications. </td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.trolltech.com/" target="_blank"><font color="#660000">Qt</font></a></td>
            <td valign="top">Cross-platform C++ GUI framework.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.scintilla.org/" target="_blank"><font color="#660000">Scintilla</font></a></td>
            <td valign="top">A free source code editing component. Freeware, open-source for Linux and Windows.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.geocities.com/SiliconValley/Vista/7184/guitool.html" target="_blank"><font color="#660000">The GUI Toolkit,<br />Framework Page</font></a></td>
            <td valign="top">A comprehensive reference on toolkits for building graphical user interfaces (GUIs), with emphasis on resources for Free Software (Open Source)</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.objectcentral.com/vgui/vgui.htm" target="_blank"><font color="#660000">V</font></a></td>
            <td valign="top">V is a free, multiple platform C++ graphical user interface framework designed to make it easy to write C++ GUI applications, commercial, shareware, or freeware. V is available for X Athena, X Motif/Lesstif, all Windows platforms, and OS/2.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://sourceforge.net/projects/whisper2" target="_blank"><font color="#660000">Whisper2</font></a></td>
            <td valign="top">C++ application framework for the Mac, Unix and Windows.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.wxwindows.org/" target="_blank"><font color="#660000">wxWidgets</font></a></td>
            <td valign="top">API for writing GUI applications on multiple platforms. Link with the appropriate library for your platform (Windows/Unix/Mac, others coming shortly) and compiler (almost any popular C++ compiler), and your application will adopt the look and feel appropriate to that platform. Additionally: online help, network programming, streams, clipboard and drag and drop, multi-threading, image loading and saving in a variety of popular formats, database support, HTML viewing and printing, etc. Freeware, Open Source</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://zoolib.sourceforge.net/" target="_blank"><font color="#660000">ZooLib</font></a></td>
            <td valign="top">A cross-platform application framework, enables you to write a single set of C++ sources and compile them to native executables to run on MacOS, Windows, BeOS or Unix/Linux.</td>
        </tr>
        <tr>
            <td colspan="2"><a name="freecppdatabaselibraries"></a>&nbsp;</td>
        </tr>
        <tr>
            <th valign="top" colspan="2">Free C++ Database Libraries</th>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.datareel.com/" target="_blank"><font color="#660000">DataReel</font></a></td>
            <td valign="top">A cross-platform C++ development kit used to build multi-threaded database and communications applications. Using DataReel you can build end-user applications, embedded systems, and reusable libraries for multiple operating systems.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.csse.monash.edu.au/~darrenp/diamondbase.html" target="_blank"><font color="#660000">DiamondBase</font></a></td>
            <td valign="top">C++ database engine which is available for free non commercial use, and is negotiable for commercial use.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.tangentsoft.net/mysql++/" target="_blank"><font color="#660000">MySQL++</font></a></td>
            <td valign="top">MySQL++ is a C++ wrapper for <a href="http://www.freebyte.com/programming/database/"><font color="#660000">MySQL's</font></a> API.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.sqlite.org/" target="_blank"><font color="#660000">SQLLite</font></a></td>
            <td valign="top">SQLite is a small C library that implements a self-contained, embeddable, zero-configuration SQL database engine.</td>
        </tr>
        <tr>
            <td colspan="2"><a name="freecppcompressionlibs"></a>&nbsp;</td>
        </tr>
        <tr>
            <th valign="top" colspan="2">Free C++ Compression Libraries</th>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.kyz.uklinux.net/libmspack/" target="_blank"><font color="#660000">libmspack</font></a></td>
            <td valign="top">Portable C++ library which provides compression and decompression of some file formats used by Microsoft (.cab, .hlp, .chm, compress.exe, etc).</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.oberhumer.com/opensource/ucl/" target="_blank"><font color="#660000">UCL</font></a></td>
            <td valign="top">UCL is a portable lossless data compression library written in ANSI C. UCL implements a number of compression algorithms that achieve an excellent compression ratio while allowing *very* fast decompression. Decompression requires no additional memory.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.artpol-software.com/index_zip.html" target="_blank"><font color="#660000">ZipArchive</font></a></td>
            <td valign="top">Free zip/unzip C-library.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.zlib.net/" target="_blank"><font color="#660000">ZLib</font></a></td>
            <td valign="top">Free zip/unzip C-library.</td>
        </tr>
        <tr>
            <td colspan="2"><a name="freecppgraphicslibraries"></a>&nbsp;</td>
        </tr>
        <tr>
            <th valign="top" colspan="2">Free C++ Graphics and Game Libraries</th>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.amanith.org/" target="_blank"><font color="#660000">Amanith Framework</font></a></td>
            <td valign="top">A cross-platform (Linux, Win32, Mac OX X, FreeBSD, Linux and IRIX) open source C++ framework for 2D and 3D vector graphics that includes 2D curves, a 2D font engine, bitmap vectorizer, tessellator, and an OpenGL extensions manager.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.ogre3d.org/" target="_blank"><font color="#660000">OGRE 3D</font></a></td>
            <td valign="top">Open source 3D-graphics and game engine for Linux, MAC and Windows.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.opengl.org/" target="_blank"><font color="#660000">OpenGL</font></a></td>
            <td valign="top">Excellent high-performance cross-platform 3D graphics library. Elegant API. It can be used for a variety of purposes, such as: animations, virtual reality, game-programming, simulations, etc.</td>
        </tr>
        <tr>
            <td valign="top" nowrap="nowrap"><a href="http://www.oscilloscope-lib.com/" target="_blank"><font color="#660000">Real-Time Oscilloscope<br />DLL Library</font></a></td>
            <td valign="top">Freeware real-time Windows Oscilloscope DLL with an API for C++ , Delphi, MathWorks Matlab and Simulink.</td>
        </tr>
    </tbody>
</table><img src ="http://www.blogjava.net/bluesky/aggbug/42832.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bluesky/" target="_blank">bluesky</a> 2006-04-24 14:54 <a href="http://www.blogjava.net/bluesky/archive/2006/04/24/42832.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>计算机组成原理讲稿( 概述)</title><link>http://www.blogjava.net/bluesky/archive/2006/02/16/30915.html</link><dc:creator>bluesky</dc:creator><author>bluesky</author><pubDate>Thu, 16 Feb 2006 02:10:00 GMT</pubDate><guid>http://www.blogjava.net/bluesky/archive/2006/02/16/30915.html</guid><wfw:comment>http://www.blogjava.net/bluesky/comments/30915.html</wfw:comment><comments>http://www.blogjava.net/bluesky/archive/2006/02/16/30915.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bluesky/comments/commentRss/30915.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bluesky/services/trackbacks/30915.html</trackback:ping><description><![CDATA[<p>计 算 机 组 成 原 理 讲 稿<br />主 讲：王健<br /><a href="http://www.seuyc.com.cn/course/kcjg/jsjzcyl/jsjzz.htm">http://www.seuyc.com.cn/course/kcjg/jsjzcyl/jsjzz.htm</a></p>
<p>第一章&nbsp;&nbsp;&nbsp;&nbsp; 概述 <br />1.计算机由运算器、存储器、控制器和输入/输出五个部件组成。<br />2.冯&middot;诺依曼计算机的主要特点： <br />1）计算机由运算器、存储器、控制器和输入/输出五个部件组成。 <br />2）存储器以二进制形式存储指令和数据； <br />3）存储程序工作方式； <br />4）五部件以运算器为中心进行组织；</p>
<p>第2章&nbsp; 数据的表示<br />1.在计算机系统中，凡是要进行处理（包括计算、查找、排序、分类、统计、合并等）、存储和传输的信息，都是用二进制进行编码的。 <br />2.进位计数制及其各进位制数之间的转换<br />3.定点与浮点表示的方法、特点 <br />4.机器数的三种编码表示方式：原码、补码和反码。&nbsp;&nbsp;&nbsp;&nbsp; 定义、特点、用途。<br />5.浮点数的编码表示及规格化<br />6.十进制数的二进制编码表示即 BCD码的特点 <br />7.字符及汉字的编码方法、特点 <br />8.音频、视频的编码方法及特点<br />9.数据校验码的用途</p>
<p>第3章 运算器与运算方法<br />1. 运算器基本组成和功能<br />2.半加器与全加器的逻辑设计<br />3.串行进位与并行进位的比较<br />4.补码定点加、减法<br />5.原码一位乘法<br />6.补码一位乘法<br />7.浮点加、减法</p>
<p>第4章&nbsp; 存储系统 <br />1.存储器的主要性能指标<br />2.存储系统的层次结构<br />3.半导体读写存储器RAM芯片的结构、组成及存储器系统的构成<br />4.半导体只读存储器的特点及分类<br />5.高速缓冲存储器Cache的工作原理、映射方式、替换算法，了解Pentium Cache 结构和Power PC Cache 结构。 <br />. 虚拟存储器的功能、基本管理方法、结构7.磁表面存储器的性能指标、硬磁盘存储器的基本组成、信息分布、硬盘容量和数据传输率的计算</p>
<p>第5章&nbsp; 指令系统 <br />1. 指令格式、指令长度 <br />2.常用的寻址方式种类、特点、用途 <br />3.指令系统的地位、作用，指令类型 <br />4.堆栈的定义、用途和堆栈存取方式 <br />5. CISC与RISC指令各自的特点和比较</p>
<p>第6章&nbsp; 中央处理机组织 <br />1. CPU的组成与操作（单总线组织的数据通路及四种基本功能。<br />2.控制器三种时序控制方式：同步、异步和联合控制方式。<br />3.三种时序信号周期、节拍和脉冲的概念、作用<br />4.控制器的组成和功能<br />5.一条完整指令执行的控制步序列<br />6.决定CPU性能最重要的三个因素：指令的功能强弱、时钟周期的长短、执行每条指令所需时钟周期数。<br />7.指令流水的概念<br />8.组合逻辑控制器的构成与设计步骤<br />9.微程序控制器的原理、基本概念、基本组织和工作流程 <br />10.微指令的两种格式与3种编码<br />11.两种微指令地址的生成方法<br />12.微程序控制器和组合逻辑控制器的比较</p>
<p>第7章&nbsp; 总线及总线互连结构 <br />1.总线的基本概念、作用和分类<br />2.总线的两种传输方式--串行和并行的特点<br />3.总线裁决的意义及分类<br />4.总线定时方式的分类及特点<br />5.影响总线带宽的因素<br />6.单总线结构和多总线分层结构的比较</p>
<p>第8章&nbsp; 输入输出设备</p>
<p>第9章 输入输出组织 <br />1. I/O接口的功能、结构和分类<br />2. I/O端口编址的两种方法的比较<br />3. 四种I/O数据传送控制方式的比较<br />4.程序查询方式的特点<br />5.中断的概念、分类、中断优先级，开关中断和中断屏蔽<br />6.中断过程：中断响应和中断处理<br />7.中断系统的基本结构和功能 <br />8.中断嵌套和向量中断 <br />9.DMA方式的概念和适用范围<br />10.DMA方式和中断方式的比较<br />11.DMA方式的概念和适用范围<br />12.三种DMA方式的特点<br />13. DMA接口的结构和功能<br />14.通道的基本概念、用途和分类</p>
<p>第一章&nbsp;&nbsp;&nbsp;&nbsp; 概述 </p>
<p>计算机是一种能对数字化信息进行自动高速运算的通用处理装置。</p>
<p>1．1&nbsp; 计算机的定义和特性 信息&nbsp; 运算&nbsp; 处理</p>
<p>1.1.1 什么是计算机 <br />1.1.2 计算机的特性 <br />计算机的特性可以归纳为高速、通用、准确、 智能四大特性。</p>
<p>1．2&nbsp; 计算机的发展历程 <br />1.2.1 电子计算机的诞生 <br />第一台电子计算机ENIAC（Electronic Numerical&nbsp; Integrator and Computer）于1946年在美国诞生。 <br />①每秒5000次加法运算；<br />②每秒50次乘法运算； <br />③平方和立方计算； <br />④Sin和Cos函数数值运算；<br />⑤其它更复杂的计算。&nbsp; </p>
<p>1.2.2&nbsp; 第一代计算机&nbsp;&nbsp; （20世纪40年代中到50年代末） <br />第一代计算机为电子管计算机，其逻辑元件采用电子 管，存储器件为声延迟线或磁鼓，典型逻辑结构为定 点运算。<br />计算机&ldquo;软件&rdquo;一词尚未出现，编制程序所用 工具为低级语言。 </p>
<p>1.2.3&nbsp; 第二代计算机（50年代中后期到60年代中） <br />第二代计算机为晶体管计算机。这一代计算机除了逻 辑元件采用晶体管以外，其内存储器由磁芯构成，磁 鼓与磁带成为外存储器。</p>
<p>计算机典型逻辑结构实现了浮点运算， 并提出了变址、中断、I/O处理等新概念。 <br />计算机软件也得到了发展，出现了多种 高级语言及其编译程序。</p>
<p>1.2.4 第三代计算机（60年代中到70年代中） <br />第三代计算机为集成电路计算机，其逻辑元件与存储器 均由集成电路实现，这是微电子与计算机技术相结合的 一大突破。<br />微程序控制、高速缓存、虚拟存储器、流水 线等先进计算机技术开始使用。另一大特点是大型/巨 型机与小型机同时发展。</p>
<p>1.2.5 第四代计算机（70年代中期开始&mdash;） <br />大规模（LSI）和超大规模（VLSI）集成电路 及微处理器为这一代计算机的典型特征。<br />并行处理技术的研究与应用以及众多巨型机的产生也成 为这一时期计算机发展的特点。 <br />四代机时期的一个重要特点是计算机网络的发展与广泛 应用。 </p>
<p>1.2.6 新一代计算机 新器件和非冯&middot;诺依曼结构已成为新一代计算机的公认标志。</p>
<p>1．3&nbsp; 计算机的组成与结构 </p>
<p>1.3.1 计算机系统的层次结构 </p>
<p>6应用系统算法和数字模型<br />---------------------<br />5各种应用程序<br />---------------------<br />4高级程序编译,解释程序<br />---------------------<br />3操作系统<br />---------------------<br />2指令系统<br />---------------------<br />1微程序控制,PLA控制<br />---------------------<br />0逻辑硬件</p>
<p>1.3.2 计算机硬件<br />计算机硬件是指构成计算机的元器件、 部件、设备、以及它们的设计与实现技术。 <br />冯&middot;诺依曼计算机的主要特点： 1）计算机由运算器、存储器、控制器和输入/输出五个&nbsp;&nbsp;&nbsp; 部件组成。</p>
<p>本书讨论的范围涉及第0、1、2共3层， 主要内容如下： <br />1. 高速的算术、逻辑运算方法及ALU的&nbsp;&nbsp;&nbsp; 逻辑设计； <br />2. 高速的指令执行过程及指令部件的设计与实现，&nbsp;&nbsp;&nbsp; 是采用组合逻辑技术、或微程序设计技术，还是&nbsp;&nbsp;&nbsp; PLA技术；<br />是复杂指令集计算机（CISC），还是&nbsp;&nbsp;&nbsp; 精简指令集计算机（RISC）； <br />3. 提高存储器容量与速度的方法，以及如何解决&nbsp;&nbsp;&nbsp; &ldquo;CPU-Cache-MM-外存&rdquo;之间的匹配问题； <br />4. 高效率的输入/输出方法、组织，以及它们之间的&nbsp;&nbsp;&nbsp; 互联技术； <br />5. 计算机五大部件（运算器、控制器、存储器、输入&nbsp;&nbsp;&nbsp; 和输出）之间的相互作用、高效接口（总线）；</p>
<p>2）存储器以二进制形式存储指令和数据； <br />3）存储程序工作方式； <br />4）五部件以运算器为中心进行组织；</p>
<p>1.3.3 计算机软件 <br />1. 软件的作用 <br />一般来说，计算机的工作总是由存储程序来控制的。 </p>
<p>软件的具体作用为：<br />①在计算机系统中起着指挥和管理的作用。 <br />②是计算机用户和硬件的接口界面。 <br />③是计算机体系结构设计的主要依据。</p>
<p>2. 软件的发展过程 三个阶段： <br />1)从第一台计算机上的第一个程序出现到 实用的高级语言出现为第一阶段（1946-1956年）。 <br />2)从实用的高级程序设计语言出现到软件工程出现 以前为第二阶段（1956-1968年）。 <br />3)软件工程出现以后迄今一直为第三阶段（1965&mdash;）。 </p>
<p>3. 软件的分类 <br />① 系统软件：操作系统、编译程序。 <br />② 支撑软件：数据库、各类接口软件和工具组。 <br />③ 应用软件： </p>
<p>1．4&nbsp; 计算机的分类与应用 <br />1.4.1 计算机的分类 <br />按计算机所处理对象的表示形式不同可以&nbsp;&nbsp;&nbsp;&nbsp; 分成模拟计算机与数字计算机两类。 <br />计算机按其用途来分可以分成专用机和通用机两类。<br />其中，通用计算机按其规模、性能和价格来分，又可分为巨型机、大型机、小型机、工作站、微型机等多种类型。</p>
<p>1.4.2 计算机应用 计算机信息处理技术包括了对各种信息媒体的获取、 表示、加工与表现方法和技术，大致有以下几个方 面内容： <br />1．语言与文字的处理。 <br />2．计算机图形学与数字图象处理。 <br />3．多媒体技术。<br />4．计算机辅助技术。 <br />5．计算机信息系统。 <br />6．计算机控制。 计算机应用技术的发展方向为集成化、网络化、智能化</p>
<p><br /></p><img src ="http://www.blogjava.net/bluesky/aggbug/30915.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bluesky/" target="_blank">bluesky</a> 2006-02-16 10:10 <a href="http://www.blogjava.net/bluesky/archive/2006/02/16/30915.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《微机原理与应用》考试大纲</title><link>http://www.blogjava.net/bluesky/archive/2006/02/16/30910.html</link><dc:creator>bluesky</dc:creator><author>bluesky</author><pubDate>Thu, 16 Feb 2006 01:38:00 GMT</pubDate><guid>http://www.blogjava.net/bluesky/archive/2006/02/16/30910.html</guid><wfw:comment>http://www.blogjava.net/bluesky/comments/30910.html</wfw:comment><comments>http://www.blogjava.net/bluesky/archive/2006/02/16/30910.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bluesky/comments/commentRss/30910.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bluesky/services/trackbacks/30910.html</trackback:ping><description><![CDATA[<p>一、课程内容 </p>
<p>&nbsp;</p>
<p><br />第一章 导论 </p>
<p>&nbsp;</p>
<p><br />第一节：数据的表示与运算。</p>
<p>第二节：微机的基本工作原理及结构。</p>
<p>第三节：微处理器概述。</p>
<p>第二章 8086/8088微处理器 </p>
<p>&nbsp;</p>
<p><br />第一节：微处理器的内部结构及引脚功能。</p>
<p>第二节：微机存储器组织及分段。</p>
<p>第三节：总线结构与总线周期。</p>
<p>第三章 8086/8088指令系统 </p>
<p>&nbsp;</p>
<p><br />第一节：八种寻址方式（立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、寄存器相对寻址、基址变址寻址、基址变址且相对寻址、隐含寻址）</p>
<p>第二节：六类指令系统（数据传输指令、算术运算指令、逻辑运算与移位指令、串操作指令、</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 程序控制类指令、处理器控制指令）</p>
<p>第四章&nbsp;&nbsp;&nbsp; 汇编语言程序设计 </p>
<p>&nbsp;</p>
<p><br />第一节：汇编语言基本概念（语句结构、伪指令、运算符、宏指令、源程序结构等）</p>
<p>第二节：汇编语言程序设计方法（了解汇编语言程序设计的一般步骤,掌握顺序、分支、循环、</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 子程序调用等汇编语言程序设计方法。）</p>
<p>第五章&nbsp;&nbsp;&nbsp; 存储器 </p>
<p>&nbsp;</p>
<p><br />第一节：存储器分类及主要性能指标。</p>
<p>第二节：RAM、ROM简介。</p>
<p>第六章&nbsp;&nbsp; 输入输出与中断系统 </p>
<p>&nbsp;</p>
<p><br />第一节：接口概念、作用和编址方法。</p>
<p>第二节：输入输出传送方式（程序传送方式、中断方式、DMA方式）</p>
<p>第三节：8086/8088中断系统。</p>
<p><br />&nbsp;</p>
<p><br />参考书目： </p>
<p>&nbsp;</p>
<p><br />1．李伯成，侯伯亨，张毅坤.《微型计算机原理及应用》.西安：西安电子科技大学出版社. 1998年第1版. </p>
<p>&nbsp;</p><img src ="http://www.blogjava.net/bluesky/aggbug/30910.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bluesky/" target="_blank">bluesky</a> 2006-02-16 09:38 <a href="http://www.blogjava.net/bluesky/archive/2006/02/16/30910.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OpenGL</title><link>http://www.blogjava.net/bluesky/archive/2006/02/14/30641.html</link><dc:creator>bluesky</dc:creator><author>bluesky</author><pubDate>Tue, 14 Feb 2006 09:23:00 GMT</pubDate><guid>http://www.blogjava.net/bluesky/archive/2006/02/14/30641.html</guid><wfw:comment>http://www.blogjava.net/bluesky/comments/30641.html</wfw:comment><comments>http://www.blogjava.net/bluesky/archive/2006/02/14/30641.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/bluesky/comments/commentRss/30641.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bluesky/services/trackbacks/30641.html</trackback:ping><description><![CDATA[<P>main.cpp<BR>/**************************<BR>&nbsp;* Includes<BR>&nbsp;*<BR>&nbsp;**************************/</P>
<P>#include &lt;windows.h&gt;<BR>#include &lt;gl/gl.h&gt;</P>
<P><BR>/**************************<BR>&nbsp;* Function Declarations<BR>&nbsp;*<BR>&nbsp;**************************/</P>
<P>LRESULT CALLBACK WndProc (HWND hWnd, UINT message,<BR>WPARAM wParam, LPARAM lParam);<BR>void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC);<BR>void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC);</P>
<P><BR>/**************************<BR>&nbsp;* WinMain<BR>&nbsp;*<BR>&nbsp;**************************/</P>
<P>int WINAPI WinMain (HINSTANCE hInstance,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HINSTANCE hPrevInstance,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LPSTR lpCmdLine,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iCmdShow)<BR>{<BR>&nbsp;&nbsp;&nbsp; WNDCLASS wc;<BR>&nbsp;&nbsp;&nbsp; HWND hWnd;<BR>&nbsp;&nbsp;&nbsp; HDC hDC;<BR>&nbsp;&nbsp;&nbsp; HGLRC hRC;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; MSG msg;<BR>&nbsp;&nbsp;&nbsp; BOOL bQuit = FALSE;<BR>&nbsp;&nbsp;&nbsp; float theta = 0.0f;</P>
<P>&nbsp;&nbsp;&nbsp; /* register window class */<BR>&nbsp;&nbsp;&nbsp; wc.style = CS_OWNDC;<BR>&nbsp;&nbsp;&nbsp; wc.lpfnWndProc = WndProc;<BR>&nbsp;&nbsp;&nbsp; wc.cbClsExtra = 0;<BR>&nbsp;&nbsp;&nbsp; wc.cbWndExtra = 0;<BR>&nbsp;&nbsp;&nbsp; wc.hInstance = hInstance;<BR>&nbsp;&nbsp;&nbsp; wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);<BR>&nbsp;&nbsp;&nbsp; wc.hCursor = LoadCursor (NULL, IDC_ARROW);<BR>&nbsp;&nbsp;&nbsp; wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH);<BR>&nbsp;&nbsp;&nbsp; wc.lpszMenuName = NULL;<BR>&nbsp;&nbsp;&nbsp; wc.lpszClassName = "GLSample";<BR>&nbsp;&nbsp;&nbsp; RegisterClass (&amp;wc);</P>
<P>&nbsp;&nbsp;&nbsp; /* create main window */<BR>&nbsp;&nbsp;&nbsp; hWnd = CreateWindow (<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "GLSample", "OpenGL Sample", <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0, 0, 256, 256,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL, NULL, hInstance, NULL);</P>
<P>&nbsp;&nbsp;&nbsp; /* enable OpenGL for the window */<BR>&nbsp;&nbsp;&nbsp; EnableOpenGL (hWnd, &amp;hDC, &amp;hRC);</P>
<P>&nbsp;&nbsp;&nbsp; /* program main loop */<BR>&nbsp;&nbsp;&nbsp; while (!bQuit)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* check for messages */<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (PeekMessage (&amp;msg, NULL, 0, 0, PM_REMOVE))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* handle or dispatch messages */<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (msg.message == WM_QUIT)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bQuit = TRUE;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TranslateMessage (&amp;msg);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DispatchMessage (&amp;msg);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* OpenGL animation code goes here */</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; glClearColor (0.0f, 0.0f, 0.0f, 0.0f);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; glClear (GL_COLOR_BUFFER_BIT);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; glPushMatrix ();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; glRotatef (theta, 0.0f, 0.0f, 1.0f);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; glBegin (GL_TRIANGLES);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; glColor3f (1.0f, 0.0f, 0.0f);&nbsp;&nbsp; glVertex2f (0.0f, 1.0f);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; glColor3f (0.0f, 1.0f, 0.0f);&nbsp;&nbsp; glVertex2f (0.87f, -0.5f);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; glColor3f (0.0f, 0.0f, 1.0f);&nbsp;&nbsp; glVertex2f (-0.87f, -0.5f);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; glEnd ();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; glPopMatrix ();</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SwapBuffers (hDC);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; theta += 1.0f;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sleep (1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp;&nbsp; /* shutdown OpenGL */<BR>&nbsp;&nbsp;&nbsp; DisableOpenGL (hWnd, hDC, hRC);</P>
<P>&nbsp;&nbsp;&nbsp; /* destroy the window explicitly */<BR>&nbsp;&nbsp;&nbsp; DestroyWindow (hWnd);</P>
<P>&nbsp;&nbsp;&nbsp; return msg.wParam;<BR>}</P>
<P><BR>/********************<BR>&nbsp;* Window Procedure<BR>&nbsp;*<BR>&nbsp;********************/</P>
<P>LRESULT CALLBACK WndProc (HWND hWnd, UINT message,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WPARAM wParam, LPARAM lParam)<BR>{</P>
<P>&nbsp;&nbsp;&nbsp; switch (message)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; case WM_CREATE:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<BR>&nbsp;&nbsp;&nbsp; case WM_CLOSE:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PostQuitMessage (0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;</P>
<P>&nbsp;&nbsp;&nbsp; case WM_DESTROY:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;</P>
<P>&nbsp;&nbsp;&nbsp; case WM_KEYDOWN:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch (wParam)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case VK_ESCAPE:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PostQuitMessage(0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;</P>
<P>&nbsp;&nbsp;&nbsp; default:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return DefWindowProc (hWnd, message, wParam, lParam);<BR>&nbsp;&nbsp;&nbsp; }<BR>}</P>
<P><BR>/*******************<BR>&nbsp;* Enable OpenGL<BR>&nbsp;*<BR>&nbsp;*******************/</P>
<P>void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC)<BR>{<BR>&nbsp;&nbsp;&nbsp; PIXELFORMATDESCRIPTOR pfd;<BR>&nbsp;&nbsp;&nbsp; int iFormat;</P>
<P>&nbsp;&nbsp;&nbsp; /* get the device context (DC) */<BR>&nbsp;&nbsp;&nbsp; *hDC = GetDC (hWnd);</P>
<P>&nbsp;&nbsp;&nbsp; /* set the pixel format for the DC */<BR>&nbsp;&nbsp;&nbsp; ZeroMemory (&amp;pfd, sizeof (pfd));<BR>&nbsp;&nbsp;&nbsp; pfd.nSize = sizeof (pfd);<BR>&nbsp;&nbsp;&nbsp; pfd.nVersion = 1;<BR>&nbsp;&nbsp;&nbsp; pfd.dwFlags = PFD_DRAW_TO_WINDOW | <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;<BR>&nbsp;&nbsp;&nbsp; pfd.iPixelType = PFD_TYPE_RGBA;<BR>&nbsp;&nbsp;&nbsp; pfd.cColorBits = 24;<BR>&nbsp;&nbsp;&nbsp; pfd.cDepthBits = 16;<BR>&nbsp;&nbsp;&nbsp; pfd.iLayerType = PFD_MAIN_PLANE;<BR>&nbsp;&nbsp;&nbsp; iFormat = ChoosePixelFormat (*hDC, &amp;pfd);<BR>&nbsp;&nbsp;&nbsp; SetPixelFormat (*hDC, iFormat, &amp;pfd);</P>
<P>&nbsp;&nbsp;&nbsp; /* create and enable the render context (RC) */<BR>&nbsp;&nbsp;&nbsp; *hRC = wglCreateContext( *hDC );<BR>&nbsp;&nbsp;&nbsp; wglMakeCurrent( *hDC, *hRC );</P>
<P>}</P>
<P><BR>/******************<BR>&nbsp;* Disable OpenGL<BR>&nbsp;*<BR>&nbsp;******************/</P>
<P>void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC)<BR>{<BR>&nbsp;&nbsp;&nbsp; wglMakeCurrent (NULL, NULL);<BR>&nbsp;&nbsp;&nbsp; wglDeleteContext (hRC);<BR>&nbsp;&nbsp;&nbsp; ReleaseDC (hWnd, hDC);<BR>}<BR></P><img src ="http://www.blogjava.net/bluesky/aggbug/30641.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bluesky/" target="_blank">bluesky</a> 2006-02-14 17:23 <a href="http://www.blogjava.net/bluesky/archive/2006/02/14/30641.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]C++: Hello, C++/CLI </title><link>http://www.blogjava.net/bluesky/archive/2006/02/14/30638.html</link><dc:creator>bluesky</dc:creator><author>bluesky</author><pubDate>Tue, 14 Feb 2006 09:02:00 GMT</pubDate><guid>http://www.blogjava.net/bluesky/archive/2006/02/14/30638.html</guid><wfw:comment>http://www.blogjava.net/bluesky/comments/30638.html</wfw:comment><comments>http://www.blogjava.net/bluesky/archive/2006/02/14/30638.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bluesky/comments/commentRss/30638.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bluesky/services/trackbacks/30638.html</trackback:ping><description><![CDATA[<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="50%"><IMG class=clsImgButton id=contentbtn onclick="ToggleMenu(contentbtn, contentmenu);" height=9 alt="" hspace=5 src="http://msdn.microsoft.com/msdnmag/images/minus.gif" width=9 align=absMiddle vspace=2><A onclick="ToggleMenu(contentbtn, contentmenu);" href="http://msdn.microsoft.com/msdnmag/issues/06/00/PureC/default.aspx#void" target=_self name=contents><B>Contents</B></A><BR>
<DIV id=contentmenu style="MARGIN-TOP: 10px; DISPLAY: block; MARGIN-LEFT: 20px"><A href="http://msdn.microsoft.com/msdnmag/issues/06/00/PureC/default.aspx#S1" target=_self>What is C++/CLI?</A><BR><A href="http://msdn.microsoft.com/msdnmag/issues/06/00/PureC/default.aspx#S2" target=_self>Learning C++/CLI </A><BR><A href="http://msdn.microsoft.com/msdnmag/issues/06/00/PureC/default.aspx#S3" target=_self>Mapping C++/CLI to the CTS?</A><BR><A href="http://msdn.microsoft.com/msdnmag/issues/06/00/PureC/default.aspx#S4" target=_self>CLI Level of Detail </A><BR><A href="http://msdn.microsoft.com/msdnmag/issues/06/00/PureC/default.aspx#S5" target=_self>What Are the Issues?</A><BR><A href="http://msdn.microsoft.com/msdnmag/issues/06/00/PureC/default.aspx#S6" target=_self>Additional Functionality </A><BR><A href="http://msdn.microsoft.com/msdnmag/issues/06/00/PureC/default.aspx#S7" target=_self>So, What Did You Say About C++/CLI?</A><BR></DIV></TD></TR></TBODY></TABLE>
<HR>
<BR>
<DIV class=articletext>
<P class=clsNoIndent><SPAN class=clsGloss>C++/CLI is a self-contained,</SPAN>&nbsp; component-based dynamic programming language that, like C# or Java, is derived from C++. Unlike those languages, however, we have worked hard to integrate C++/CLI into ISO-C++, using the historical model of evolving the C/C++ programming language to support modern programming paradigms. You can say that C++/CLI is to C++ as C++ is to C. More generally, you can view the evolution leading to C++/CLI in the following historical context: 
<UL>
<LI>BCPL (Basic Computer Programming Language) 
<LI>B (Ken Thompson, original UNIX work) 
<LI>C (Dennis Ritchie, adding type and control structure to B) 
<LI>C with Classes (~1979) 
<LI>C84 (~1984) 
<LI>Cfront, release E (~1984-to universities) 
<LI>Cfront, release 1.0 (1985-to the world )—20th birthday 
<LI>Multiple/Virtual Inheritance (MI) programming (~1988) 
<LI>Generic Programming (~1991) (templates) 
<LI>ANSI C++/ ISO-C++ (~1996) 
<LI>Dynamic Component programming (~2005) (C++/CLI)</LI></UL>
<P></P><BR><A name=S1></A><SPAN class=clsSubhead>What is C++/CLI?</SPAN><BR>
<P>C++/CLI represents a tuple. C++ refers, of course, to the C++ programming language invented by Bjarne Stroustrup at Bell Laboratories. It supports a static object model that is optimized for the speed and size of its executables. However, it doesn't support run-time modification of the program other than heap allocation. It allows unlimited access to the underlying machine, but very little access to the types active in the running program and no real access to the associated infrastructure of that program. Herb Sutter, a former colleague of mine at Microsoft and the chief architect of C++/CLI, refers to C++ as a concrete language.</P>
<P>CLI refers to the Common Language Infrastructure, a multitiered architecture supporting a dynamic component programming model. In many ways, this represents a complete reversal of the C++ object model. A runtime software layer, the virtual execution system, runs between the program and the underlying operating system. Access to the underlying machine is fairly constrained. Access to the types active in the executing program and the associated program infrastructure—both as discovery and construction—is supported. The slash (/) represents a binding between C++ and the CLI. The details surrounding this binding make up the general topic of this column.</P>
<P>So, a first approximation of an answer to what is C++/CLI is that it is a binding of the static C++ object model to the dynamic component object model of the CLI. In short, it is how you do .NET programming using C++ rather than C# or Visual Basic®. Like C# and the CLI itself, C++/CLI is undergoing standardization under the European Computer Manufacturers Association (ECMA) and eventually under ISO.</P>
<P>The common language runtime (CLR) is the Microsoft version of the CLI that is specific to the Windows® operating system. Similarly, Visual C++® 2005 is the implementation of C++/CLI.</P>
<P>As a second approximation of an answer, I would say that C++/CLI integrates the .NET programming model within C++ in the same way as, back at Bell Laboratories, we integrated generic programming using templates within the then existing C++. In both of these cases your investment in an existing C++ codebase and in your existing C++ expertise are preserved. This was an essential baseline requirement of the design of C++/CLI.</P>
<DIV style="MARGIN-TOP: 5px" align=right><A class=clsSmall onclick="OpenMenu(contentbtn, contentmenu);" href="http://msdn.microsoft.com/msdnmag/issues/06/00/PureC/default.aspx#contents" target=_self>Back to Contents</A><IMG style="MARGIN-LEFT: 5px" height=8 alt="Back to top" src="http://msdn.microsoft.com/msdnmag/images/top.gif" width=18 align=bottom border=0></DIV><BR><A name=S2></A><SPAN class=clsSubhead>Learning C++/CLI </SPAN><BR>
<P>There are three aspects in the design of a CLI language that hold true across all languages: a mapping of language-level syntax to the underlying Common Type System (CTS), the choice of a level of detail to expose the underlying CLI infrastructure to the manipulation of the programmer, and the choice of additional functionality to provide, beyond that supported directly by the CLI.</P>
<P>The first item is largely the same across all CLI languages. The second and third items are where one CLI language distinguishes itself from another. Depending on the kinds of problems you need to solve, you'll choose one or another language, or possibly combine multiple CLI languages. Learning C++/CLI involves understanding each of these aspects of its design.</P>
<DIV style="MARGIN-TOP: 5px" align=right><A class=clsSmall onclick="OpenMenu(contentbtn, contentmenu);" href="http://msdn.microsoft.com/msdnmag/issues/06/00/PureC/default.aspx#contents" target=_self>Back to Contents</A><IMG style="MARGIN-LEFT: 5px" height=8 alt="Back to top" src="http://msdn.microsoft.com/msdnmag/images/top.gif" width=18 align=bottom border=0></DIV><BR><A name=S3></A><SPAN class=clsSubhead>Mapping C++/CLI to the CTS?</SPAN><BR>
<P>It is important when programming C++/CLI to learn the underlying CTS, which includes these three general class types: 
<UL>
<LI>The polymorphic reference type, which is what you use for all class inheritance. 
<LI>The non-polymorphic value type, which is used for implementing concrete types requiring runtime efficiency, such as the numeric types. 
<LI>The abstract interface type, which is used for defining a set of operations common to a set of either reference or value types that implement the interface.</LI></UL>
<P></P>
<P>This design aspect, the mapping of the CTS to a set of built-in language types, is common across all CLI languages although, of course, the syntax varies in each CLI language. So, for example, in C#, you would write <PRE class=clsCode>abstract class Shape { ... } // C#
</PRE>to define an abstract Shape base class from which specific geometric objects are to be derived, while in C++/CLI you write <PRE class=clsCode>ref class Shape abstract { ... }; // C++/CLI
</PRE>to indicate the exact same underlying CLI reference type. The two declarations are represented exactly the same way in the underlying IL. Similarly, in C#, you write <PRE class=clsCode>struct Point2D { ... } // C#
</PRE>to define a concrete Point2D class, while in C++/CLI you write: <PRE class=clsCode>value class Point2D { ... }; // C++/CLI
</PRE>
<P></P>
<P>The family of class types supported with C++/CLI represents an integration of the CTS with the native facilities, and that determines your choice of syntax. For example: <PRE class=clsCode>class native {};
value class V {};
ref class R {};
interface class I {};
</PRE>
<P></P>
<P>The CTS also supports an enumeration class type that behaves somewhat differently from the native enumeration, and support is provided for both of those as well: <PRE class=clsCode>enum native { fail, pass }; 
enum class CLIEnum : char { fail, pass}; 
</PRE>Similarly, the CTS supports its own array type that again behaves differently from the native array. And again Microsoft provides support for both: <PRE class=clsCode>int native[] = { 1,1,2,3,5,8 }; 
array&lt;int&gt;^ managed = { 1,1,2,3,5,8 };
</PRE>
<P></P>
<P>No CLI language is closer to or more nearly a mapping to the underlying CTS than another. Rather, each CLI language represents a view into the underlying CTS object model.</P>
<DIV style="MARGIN-TOP: 5px" align=right><A class=clsSmall onclick="OpenMenu(contentbtn, contentmenu);" href="http://msdn.microsoft.com/msdnmag/issues/06/00/PureC/default.aspx#contents" target=_self>Back to Contents</A><IMG style="MARGIN-LEFT: 5px" height=8 alt="Back to top" src="http://msdn.microsoft.com/msdnmag/images/top.gif" width=18 align=bottom border=0></DIV><BR><A name=S4></A><SPAN class=clsSubhead>CLI Level of Detail </SPAN><BR>
<P>The second design aspect that must be considered when designing a CLI language is the level of detail of the underlying CLI implementation model to incorporate into the language. What kind of problems will the language be tasked to solve? Does the language have the tools necessary to do this? Also, what sort of programmers is the language likely to attract?</P>
<P>Take, for example, the issue of value types occurring on the managed heap. Value types can find themselves on the managed heap in a number of circumstances: 
<UL>
<LI>Through implicit boxing, when an instance of a value type is assigned to an Object or when a virtual method is invoked through a value type that is not overridden. 
<LI>When that value type is serving as a member of a reference class type. 
<LI>When that value type is being stored as the element type of a CLI array.</LI></UL>Whether the programmer should be allowed to manipulate the address of a value type of this sort is a CLI language design consideration that must be addressed. 
<P></P>
<DIV style="MARGIN-TOP: 5px" align=right><A class=clsSmall onclick="OpenMenu(contentbtn, contentmenu);" href="http://msdn.microsoft.com/msdnmag/issues/06/00/PureC/default.aspx#contents" target=_self>Back to Contents</A><IMG style="MARGIN-LEFT: 5px" height=8 alt="Back to top" src="http://msdn.microsoft.com/msdnmag/images/top.gif" width=18 align=bottom border=0></DIV><BR><A name=S5></A><SPAN class=clsSubhead>What Are the Issues?</SPAN><BR>
<P>Any object located on the managed heap is subject to relocation during the compaction phase of a sweep of the garbage collector. Any pointers to that object must be tracked and updated by the runtime; the programmer cannot manually track it herself. Therefore, if you were allowed to take the address of a value type that might be on the managed heap, there would need to be a tracking form of pointer in addition to the existing native pointer.</P>
<P>What are the trade-offs to consider? On the one hand, there's simplicity and safety. Directly introducing support in the language for either one or a family of tracking pointers makes it a more complicated language. By not supporting this, the available pool of programmers is expanded because less sophistication is required. In addition, allowing the programmer access to these ephemeral value types increases the possibility of programmer error—she may purposely or inadvertently do dangerous things to the memory. By not supporting tracking pointers, a potentially safer runtime environment is created.</P>
<P>On the other hand, efficiency and flexibility must be considered. Each time you assign the same Object with a value type, a new boxing of the value occurs. Allowing access to the boxed value type allows in-memory update, which may provide significant performance improvements. Without a form of tracking pointer, you cannot iterate over a CLI array using pointer arithmetic. This means that the CLI array cannot participate in the Standard Template Library (STL) iterator pattern and work with the generic algorithms. Allowing access to the boxed value type allows significant design flexibility.</P>
<P>Microsoft chose to provide a collection of addressing modes that handle value types on the managed heap in C++/CLI: <PRE class=clsCode>int ival = 1024;
int^ boxedi = ival; 

array&lt;int&gt;^ ia = gcnew array&lt;int&gt;{1,1,2,3,5,8};
interior_ptr&lt;int&gt; begin = &amp;ia[0];

value struct smallInt { int m_ival; ... } si;
pin_ptr&lt;int&gt; ppi = &amp;si.m_ival;
</PRE>
<P></P>
<P>The typical C++/CLI developer is a sophisticated system programmer tasked with providing infrastructure and organizationally critical applications that serve as the foundation over which a business builds its future. She must address both scalability and performance concerns and must therefore have a system-level view into the underlying CLI. The level of detail of a CLI language reflects the face of its programmer.</P>
<P>Complexity is not in itself a negative quality. Human beings are more complicated than single-cell bacteria, and that is certainly not a bad thing. However, when the expression of a simple concept is made complicated, that is usually considered to be a bad thing. In C++/CLI, the CLI team has tried to provide an elegant way to express complex subject matter.</P>
<DIV style="MARGIN-TOP: 5px" align=right><A class=clsSmall onclick="OpenMenu(contentbtn, contentmenu);" href="http://msdn.microsoft.com/msdnmag/issues/06/00/PureC/default.aspx#contents" target=_self>Back to Contents</A><IMG style="MARGIN-LEFT: 5px" height=8 alt="Back to top" src="http://msdn.microsoft.com/msdnmag/images/top.gif" width=18 align=bottom border=0></DIV><BR><A name=S6></A><SPAN class=clsSubhead>Additional Functionality </SPAN><BR>
<P>A third design aspect is a language-specific layer of functionality above and beyond what is directly supported by the CLI. This may require a mapping between the language-level support and the underlying implementation model of the CLI. In some cases, this just isn't possible because the language cannot intercede with the behavior of the CLI. One example of this is the virtual function resolution in the constructor and destructor of a base class. To reflect ISO-C++ semantics in this case would require a resetting of the virtual table within each base class constructor and destructor. This is not possible because virtual table handling is managed by the runtime and not by the individual language.</P>
<P>So this design aspect is a compromise between what would be preferable to do, and what is feasible. The three primary areas of additional functionality that are provided by C++/CLI are the following: 
<UL>
<LI>A form of Resource Acquisition is Initialization (RAII) for reference types, in particular, to provide an automated facility for what is referred to as deterministic finalization of garbage- collected types that hold scarce resources. 
<LI>A form of deep-copy semantics associated with the C++ copy constructor and copy assignment operator; however, these semantics could not be extended to value types. 
<LI>Direct support of C++ templates for CTS types in addition to the CLI generic mechanism. In addition, a verifiable version of the STL for CLI types is provided.</LI></UL>
<P></P>
<P>Let's look at a brief example: the issue of deterministic finalization. Before the memory associated with an object is reclaimed by the garbage collector, an associated Finalize method, if present, is invoked. You can think of this method as a kind of super-destructor since it is not tied to the program lifetime of the object. This is called finalization. The timing of just when or even whether a Finalize method is invoked is undefined. This is what is meant by nondeterministic finalization of the garbage collector.</P>
<P>Nondeterministic finalization works well with dynamic memory management. When available memory gets sufficiently scarce, the garbage collector kicks in and solves the problem. Nondeterministic finalization does not work well, however, when an object maintains a critical resource such as a database connection, a lock of some sort, or perhaps native heap memory. In this case, it would be great to release the resource as soon as it is no longer needed. The solution that is currently supported by the CLI is for a class to free the resources in its implementation of the Dispose method of the IDisposable interface. The problem here is that Dispose requires an explicit invocation, and therefore is not likely to be invoked.</P>
<P>A fundamental design pattern in C++ is the aforementioned Resource Acquisition is Initialization, which means that a class acquires resources within its constructor. Conversely, a class frees its resources within its destructor. This is managed automatically within the lifetime of the class object.</P>
<P>Here's what reference types should do in terms of the freeing of scarce resources: 
<UL>
<LI>Use the destructor to encapsulate the necessary code for the freeing of any resources associated with the class. 
<LI>Have the destructor invoked automatically, tied with the lifetime of the class object.</LI></UL>
<P></P>
<P>The CLI has no notion of the class destructor for a reference type. So the destructor has to be mapped to something else in the underlying implementation. Internally, then, the compiler performs the following transformations: 
<UL>
<LI>The class has its base class list extended to inherit from the IDisposable interface. 
<LI>The destructor is transformed into the Dispose method of IDisposable.</LI></UL>
<P></P>
<P>That represents half of the goal. A way to automate the invocation of the destructor is still needed. A special stack-based notation for a reference type is supported; that is, one in which its lifetime is associated within the scope of its declaration. Internally, the compiler transforms the notation to allocate the reference object on the managed heap. With the termination of the scope, the compiler inserts an invocation of the Dispose method—the user-defined destructor. Reclamation of the actual memory associated with the object remains under the control of the garbage collector. <A class=clsFigs onclick="OpenUrl('default.aspx?fig=true#fig1'); return false;" href="http://msdn.microsoft.com/msdnmag/issues/06/00/PureC/default.aspx?fig=true#fig1" target=_self xmlns:user="http://msdn.microsoft.com">Figure&nbsp;1</A> shows an example.</P>
<P>C++/CLI is not just an extension of C++ into the managed world. Rather, it represents a fully integrated programming paradigm similar in extent to the earlier integration of the multiple inheritance and generic programming paradigms into the language. I think the team has done an outstanding job.</P>
<DIV style="MARGIN-TOP: 5px" align=right><A class=clsSmall onclick="OpenMenu(contentbtn, contentmenu);" href="http://msdn.microsoft.com/msdnmag/issues/06/00/PureC/default.aspx#contents" target=_self>Back to Contents</A><IMG style="MARGIN-LEFT: 5px" height=8 alt="Back to top" src="http://msdn.microsoft.com/msdnmag/images/top.gif" width=18 align=bottom border=0></DIV><BR><A name=S7></A><SPAN class=clsSubhead>So, What Did You Say About C++/CLI?</SPAN><BR>
<P>C++/CLI represents an integration of native and managed programming. In this iteration, that has been done through a kind of separate but equal community of source-level and binary elements, including Mixed mode (source-level mix of native and CTS types, plus a binary mix of native and CIL object files), Pure mode (source-level mix of native and CTS types, all compiled to CIL object files), Native classes (can hold CTS types through a special wrapper class only), and CTS classes (can hold native types only as pointers). Of course, the C++/CLI programmer can also choose to program in the CLI types alone, and in this way provide verifiable code that can be hosted, for example, as a stored procedure in SQL Server<SUP class=clsSmall>™</SUP> 2005.</P>
<P>So, returning to the question, what is C++/CLI? It is a first-class entry visa into the .NET programming model. With C++/CLI, there is a C++ migration path not just for the C++ source base but for C++ expertise as well. I find great satisfaction in that.</P>
<DIV style="MARGIN-TOP: 5px" align=right><A class=clsSmall onclick="OpenMenu(contentbtn, contentmenu);" href="http://msdn.microsoft.com/msdnmag/issues/06/00/PureC/default.aspx#contents" target=_self>Back to Contents</A><IMG style="MARGIN-LEFT: 5px" height=8 alt="Back to top" src="http://msdn.microsoft.com/msdnmag/images/top.gif" width=18 align=bottom border=0></DIV><BR><SPAN class=clsGloss>Send your questions and comments to &nbsp;<A href="mailto:purecpp@microsoft.com">purecpp@microsoft.com</A>.</SPAN><BR></DIV>
<HR>
<SPAN class=clsBio><B>Stanley B. Lippman</B> began working on C++ with its inventor Bjarne Stroustrup back in 1984 within Bell Laboratories. Later, Stan worked in feature animation both at Disney and DreamWorks and served as a Software Technical Director on Fantasia 2000. He has since served as Distinguished Consultant with JPL and as an Architect with the Visual C++ team at Microsoft.</SPAN><BR><A href="http://msdn.microsoft.com/msdnmag/issues/06/00/PureC/default.aspx">http://msdn.microsoft.com/msdnmag/issues/06/00/PureC/default.aspx</A><img src ="http://www.blogjava.net/bluesky/aggbug/30638.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bluesky/" target="_blank">bluesky</a> 2006-02-14 17:02 <a href="http://www.blogjava.net/bluesky/archive/2006/02/14/30638.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言取得windows操作系统信息</title><link>http://www.blogjava.net/bluesky/archive/2006/02/14/30610.html</link><dc:creator>bluesky</dc:creator><author>bluesky</author><pubDate>Tue, 14 Feb 2006 06:53:00 GMT</pubDate><guid>http://www.blogjava.net/bluesky/archive/2006/02/14/30610.html</guid><wfw:comment>http://www.blogjava.net/bluesky/comments/30610.html</wfw:comment><comments>http://www.blogjava.net/bluesky/archive/2006/02/14/30610.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bluesky/comments/commentRss/30610.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bluesky/services/trackbacks/30610.html</trackback:ping><description><![CDATA[<P>#include &lt;windows.h&gt;<BR>#include &lt;stdio.h&gt;</P>
<P>#define BUFSIZE 80</P>
<P>BOOL GetOSVer(char *szOSName);</P>
<P>int main()<BR>{<BR>&nbsp;char szname[MAX_PATH];<BR>&nbsp;memset(szname,0,MAX_PATH);</P>
<P>&nbsp;BOOL bRet = GetOSVer(szname);</P>
<P>&nbsp;printf("Your Os version is %s\n ",szname);</P>
<P>&nbsp;return 0;<BR>}</P>
<P>BOOL GetOSVer(char *szname)<BR>{<BR>&nbsp;&nbsp; OSVERSIONINFOEX osvi;<BR>&nbsp;&nbsp; BOOL bOsVersionInfoEx;</P>
<P>&nbsp;&nbsp; // Try calling GetVersionEx using the OSVERSIONINFOEX structure.<BR>&nbsp;&nbsp; // If that fails, try using the OSVERSIONINFO structure.</P>
<P>&nbsp;&nbsp; ZeroMemory(&amp;osvi, sizeof(OSVERSIONINFOEX));<BR>&nbsp;&nbsp; osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);</P>
<P>&nbsp;&nbsp; if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &amp;osvi)) )<BR>&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (! GetVersionEx ( (OSVERSIONINFO *) &amp;osvi) ) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<BR>&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp; switch (osvi.dwPlatformId)<BR>&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Test for the Windows NT product family.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case VER_PLATFORM_WIN32_NT:</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Test for the specific product family.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( osvi.dwMajorVersion == 5 &amp;&amp; osvi.dwMinorVersion == 2 )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(szname,"Microsoft Windows Server 2003 family, ");<BR>&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( osvi.dwMajorVersion == 5 &amp;&amp; osvi.dwMinorVersion == 1 )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(szname,"Microsoft Windows XP ");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( osvi.dwMajorVersion == 5 &amp;&amp; osvi.dwMinorVersion == 0 )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(szname,"Microsoft Windows 2000 ");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( osvi.dwMajorVersion &lt;= 4 )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(szname,"Microsoft Windows NT ");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Test for specific product on Windows NT 4.0 SP6 and later.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( bOsVersionInfoEx )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Test for the workstation type.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( osvi.wProductType == VER_NT_WORKSTATION )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( osvi.dwMajorVersion == 4 )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcat(szname, "Workstation 4.0 " );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if( osvi.wSuiteMask &amp; VER_SUITE_PERSONAL )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcat(szname, "Home Edition " );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcat(szname,&nbsp; "Professional " );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Test for the server type.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if ( osvi.wProductType == VER_NT_SERVER )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( osvi.dwMajorVersion == 5 &amp;&amp; osvi.dwMinorVersion == 2 )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( osvi.wSuiteMask &amp; VER_SUITE_DATACENTER )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcat(szname, "Datacenter Edition " );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if( osvi.wSuiteMask &amp; VER_SUITE_ENTERPRISE )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcat(szname, "Enterprise Edition " );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if ( osvi.wSuiteMask == VER_SUITE_BLADE )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcat(szname, "Web Edition " );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcat(szname, "Standard Edition " );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if( osvi.dwMajorVersion == 5 &amp;&amp; osvi.dwMinorVersion == 0 )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( osvi.wSuiteMask &amp; VER_SUITE_DATACENTER )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcat(szname, "Datacenter Server " );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if( osvi.wSuiteMask &amp; VER_SUITE_ENTERPRISE )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcat(szname, "Advanced Server " );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcat(szname, "Server " );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else&nbsp; // Windows NT 4.0 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( osvi.wSuiteMask &amp; VER_SUITE_ENTERPRISE )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcat(szname,"Server 4.0, Enterprise Edition " );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcat(szname, "Server 4.0 " );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else&nbsp; // Test for specific product on Windows NT 4.0 SP5 and earlier<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HKEY hKey;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char szProductType[BUFSIZE];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD dwBufLen=BUFSIZE;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LONG lRet;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "SYSTEM\\CurrentControlSet\\Control\\ProductOptions",<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0, KEY_QUERY_VALUE, &amp;hKey );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( lRet != ERROR_SUCCESS )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lRet = RegQueryValueEx( hKey, "ProductType", NULL, NULL,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (LPBYTE) szProductType, &amp;dwBufLen);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( (lRet != ERROR_SUCCESS) || (dwBufLen &gt; BUFSIZE) )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RegCloseKey( hKey );</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( lstrcmpi( "WINNT", szProductType) == 0 )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcat(szname, "Workstation " );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( lstrcmpi( "LANMANNT", szProductType) == 0 )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcat(szname, "Server " );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( lstrcmpi( "SERVERNT", szProductType) == 0 )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcat(szname,"Advanced Server " );</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf( "%d.%d ", osvi.dwMajorVersion, osvi.dwMinorVersion );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Display service pack (if any) and build number.</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( osvi.dwMajorVersion == 4 &amp;&amp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lstrcmpi( osvi.szCSDVersion, "Service Pack 6" ) == 0 )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HKEY hKey;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LONG lRet;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Test for SP6 versus SP6a.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Hotfix\\Q246009",<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0, KEY_QUERY_VALUE, &amp;hKey );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( lRet == ERROR_SUCCESS )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf( "Service Pack 6a (Build %d)\n", osvi.dwBuildNumber &amp; 0xFFFF );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else // Windows NT 4.0 prior to SP6a<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf( "%s (Build %d)\n",<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; osvi.szCSDVersion,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; osvi.dwBuildNumber &amp; 0xFFFF);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RegCloseKey( hKey );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else // Windows NT 3.51 and earlier or Windows 2000 and later<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf( "%s (Build %d)\n",<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; osvi.szCSDVersion,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; osvi.dwBuildNumber &amp; 0xFFFF);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Test for the Windows 95 product family.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case VER_PLATFORM_WIN32_WINDOWS:</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (osvi.dwMajorVersion == 4 &amp;&amp; osvi.dwMinorVersion == 0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(szname,"Microsoft Windows 95 ");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( osvi.szCSDVersion[1] == 'C' || osvi.szCSDVersion[1] == 'B' )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcat(szname,"OSR2 " );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (osvi.dwMajorVersion == 4 &amp;&amp; osvi.dwMinorVersion == 10)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(szname,"Microsoft Windows 98 ");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( osvi.szCSDVersion[1] == 'A' )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcat(szname,"SE " );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (osvi.dwMajorVersion == 4 &amp;&amp; osvi.dwMinorVersion == 90)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(szname,"Microsoft Windows Millennium Edition\n");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case VER_PLATFORM_WIN32s:</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf ("Microsoft Win32s\n");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<BR>&nbsp;&nbsp; }<BR>&nbsp; // getchar();<BR>&nbsp;&nbsp; return TRUE; <BR>}</P>
<P><BR>&nbsp;</P><img src ="http://www.blogjava.net/bluesky/aggbug/30610.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bluesky/" target="_blank">bluesky</a> 2006-02-14 14:53 <a href="http://www.blogjava.net/bluesky/archive/2006/02/14/30610.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows窗体C语言</title><link>http://www.blogjava.net/bluesky/archive/2006/02/14/30557.html</link><dc:creator>bluesky</dc:creator><author>bluesky</author><pubDate>Tue, 14 Feb 2006 02:43:00 GMT</pubDate><guid>http://www.blogjava.net/bluesky/archive/2006/02/14/30557.html</guid><wfw:comment>http://www.blogjava.net/bluesky/comments/30557.html</wfw:comment><comments>http://www.blogjava.net/bluesky/archive/2006/02/14/30557.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bluesky/comments/commentRss/30557.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bluesky/services/trackbacks/30557.html</trackback:ping><description><![CDATA[<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">#include&nbsp;&lt;windows.h&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>/*&nbsp;&nbsp;Declare&nbsp;Windows&nbsp;procedure&nbsp;&nbsp;*/<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>LRESULT&nbsp;CALLBACK&nbsp;WindowProcedure&nbsp;(HWND</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">&nbsp;UINT</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">&nbsp;WPARAM</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">&nbsp;LPARAM)</SPAN><SPAN style="COLOR: #008000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>/*&nbsp;&nbsp;Make&nbsp;the&nbsp;class&nbsp;name&nbsp;into&nbsp;a&nbsp;global&nbsp;variable&nbsp;&nbsp;*/<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>char&nbsp;szClassName</SPAN><SPAN style="FONT-WEIGHT: bold; COLOR: #800000">[</SPAN><SPAN style="COLOR: #800000">&nbsp;</SPAN><SPAN style="FONT-WEIGHT: bold; COLOR: #800000">]</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">WindowsApp</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #008000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>int&nbsp;WINAPI&nbsp;WinMain&nbsp;(HINSTANCE&nbsp;hThisInstance</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HINSTANCE&nbsp;hPrevInstance</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LPSTR&nbsp;lpszArgument</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;nFunsterStil)<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;HWND&nbsp;hwnd</SPAN><SPAN style="COLOR: #008000">;</SPAN><SPAN style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;This&nbsp;is&nbsp;the&nbsp;handle&nbsp;for&nbsp;our&nbsp;window&nbsp;*/</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;MSG&nbsp;messages</SPAN><SPAN style="COLOR: #008000">;</SPAN><SPAN style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Here&nbsp;messages&nbsp;to&nbsp;the&nbsp;application&nbsp;are&nbsp;saved&nbsp;*/</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WNDCLASSEX&nbsp;wincl</SPAN><SPAN style="COLOR: #008000">;</SPAN><SPAN style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Data&nbsp;structure&nbsp;for&nbsp;the&nbsp;windowclass&nbsp;*/</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;The&nbsp;Window&nbsp;structure&nbsp;*/<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;wincl.hInstance&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;hThisInstance</SPAN><SPAN style="COLOR: #008000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;wincl.lpszClassName&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;szClassName</SPAN><SPAN style="COLOR: #008000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;wincl.lpfnWndProc&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;WindowProcedure</SPAN><SPAN style="COLOR: #008000">;</SPAN><SPAN style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;This&nbsp;function&nbsp;is&nbsp;called&nbsp;by&nbsp;windows&nbsp;*/</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;wincl.style&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;CS_DBLCLKS</SPAN><SPAN style="COLOR: #008000">;</SPAN><SPAN style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Catch&nbsp;double-clicks&nbsp;*/</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;wincl.cbSize&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;sizeof&nbsp;(WNDCLASSEX)</SPAN><SPAN style="COLOR: #008000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Use&nbsp;default&nbsp;icon&nbsp;and&nbsp;mouse-pointer&nbsp;*/<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;wincl.hIcon&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;LoadIcon&nbsp;(NULL</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">&nbsp;IDI_APPLICATION)</SPAN><SPAN style="COLOR: #008000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;wincl.hIconSm&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;LoadIcon&nbsp;(NULL</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">&nbsp;IDI_APPLICATION)</SPAN><SPAN style="COLOR: #008000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;wincl.hCursor&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;LoadCursor&nbsp;(NULL</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">&nbsp;IDC_ARROW)</SPAN><SPAN style="COLOR: #008000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;wincl.lpszMenuName&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;NULL</SPAN><SPAN style="COLOR: #008000">;</SPAN><SPAN style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;No&nbsp;menu&nbsp;*/</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;wincl.cbClsExtra&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #008000">;</SPAN><SPAN style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;No&nbsp;extra&nbsp;bytes&nbsp;after&nbsp;the&nbsp;window&nbsp;class&nbsp;*/</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;wincl.cbWndExtra&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #008000">;</SPAN><SPAN style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;structure&nbsp;or&nbsp;the&nbsp;window&nbsp;instance&nbsp;*/</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Use&nbsp;Windows's&nbsp;default&nbsp;color&nbsp;as&nbsp;the&nbsp;background&nbsp;of&nbsp;the&nbsp;window&nbsp;*/<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;wincl.hbrBackground&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;(HBRUSH)&nbsp;COLOR_BACKGROUND</SPAN><SPAN style="COLOR: #008000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Register&nbsp;the&nbsp;window&nbsp;class</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">&nbsp;and&nbsp;if&nbsp;it&nbsp;fails&nbsp;quit&nbsp;the&nbsp;program&nbsp;*/<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!RegisterClassEx&nbsp;(&amp;wincl))<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #008000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;The&nbsp;class&nbsp;is&nbsp;registered</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">&nbsp;let's&nbsp;create&nbsp;the&nbsp;program*/<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;hwnd&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;CreateWindowEx&nbsp;(<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Extended&nbsp;possibilites&nbsp;for&nbsp;variation&nbsp;*/<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;szClassName</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Classname&nbsp;*/<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Windows&nbsp;App</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Title&nbsp;Text&nbsp;*/<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WS_OVERLAPPEDWINDOW</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">&nbsp;/*&nbsp;default&nbsp;window&nbsp;*/<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CW_USEDEFAULT</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Windows&nbsp;decides&nbsp;the&nbsp;position&nbsp;*/<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CW_USEDEFAULT</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;where&nbsp;the&nbsp;window&nbsp;ends&nbsp;up&nbsp;on&nbsp;the&nbsp;screen&nbsp;*/<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">544</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;The&nbsp;programs&nbsp;width&nbsp;*/<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">375</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;and&nbsp;height&nbsp;in&nbsp;pixels&nbsp;*/<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HWND_DESKTOP</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;The&nbsp;window&nbsp;is&nbsp;a&nbsp;child-window&nbsp;to&nbsp;desktop&nbsp;*/<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;No&nbsp;menu&nbsp;*/<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hThisInstance</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Program&nbsp;Instance&nbsp;handler&nbsp;*/<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;No&nbsp;Window&nbsp;Creation&nbsp;data&nbsp;*/<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)</SPAN><SPAN style="COLOR: #008000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Make&nbsp;the&nbsp;window&nbsp;visible&nbsp;on&nbsp;the&nbsp;screen&nbsp;*/<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ShowWindow&nbsp;(hwnd</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">&nbsp;nFunsterStil)</SPAN><SPAN style="COLOR: #008000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Run&nbsp;the&nbsp;message&nbsp;loop.&nbsp;It&nbsp;will&nbsp;run&nbsp;until&nbsp;GetMessage()&nbsp;returns&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">&nbsp;*/<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(GetMessage&nbsp;(&amp;messages</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">&nbsp;NULL</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">))<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Translate&nbsp;virtual-key&nbsp;messages&nbsp;into&nbsp;character&nbsp;messages&nbsp;*/<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TranslateMessage(&amp;messages)</SPAN><SPAN style="COLOR: #008000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Send&nbsp;message&nbsp;to&nbsp;WindowProcedure&nbsp;*/<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DispatchMessage(&amp;messages)</SPAN><SPAN style="COLOR: #008000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;The&nbsp;program&nbsp;return-value&nbsp;is&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">&nbsp;-&nbsp;The&nbsp;value&nbsp;that&nbsp;PostQuitMessage()&nbsp;gave&nbsp;*/<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;messages.wParam</SPAN><SPAN style="COLOR: #008000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">}<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>/*&nbsp;&nbsp;This&nbsp;function&nbsp;is&nbsp;called&nbsp;by&nbsp;the&nbsp;Windows&nbsp;function&nbsp;DispatchMessage()&nbsp;&nbsp;*/<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>LRESULT&nbsp;CALLBACK&nbsp;WindowProcedure&nbsp;(HWND&nbsp;hwnd</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">&nbsp;UINT&nbsp;message</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">&nbsp;WPARAM&nbsp;wParam</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">&nbsp;LPARAM&nbsp;lParam)<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(message)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;handle&nbsp;the&nbsp;messages&nbsp;*/<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;WM_DESTROY:<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostQuitMessage&nbsp;(</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">)</SPAN><SPAN style="COLOR: #008000">;</SPAN><SPAN style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;send&nbsp;a&nbsp;WM_QUIT&nbsp;to&nbsp;the&nbsp;message&nbsp;queue&nbsp;*/</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break</SPAN><SPAN style="COLOR: #008000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;for&nbsp;messages&nbsp;that&nbsp;we&nbsp;don't&nbsp;deal&nbsp;with&nbsp;*/<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;DefWindowProc&nbsp;(hwnd</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">&nbsp;message</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">&nbsp;wParam</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">&nbsp;lParam)</SPAN><SPAN style="COLOR: #008000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #008000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">}<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV><img src ="http://www.blogjava.net/bluesky/aggbug/30557.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bluesky/" target="_blank">bluesky</a> 2006-02-14 10:43 <a href="http://www.blogjava.net/bluesky/archive/2006/02/14/30557.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>水仙花问题</title><link>http://www.blogjava.net/bluesky/archive/2006/02/13/30480.html</link><dc:creator>bluesky</dc:creator><author>bluesky</author><pubDate>Mon, 13 Feb 2006 09:24:00 GMT</pubDate><guid>http://www.blogjava.net/bluesky/archive/2006/02/13/30480.html</guid><wfw:comment>http://www.blogjava.net/bluesky/comments/30480.html</wfw:comment><comments>http://www.blogjava.net/bluesky/archive/2006/02/13/30480.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bluesky/comments/commentRss/30480.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bluesky/services/trackbacks/30480.html</trackback:ping><description><![CDATA[解法1<BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">#include&nbsp;&lt;stdio.h&gt;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>int&nbsp;main()&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>{&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>int&nbsp;shu</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">bai</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">shi</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">ge</SPAN><SPAN style="COLOR: #008000">;</SPAN><SPAN style="COLOR: #008000">&nbsp;</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;for&nbsp;(shu</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">100</SPAN><SPAN style="COLOR: #008000">;</SPAN><SPAN style="COLOR: #008000">shu&lt;1000;shu++)&nbsp;</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;{&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;bai</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">shu/</SPAN><SPAN style="COLOR: #000000">100</SPAN><SPAN style="COLOR: #008000">;</SPAN><SPAN style="COLOR: #008000">&nbsp;</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;shi</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">(shu-bai*</SPAN><SPAN style="COLOR: #000000">100</SPAN><SPAN style="COLOR: #000000">)/</SPAN><SPAN style="COLOR: #000000">10</SPAN><SPAN style="COLOR: #008000">;</SPAN><SPAN style="COLOR: #008000">&nbsp;</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;ge</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">shu-bai*</SPAN><SPAN style="COLOR: #000000">100</SPAN><SPAN style="COLOR: #000000">-shi*</SPAN><SPAN style="COLOR: #000000">10</SPAN><SPAN style="COLOR: #008000">;</SPAN><SPAN style="COLOR: #008000">&nbsp;</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;if(shu</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">(bai*bai*bai+shi*shi*shi+ge*ge*ge))&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;printf(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">%d\n</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">shu)</SPAN><SPAN style="COLOR: #008000">;</SPAN><SPAN style="COLOR: #008000">&nbsp;</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;}&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>}&nbsp;</SPAN></DIV><BR>解法2<BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">int&nbsp;main(){&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>int&nbsp;a</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">b</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">c</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">num</SPAN><SPAN style="COLOR: #008000">;</SPAN><SPAN style="COLOR: #008000">&nbsp;</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">for(a</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #008000">;</SPAN><SPAN style="COLOR: #008000">a&lt;10;a++){&nbsp;</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">for(b</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #008000">;</SPAN><SPAN style="COLOR: #008000">b&lt;10;b++){&nbsp;</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">for(c</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #008000">;</SPAN><SPAN style="COLOR: #008000">c&lt;10;c++){&nbsp;</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">if(a*</SPAN><SPAN style="COLOR: #000000">100</SPAN><SPAN style="COLOR: #000000">+b*</SPAN><SPAN style="COLOR: #000000">10</SPAN><SPAN style="COLOR: #000000">+c</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">(num</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">a*a*a+b*b*b+c*c*c))&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>printf(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">%d</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">num)</SPAN><SPAN style="COLOR: #008000">;</SPAN><SPAN style="COLOR: #008000">&nbsp;</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">}&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>}&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>}&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>}&nbsp;</SPAN></DIV><BR><img src ="http://www.blogjava.net/bluesky/aggbug/30480.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bluesky/" target="_blank">bluesky</a> 2006-02-13 17:24 <a href="http://www.blogjava.net/bluesky/archive/2006/02/13/30480.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C输出文件函数</title><link>http://www.blogjava.net/bluesky/archive/2006/02/13/30479.html</link><dc:creator>bluesky</dc:creator><author>bluesky</author><pubDate>Mon, 13 Feb 2006 09:16:00 GMT</pubDate><guid>http://www.blogjava.net/bluesky/archive/2006/02/13/30479.html</guid><wfw:comment>http://www.blogjava.net/bluesky/comments/30479.html</wfw:comment><comments>http://www.blogjava.net/bluesky/archive/2006/02/13/30479.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bluesky/comments/commentRss/30479.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bluesky/services/trackbacks/30479.html</trackback:ping><description><![CDATA[#include&lt;stdio.h&gt; <br />int main() <br />{<br />&nbsp;FILE *fp; <br />&nbsp;&nbsp;fp=fopen(&quot;fileout.txt&quot;,&quot;w+&quot;); <br />&nbsp;&nbsp;fprintf(fp,&quot;Helloworld&quot;);<br />&nbsp;&nbsp;fputc('\n',fp); <br />&nbsp;&nbsp;fclose(fp);<br />&nbsp;&nbsp;return 0;<br />}<img src ="http://www.blogjava.net/bluesky/aggbug/30479.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bluesky/" target="_blank">bluesky</a> 2006-02-13 17:16 <a href="http://www.blogjava.net/bluesky/archive/2006/02/13/30479.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GCC 简介</title><link>http://www.blogjava.net/bluesky/archive/2006/02/13/30468.html</link><dc:creator>bluesky</dc:creator><author>bluesky</author><pubDate>Mon, 13 Feb 2006 08:19:00 GMT</pubDate><guid>http://www.blogjava.net/bluesky/archive/2006/02/13/30468.html</guid><wfw:comment>http://www.blogjava.net/bluesky/comments/30468.html</wfw:comment><comments>http://www.blogjava.net/bluesky/archive/2006/02/13/30468.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bluesky/comments/commentRss/30468.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bluesky/services/trackbacks/30468.html</trackback:ping><description><![CDATA[本节学习GNU推出的Linux系统下C编译器----gcc，主要介绍这种编译器的基本原理和使用方法，以及编译过程中所产生的错误的原因及对策。 <br /><br />gcc简介 <br />Linux系统下的gcc（GNU C Compiler）是GNU推出的功能强大、性能优越的多平台编译器，是GNU的代表作品之一。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器，其执行效率与一般的编译器相比平均效率要高20%~30%。 <br /><br />gcc编译器能将C、C++语言源程序、汇程式化序和目标程序编译、连接成可执行文件，如果没有给出可执行文件的名字，gcc将生成一个名为a.out的文件。在Linux系统中，可执行文件没有统一的后缀，系统从文件的属性来区分可执行文件和不可执行文件。而gcc则通过后缀来区别输入文件的类别，下面我们来介绍gcc所遵循的部分约定规则。 <br /><br />.c为后缀的文件，C语言源代码文件； <br /><br />.a为后缀的文件，是由目标文件构成的档案库文件； <br /><br />.C，.cc或.cxx 为后缀的文件，是C++源代码文件； <br /><br />.h为后缀的文件，是程序所包含的头文件； <br /><br />.i 为后缀的文件，是已经预处理过的C源代码文件； <br /><br />.ii为后缀的文件，是已经预处理过的C++源代码文件； <br /><br />.m为后缀的文件，是Objective-C源代码文件； <br /><br />.o为后缀的文件，是编译后的目标文件； <br /><br />.s为后缀的文件，是汇编语言源代码文件； <br /><br />.S为后缀的文件，是经过预编译的汇编语言源代码文件。 <br /><br />gcc的执行过程 <br />虽然我们称gcc是C语言的编译器，但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程，而是要经历四个相互关联的步骤∶预处理(也称预编译，Preprocessing)、编译(Compilation)、汇编(Assembly)和连接(Linking)。 <br /><br />命令gcc首先调用cpp进行预处理，在预处理过程中，对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。接着调用cc1进行编译，这个阶段根据输入文件生成以.o为后缀的目标文件。汇编过程是针对汇编语言的步骤，调用as进行工作，一般来讲，.S为后缀的汇编语言源代码文件和汇编、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。当所有的目标文件都生成之后，gcc就调用ld来完成最后的关键性工作，这个阶段就是连接。在连接阶段，所有的目标文件被安排在可执行程序中的恰当的位置，同时，该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。 <br /><br />gcc的基本用法和选项 <br />在使用gcc编译器的时候，我们必须给出一系列必要的调用参数和文件名称。gcc编译器的调用参数大约有100多个，其中多数参数我们可能根本就用不到，这里只介绍其中最基本、最常用的参数。 <br /><br />gcc最基本的用法是∶gcc [options] [filenames] <br /><br />其中options就是编译器所需要的参数，filenames给出相关的文件名称。 <br /><br />-c，只编译，不连接成为可执行文件，编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件，通常用于编译不包含主程序的子程序文件。 <br /><br />-o output_filename，确定输出文件的名称为output_filename，同时这个名称不能和源文件同名。如果不给出这个选项，gcc就给出预设的可执行文件a.out。 <br /><br />-g，产生符号调试工具(GNU的gdb)所必要的符号资讯，要想对源代码进行调试，我们就必须加入这个选项。 <br /><br />-O，对程序进行优化编译、连接，采用这个选项，整个源代码会在编译、连接过程中进行优化处理，这样产生的可执行文件的执行效率可以提高，但是，编译、连接的速度就相应地要慢一些。 <br /><br />-O2，比-O更好的优化编译、连接，当然整个编译、连接过程会更慢。 <br /><br />-Idirname，将dirname所指出的目录加入到程序头文件目录列表中，是在预编译过程中使用的参数。C程序中的头文件包含两种情况∶ <br /><br />A)#include <br /><br />B)#include &ldquo;myinc.h&rdquo; <br /><br />其中，A类使用尖括号(&lt; &gt;)，B类使用双引号(&ldquo; &rdquo;)。对于A类，预处理程序cpp在系统预设包含文件目录(如/usr/include)中搜寻相应的文件，而对于B类，cpp在当前目录中搜寻头文件，这个选项的作用是告诉cpp，如果在当前目录中没有找到需要的文件，就到指定的dirname目录中去寻找。在程序设计中，如果我们需要的这种包含文件分别分布在不同的目录中，就需要逐个使用-I选项给出搜索路径。 <br /><br />-Ldirname，将dirname所指出的目录加入到程序函数档案库文件的目录列表中，是在连接过程中使用的参数。在预设状态下，连接程序ld在系统的预设路径中(如/usr/lib)寻找所需要的档案库文件，这个选项告诉连接程序，首先到-L指定的目录中去寻找，然后到系统预设路径中寻找，如果函数库存放在多个目录下，就需要依次使用这个选项，给出相应的存放目录。 <br /><br />-lname，在连接时，装载名字为&ldquo;libname.a&rdquo;的函数库，该函数库位于系统预设的目录或者由-L选项确定的目录下。例如，-lm表示连接名为&ldquo;libm.a&rdquo;的数学函数库。 <br /><br />上面我们简要介绍了gcc编译器最常用的功能和主要参数选项，更为详尽的资料可以参看Linux系统的联机帮助。 <br /><br />假定我们有一个程序名为test.c的C语言源代码文件，要生成一个可执行文件，最简单的办法就是∶ <br /><br />gcc test.c <br /><br />这时，预编译、编译连接一次完成，生成一个系统预设的名为a.out的可执行文件，对于稍为复杂的情况，比如有多个源代码文件、需要连接档案库或者有其他比较特别的要求，就要给定适当的调用选项参数。再看一个简单的例子。 <br /><br />整个源代码程序由两个文件testmain.c 和testsub.c组成，程序中使用了系统提供的数学库，同时希望给出的可执行文件为test，这时的编译命令可以是∶ <br /><br />gcc testmain.c testsub.c □lm □o test <br /><br />其中，-lm表示连接系统的数学库libm.a，这个过程可以用图12-1框图描述。 <br /><br /><br />gcc的错误类型及对策 <br />gcc编译器如果发现源程序中有错误，就无法继续进行，也无法生成最终的可执行文件。为了便于修改，gcc给出错误资讯，我们必须对这些错误资讯逐个进行分析、处理，并修改相应的语言，才能保证源代码的正确编译连接。gcc给出的错误资讯一般可以分为四大类，下面我们分别讨论其产生的原因和对策。 <br /><br />第一类∶C语法错误 <br />错误资讯∶文件source.c中第n行有语法错误(syntex errror)。这种类型的错误，一般都是C语言的语法错误，应该仔细检查源代码文件中第n行及该行之前的程序，有时也需要对该文件所包含的头文件进行检查。有些情况下，一个很简单的语法错误，gcc会给出一大堆错误，我们最主要的是要保持清醒的头脑，不要被其吓倒，必要的时候再参考一下C语言的基本教材。 <br /><br />第二类∶头文件错误 <br />错误资讯∶找不到头文件head.h(Can not find include file head.h)。这类错误是源代码文件中的包含头文件有问题，可能的原因有头文件名错误、指定的头文件所在目录名错误等，也可能是错误地使用了双引号和尖括号。 <br /><br />第三类∶档案库错误 <br />错误资讯∶连接程序找不到所需的函数库，例如∶ <br /><br />ld: -lm: No such file or directory <br /><br />这类错误是与目标文件相连接的函数库有错误，可能的原因是函数库名错误、指定的函数库所在目录名称错误等，检查的方法是使用find命令在可能的目录中寻找相应的函数库名，确定档案库及目录的名称并修改程序中及编译选项中的名称。 <br /><br />第四类∶未定义符号 <br />错误资讯∶有未定义的符号(Undefined symbol)。这类错误是在连接过程中出现的，可能有两种原因∶一是使用者自己定义的函数或者全局变量所在源代码文件，没有被编译、连接，或者干脆还没有定义，这需要使用者根据实际情况修改源程序，给出全局变量或者函数的定义体；二是未定义的符号是一个标准的库函数，在源程序中使用了该库函数，而连接过程中还没有给定相应的函数库的名称，或者是该档案库的目录名称有问题，这时需要使用档案库维护命令ar检查我们需要的库函数到底位于哪一个函数库中，确定之后，修改gcc连接选项中的-l和-L项。<br /><br />排除编译、连接过程中的错误，应该说这只是程序设计中最简单、最基本的一个步骤，可以说只是开了个头。这个过程中的错误，只是我们在使用C语言描述一个算法中所产生的错误，是比较容易排除的。我们写一个程序，到编译、连接通过为止，应该说刚刚开始，程序在运行过程中所出现的问题，是算法设计有问题，说得更玄点是对问题的认识和理解不够，还需要更加深入地测试、调试和修改。一个程序，稍为复杂的程序，往往要经过多次的编译、连接和测试、修改。下面我们学习的程序维护、调试工具和版本维护就是在程序调试、测试过程中使用的，用来解决调测阶段所出现的问题<br /><br /><a href="http://www.study888.com/computer/pro/c/jiqiao/200506/37410_2.html">http://www.study888.com/computer/pro/c/jiqiao/200506/37410_2.html</a><img src ="http://www.blogjava.net/bluesky/aggbug/30468.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bluesky/" target="_blank">bluesky</a> 2006-02-13 16:19 <a href="http://www.blogjava.net/bluesky/archive/2006/02/13/30468.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GCC介绍</title><link>http://www.blogjava.net/bluesky/archive/2006/02/13/30466.html</link><dc:creator>bluesky</dc:creator><author>bluesky</author><pubDate>Mon, 13 Feb 2006 08:12:00 GMT</pubDate><guid>http://www.blogjava.net/bluesky/archive/2006/02/13/30466.html</guid><wfw:comment>http://www.blogjava.net/bluesky/comments/30466.html</wfw:comment><comments>http://www.blogjava.net/bluesky/archive/2006/02/13/30466.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bluesky/comments/commentRss/30466.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bluesky/services/trackbacks/30466.html</trackback:ping><description><![CDATA[<p>在为Linux开发应用程序时,绝大多数情况下使用的都是C语言,因此几乎每一位Linux程序员面临的首要问题都是如何</p>
<p>灵活运用C编译器.目前Linux下最常用的C语言编译器是GCC(GNU Compiler Collection),它是GNU项目中符合ANSI C</p>
<p>标准的编译系统,能够编译用C、C++和Object C等语言编写的程序.GCC不仅功能非常强大,结构也异常灵活.最值得称</p>
<p>道的一点就是它可以通过不同的前端模块来支持各种语言,如Java、Fortran、Pascal、Modula-3和Ada等. </p>
<p>开放、自由和灵活是Linux的魅力所在,而这一点在GCC上的体现就是程序员通过它能够更好地控制整个编译过程.在</p>
<p>使用GCC编译程序时,编译过程可以被细分为四个阶段: </p>
<p>◆ 预处理(Pre-Processing) </p>
<p>◆ 编译(Compiling) </p>
<p>◆ 汇编(Assembling) </p>
<p>◆ 链接(Linking) </p>
<p>Linux程序员可以根据自己的需要让GCC在编译的任何阶段结束,以便检查或使用编译器在该阶段的输出信息,或者对</p>
<p>最后生成的二进制文件进行控制,以便通过加入不同数量和种类的调试代码来为今后的调试做好准备.和其它常用的</p>
<p>编译器一样,GCC也提供了灵活而强大的代码优化功能,利用它可以生成执行效率更高的代码. </p>
<p>GCC提供了30多条警告信息和三个警告级别,使用它们有助于增强程序的稳定性和可移植性.此外,GCC还对标准的C和</p>
<p>C++语言进行了大量的扩展,提高程序的执行效率,有助于编译器进行代码优化,能够减轻编程的工作量. </p>
<p>GCC起步 </p>
<p>在学习使用GCC之前,下面的这个例子能够帮助用户迅速理解GCC的工作原理,并将其立即运用到实际的项目开发中去.</p>
<p>首先用熟悉的编辑器输入清单1所示的代码: </p>
<p>清单1:hello.c </p>
<p>#include &lt;stdio.h&gt;<br />int main(void)<br />{<br />&nbsp;printf (Hello world, Linux programming!\\n);<br />&nbsp;return 0;<br />}<br />&nbsp;</p>
<p><br />然后执行下面的命令编译和运行这段程序: </p>
<p># gcc hello.c -o hello<br /># ./hello<br />Hello world, Linux programming!<br />&nbsp;</p>
<p><br />从程序员的角度看,只需简单地执行一条GCC命令就可以了,但从编译器的角度来看,却需要完成一系列非常繁杂的工</p>
<p>作.首先,GCC需要调用预处理程序cpp,由它负责展开在源文件中定义的宏,并向其中插入&ldquo;#include&rdquo;语句所包含的</p>
<p>内容；接着,GCC会调用ccl和as将处理后的源代码编译成目标代码；最后,GCC会调用链接程序ld,把生成的目标代码</p>
<p>链接成一个可执行程序. </p>
<p>为了更好地理解GCC的工作过程,可以把上述编译过程分成几个步骤单独进行,并观察每步的运行结果.第一步是进行</p>
<p>预编译,使用-E参数可以让GCC在预处理结束后停止编译过程: </p>
<p>#&nbsp; gcc -E hello.c -o hello.i<br />&nbsp;</p>
<p><br />此时若查看hello.cpp文件中的内容,会发现stdio.h的内容确实都插到文件里去了,而其它应当被预处理的宏定义也</p>
<p>都做了相应的处理.下一步是将hello.i编译为目标代码,这可以通过使用-c参数来完成: </p>
<p>#&nbsp; gcc -c hello.i -o hello.o<br />&nbsp;</p>
<p><br />GCC默认将.i文件看成是预处理后的C语言源代码,因此上述命令将自动跳过预处理步骤而开始执行编译过程,也可以</p>
<p>使用-x参数让GCC从指定的步骤开始编译.最后一步是将生成的目标文件链接成可执行文件: </p>
<p>#&nbsp; gcc hello.o -o hello<br />&nbsp;</p>
<p><br />在采用模块化的设计思想进行软件开发时,通常整个程序是由多个源文件组成的,相应地也就形成了多个编译单元,使</p>
<p>用GCC能够很好地管理这些编译单元.假设有一个由foo1.c和foo2.c两个源文件组成的程序,为了对它们进行编译,并</p>
<p>最终生成可执行程序foo,可以使用下面这条命令: </p>
<p>#&nbsp; gcc foo1.c foo2.c -o foo<br />&nbsp;</p>
<p><br />如果同时处理的文件不止一个,GCC仍然会按照预处理、编译和链接的过程依次进行.如果深究起来,上面这条命令大</p>
<p>致相当于依次执行如下三条命令: </p>
<p># gcc -c foo1.c -o foo1.o<br /># gcc -c foo2.c -o foo2.o<br /># gcc foo1.o foo2.o -o foo<br />&nbsp;</p>
<p><br />在编译一个包含许多源文件的工程时,若只用一条GCC命令来完成编译是非常浪费时间的.假设项目中有100个源文件</p>
<p>需要编译,并且每个源文件中都包含10000行代码,如果像上面那样仅用一条GCC命令来完成编译工作,那么GCC需要将</p>
<p>每个源文件都重新编译一遍,然后再全部连接起来.很显然,这样浪费的时间相当多,尤其是当用户只是修改了其中某</p>
<p>一个文件的时候,完全没有必要将每个文件都重新编译一遍,因为很多已经生成的目标文件是不会改变的.要解决这个</p>
<p>问题,关键是要灵活运用GCC,同时还要借助像Make这样的工具. </p>
<p>警告提示功能 </p>
<p>GCC包含完整的出错检查和警告提示功能,它们可以帮助Linux程序员写出更加专业和优美的代码.先来读读清单2所示</p>
<p>的程序,这段代码写得很糟糕,仔细检查一下不难挑出很多毛病: </p>
<p>◆main函数的返回值被声明为void,但实际上应该是int； </p>
<p>◆使用了GNU语法扩展,即使用long long来声明64位整数,不符合ANSI/ISO C语言标准； </p>
<p>◆main函数在终止前没有调用return语句. </p>
<p>清单2:illcode.c </p>
<p>#include &lt;stdio.h&gt;<br />void main(void)<br />{<br />&nbsp; long long int var = 1;<br />&nbsp; printf(It is not standard C code!\\n);<br />}<br />&nbsp;</p>
<p><br />下面来看看GCC是如何帮助程序员来发现这些错误的.当GCC在编译不符合ANSI/ISO C语言标准的源代码时,如果加上</p>
<p>了-pedantic选项,那么使用了扩展语法的地方将产生相应的警告信息: </p>
<p># gcc -pedantic illcode.c -o illcode<br />illcode.c: In function `main':<br />illcode.c:9: ISO C89 does not support `long long'<br />illcode.c:8: return type of `main' is not `int'<br />&nbsp;</p>
<p><br />需要注意的是,-pedantic编译选项并不能保证被编译程序与ANSI/ISO C标准的完全兼容,它仅仅只能用来帮助Linux</p>
<p>程序员离这个目标越来越近.或者换句话说,-pedantic选项能够帮助程序员发现一些不符合ANSI/ISO C标准的代码,</p>
<p>但不是全部,事实上只有ANSI/ISO C语言标准中要求进行编译器诊断的那些情况,才有可能被GCC发现并提出警告. </p>
<p>除了-pedantic之外,GCC还有一些其它编译选项也能够产生有用的警告信息.这些选项大多以-W开头,其中最有价值的</p>
<p>当数-Wall了,使用它能够使GCC产生尽可能多的警告信息: </p>
<p># gcc -Wall illcode.c -o illcode<br />illcode.c:8: warning: return type of `main' is not `int'<br />illcode.c: In function `main':<br />illcode.c:9: warning: unused variable `var'<br />&nbsp;</p>
<p><br />GCC给出的警告信息虽然从严格意义上说不能算作是错误,但却很可能成为错误的栖身之所.一个优秀的Linux程序员</p>
<p>应该尽量避免产生警告信息,使自己的代码始终保持简洁、优美和健壮的特性. </p>
<p>在处理警告方面,另一个常用的编译选项是-Werror,它要求GCC将所有的警告当成错误进行处理,这在使用自动编译工</p>
<p>具(如Make等)时非常有用.如果编译时带上-Werror选项,那么GCC会在所有产生警告的地方停止编译,迫使程序员对自</p>
<p>己的代码进行修改.只有当相应的警告信息消除时,才可能将编译过程继续朝前推进.执行情况如下: </p>
<p># gcc -Wall -Werror illcode.c -o illcode<br />cc1: warnings being treated as errors<br />illcode.c:8: warning: return type of `main' is not `int'<br />illcode.c: In function `main':<br />illcode.c:9: warning: unused variable `var'<br />&nbsp;</p>
<p><br />对Linux程序员来讲,GCC给出的警告信息是很有价值的,它们不仅可以帮助程序员写出更加健壮的程序,而且还是跟踪</p>
<p>和调试程序的有力工具.建议在用GCC编译源代码时始终带上-Wall选项,并把它逐渐培养成为一种习惯,这对找出常见</p>
<p>的隐式编程错误很有帮助. </p>
<p>库依赖 </p>
<p>在Linux下开发软件时,完全不使用第三方函数库的情况是比较少见的,通常来讲都需要借助一个或多个函数库的支持</p>
<p>才能够完成相应的功能.从程序员的角度看,函数库实际上就是一些头文件(.h)和库文件(.so或者.a)的集合.虽然</p>
<p>Linux下的大多数函数都默认将头文件放到/usr/include/目录下,而库文件则放到/usr/lib/目录下,但并不是所有的</p>
<p>情况都是这样.正因如此,GCC在编译时必须有自己的办法来查找所需要的头文件和库文件. </p>
<p>GCC采用搜索目录的办法来查找所需要的文件,-I选项可以向GCC的头文件搜索路径中添加新的目录.例如,如果</p>
<p>在/home/xiaowp/include/目录下有编译时所需要的头文件,为了让GCC能够顺利地找到它们,就可以使用-I选项: </p>
<p># gcc foo.c -I /home/xiaowp/include -o foo<br />&nbsp;</p>
<p><br />同样,如果使用了不在标准位置的库文件,那么可以通过-L选项向GCC的库文件搜索路径中添加新的目录.例如,如果在</p>
<p>/home/xiaowp/lib/目录下有链接时所需要的库文件libfoo.so,为了让GCC能够顺利地找到它,可以使用下面的命令: </p>
<p># gcc foo.c -L /home/xiaowp/lib -lfoo -o foo<br />&nbsp;</p>
<p><br />值得好好解释一下的是-l选项,它指示GCC去连接库文件libfoo.so.Linux下的库文件在命名时有一个约定,那就是应</p>
<p>该以lib三个字母开头,由于所有的库文件都遵循了同样的规范,因此在用-l选项指定链接的库文件名时可以省去lib</p>
<p>三个字母,也就是说GCC在对-lfoo进行处理时,会自动去链接名为libfoo.so的文件. </p>
<p>Linux下的库文件分为两大类分别是动态链接库(通常以.so结尾)和静态链接库(通常以.a结尾),两者的差别仅在程序</p>
<p>执行时所需的代码是在运行时动态加载的,还是在编译时静态加载的.默认情况下,GCC在链接时优先使用动态链接库,</p>
<p>只有当动态链接库不存在时才考虑使用静态链接库,如果需要的话可以在编译时加上-static选项,强制使用静态链接</p>
<p>库.例如,如果在/home/xiaowp/lib/目录下有链接时所需要的库文件libfoo.so和libfoo.a,为了让GCC在链接时只用</p>
<p>到静态链接库,可以使用下面的命令: </p>
<p># gcc foo.c -L /home/xiaowp/lib -static -lfoo -o foo<br />&nbsp;<br />代码优化 </p>
<p>代码优化指的是编译器通过分析源代码,找出其中尚未达到最优的部分,然后对其重新进行组合,目的是改善程序的执</p>
<p>行性能.GCC提供的代码优化功能非常强大,它通过编译选项-On来控制优化代码的生成,其中n是一个代表优化级别的</p>
<p>整数.对于不同版本的GCC来讲,n的取值范围及其对应的优化效果可能并不完全相同,比较典型的范围是从0变化到2或</p>
<p>3. </p>
<p>编译时使用选项-O可以告诉GCC同时减小代码的长度和执行时间,其效果等价于-O1.在这一级别上能够进行的优化类</p>
<p>型虽然取决于目标处理器,但一般都会包括线程跳转(Thread Jump)和延迟退栈(Deferred Stack Pops)两种优化.选</p>
<p>项-O2告诉GCC除了完成所有-O1级别的优化之外,同时还要进行一些额外的调整工作,如处理器指令调度等.选项-O3则</p>
<p>除了完成所有-O2级别的优化之外,还包括循环展开和其它一些与处理器特性相关的优化工作.通常来说,数字越大优</p>
<p>化的等级越高,同时也就意味着程序的运行速度越快.许多Linux程序员都喜欢使用-O2选项,因为它在优化长度、编译</p>
<p>时间和代码大小之间,取得了一个比较理想的平衡点. </p>
<p>下面通过具体实例来感受一下GCC的代码优化功能,所用程序如清单3所示. </p>
<p>清单3:optimize.c </p>
<p>#include &lt;stdio.h&gt; <br />int main(void)<br />{<br />&nbsp; double counter;<br />&nbsp; double result;<br />&nbsp; double temp;<br />&nbsp; for (counter = 0; <br />&nbsp;&nbsp; counter &lt; 2000.0 * 2000.0 * 2000.0&nbsp; / 20.0 + 2020; <br />&nbsp;&nbsp; counter += (5 - 1) / 4) {<br />&nbsp;&nbsp;&nbsp; temp = counter / 1979;<br />&nbsp;&nbsp;&nbsp; result&nbsp; = counter;&nbsp;&nbsp;&nbsp; <br />&nbsp; }<br />&nbsp; printf(Result is %lf\\n, result);<br />&nbsp; return 0;<br />}<br />&nbsp;</p>
<p><br />首先不加任何优化选项进行编译: </p>
<p># gcc -Wall optimize.c -o optimize<br />&nbsp;</p>
<p><br />借助Linux提供的time命令,可以大致统计出该程序在运行时所需要的时间: </p>
<p># time ./optimize<br />Result is 400002019.000000<br />real&nbsp;&nbsp;&nbsp; 0m14.942s<br />user&nbsp;&nbsp;&nbsp; 0m14.940s<br />sys&nbsp;&nbsp;&nbsp;&nbsp; 0m0.000s<br />&nbsp;</p>
<p><br />接下去使用优化选项来对代码进行优化处理: </p>
<p># gcc -Wall -O optimize.c -o optimize<br />&nbsp;</p>
<p><br />在同样的条件下再次测试一下运行时间: </p>
<p># time ./optimize<br />Result is 400002019.000000<br />real&nbsp;&nbsp;&nbsp; 0m3.256s<br />user&nbsp;&nbsp;&nbsp; 0m3.240s<br />sys&nbsp;&nbsp;&nbsp;&nbsp; 0m0.000s<br />&nbsp;</p>
<p><br />对比两次执行的输出结果不难看出,程序的性能的确得到了很大幅度的改善,由原来的14秒缩短到了3秒.这个例子是</p>
<p>专门针对GCC的优化功能而设计的,因此优化前后程序的执行速度发生了很大的改变.尽管GCC的代码优化功能非常强</p>
<p>大,但作为一名优秀的Linux程序员,首先还是要力求能够手工编写出高质量的代码.如果编写的代码简短,并且逻辑性</p>
<p>强,编译器就不会做更多的工作,甚至根本用不着优化. </p>
<p>优化虽然能够给程序带来更好的执行性能,但在如下一些场合中应该避免优化代码: </p>
<p>◆ 程序开发的时候 优化等级越高,消耗在编译上的时间就越长,因此在开发的时候最好不要使用优化选项,只有到软</p>
<p>件发行或开发结束的时候,才考虑对最终生成的代码进行优化. </p>
<p>◆ 资源受限的时候 一些优化选项会增加可执行代码的体积,如果程序在运行时能够申请到的内存资源非常紧张(如</p>
<p>一些实时嵌入式设备),那就不要对代码进行优化,因为由这带来的负面影响可能会产生非常严重的后果. </p>
<p>◆ 跟踪调试的时候 在对代码进行优化的时候,某些代码可能会被删除或改写,或者为了取得更佳的性能而进行重组,</p>
<p>从而使跟踪和调试变得异常困难. </p>
<p>调试 </p>
<p>一个功能强大的调试器不仅为程序员提供了跟踪程序执行的手段,而且还可以帮助程序员找到解决问题的方法.对于</p>
<p>Linux程序员来讲,GDB(GNU Debugger)通过与GCC的配合使用,为基于Linux的软件开发提供了一个完善的调试环境. </p>
<p>默认情况下,GCC在编译时不会将调试符号插入到生成的二进制代码中,因为这样会增加可执行文件的大小.如果需要</p>
<p>在编译时生成调试符号信息,可以使用GCC的-g或者-ggdb选项.GCC在产生调试符号时,同样采用了分级的思路,开发人</p>
<p>员可以通过在-g选项后附加数字1、2或3来指定在代码中加入调试信息的多少.默认的级别是2(-g2),此时产生的调试</p>
<p>信息包括扩展的符号表、行号、局部或外部变量信息.级别3(-g3)包含级别2中的所有调试信息,以及源代码中定义的</p>
<p>宏.级别1(-g1)不包含局部变量和与行号有关的调试信息,因此只能够用于回溯跟踪和堆栈转储之用.回溯跟踪指的是</p>
<p>监视程序在运行过程中的函数调用历史,堆栈转储则是一种以原始的十六进制格式保存程序执行环境的方法,两者都</p>
<p>是经常用到的调试手段. </p>
<p>GCC产生的调试符号具有普遍的适应性,可以被许多调试器加以利用,但如果使用的是GDB,那么还可以通过-ggdb选项</p>
<p>在生成的二进制代码中包含GDB专用的调试信息.这种做法的优点是可以方便GDB的调试工作,但缺点是可能导致其它</p>
<p>调试器(如DBX)无法进行正常的调试.选项-ggdb能够接受的调试级别和-g是完全一样的,它们对输出的调试符号有着</p>
<p>相同的影响. </p>
<p>需要注意的是,使用任何一个调试选项都会使最终生成的二进制文件的大小急剧增加,同时增加程序在执行时的开销,</p>
<p>因此调试选项通常仅在软件的开发和调试阶段使用.调试选项对生成代码大小的影响从下面的对比过程中可以看出来</p>
<p>: </p>
<p># gcc optimize.c -o optimize<br /># ls optimize -l<br />-rwxrwxr-x&nbsp; 1 xiaowp&nbsp;&nbsp; xiaowp&nbsp; 11649 Nov 20 08:53 optimize&nbsp; (未加调试选项)<br /># gcc -g optimize.c -o optimize<br /># ls optimize -l<br />-rwxrwxr-x&nbsp; 1 xiaowp&nbsp;&nbsp; xiaowp&nbsp; 15889 Nov 20 08:54 optimize&nbsp; (加入调试选项)<br />&nbsp;</p>
<p><br />虽然调试选项会增加文件的大小,但事实上Linux中的许多软件在测试版本甚至最终发行版本中仍然使用了调试选项</p>
<p>来进行编译,这样做的目的是鼓励用户在发现问题时自己动手解决,是Linux的一个显著特色. </p>
<p>为调试编译代码(Compiling Code for Debugging)<br />为了使 gdb 正常工作, 你必须使你的程序在编译时包含调试信息. 调试信息包含你程序里的每个变量的类型和在可</p>
<p>执行文件里的地址映射以及源代码的行号. gdb 利用这些信息使源代码和机器码相关联. <br />◆在编译时用 -g 选项打开调试选项. <br />&nbsp; </p>
<p>gdb 基本命令<br />&nbsp;&nbsp;&nbsp;&nbsp; gdb 支持很多的命令使你能实现不同的功能. 这些命令从简单的文件装入到允许你检查所调用的堆栈内容的复</p>
<p>杂命令, 表27.1列出了你在用 gdb 调试时会用到的一些命令. 想了解 gdb 的详细使用请参考 gdb 的指南页. <br />&nbsp;&nbsp;表 27.1. 基本 gdb 命令.<br />命&nbsp;&nbsp; 令 描&nbsp; 述 <br />file 装入想要调试的可执行文件. <br />kill 终止正在调试的程序. <br />list 列出产生执行文件的源代码的一部分. <br />next 执行一行源代码但不进入函数内部. <br />step 执行一行源代码而且进入函数内部. <br />run 执行当前被调试的程序 <br />quit 终止 gdb <br />watch 使你能监视一个变量的值而不管它何时被改变. <br />break 在代码里设置断点, 这将使程序执行到这里时被挂起. <br />make 使你能不退出 gdb 就可以重新产生可执行文件. <br />shell 使你能不离开 gdb 就执行 UNIX shell 命令.&nbsp; </p>
<p>gdb 支持很多与 UNIX shell 程序一样的命令编辑特征. 你能象在 bash 或 tcsh里那样按 Tab 键让gdb 帮你补齐</p>
<p>一个唯一的命令, 如果不唯一的话 gdb 会列出所有匹配的命令. 你也能用光标键上下翻动历史命令. </p>
<p><br />下面还是通过一个具体的实例说明如何利用调试符号来分析错误,所用程序见清单4所示. </p>
<p>清单4:crash.c </p>
<p>#include &lt;stdio.h&gt; <br />int main(void)<br />{<br />&nbsp; int input =0;<br />&nbsp; printf(Input an integer:);<br />&nbsp; scanf(%d, input);<br />&nbsp; printf(The integer you input is %d\\n, input);<br />&nbsp; return 0;<br />}<br />&nbsp;</p>
<p><br />编译并运行上述代码,会产生一个严重的段错误(Segmentation fault)如下: </p>
<p># gcc -g crash.c -o crash<br /># ./crash<br />Input an integer:10<br />Segmentation fault<br />&nbsp;</p>
<p><br />为了更快速地发现错误所在,可以使用GDB进行跟踪调试,方法如下: </p>
<p># gdb crash<br />GNU gdb Red Hat Linux (5.3post-0.20021129.18rh)<br />&hellip;&hellip;<br />(gdb)<br />&nbsp;</p>
<p><br />当GDB提示符出现的时候,表明GDB已经做好准备进行调试了,现在可以通过run命令让程序开始在GDB的监控下运行: </p>
<p>(gdb) run<br />Starting program: /home/xiaowp/thesis/gcc/code/crash<br />Input an integer:10</p>
<p>Program received signal SIGSEGV, Segmentation fault.<br />0x4008576b in _IO_vfscanf_internal () from /lib/libc.so.6<br />&nbsp;</p>
<p><br />仔细分析一下GDB给出的输出结果不难看出,程序是由于段错误而导致异常中止的,说明内存操作出了问题,具体发生</p>
<p>问题的地方是在调用_IO_vfscanf_internal ( )的时候.为了得到更加有价值的信息,可以使用GDB提供的回溯跟踪命</p>
<p>令backtrace,执行结果如下: </p>
<p>(gdb) backtrace<br />#0&nbsp; 0x4008576b in _IO_vfscanf_internal () from /lib/libc.so.6<br />#1&nbsp; 0xbffff0c0 in ?? ()<br />#2&nbsp; 0x4008e0ba in scanf () from /lib/libc.so.6<br />#3&nbsp; 0x08048393 in main () at crash.c:11<br />#4&nbsp; 0x40042917 in __libc_start_main () from /lib/libc.so.6<br />&nbsp;</p>
<p><br />跳过输出结果中的前面三行,从输出结果的第四行中不难看出,GDB已经将错误定位到crash.c中的第11行了.现在仔细</p>
<p>检查一下: </p>
<p>(gdb) frame 3<br />#3&nbsp; 0x08048393 in main () at crash.c:11<br />11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf(%d, input);<br />&nbsp;</p>
<p><br />使用GDB提供的frame命令可以定位到发生错误的代码段,该命令后面跟着的数值可以在backtrace命令输出结果中的</p>
<p>行首找到.现在已经发现错误所在了,应该将 </p>
<p>scanf(%d, input);<br />改为<br />scanf(%d, &amp;input);<br />&nbsp;</p>
<p><br />完成后就可以退出GDB了,命令如下: </p>
<p>(gdb) quit<br />&nbsp;</p>
<p><br />GDB的功能远远不止如此,它还可以单步跟踪程序、检查内存变量和设置断点等. </p>
<p>调试时可能会需要用到编译器产生的中间结果,这时可以使用-save-temps选项,让GCC将预处理代码、汇编代码和目</p>
<p>标代码都作为文件保存起来.如果想检查生成的代码是否能够通过手工调整的办法来提高执行性能,在编译过程中生</p>
<p>成的中间文件将会很有帮助,具体情况如下: </p>
<p># gcc -save-temps foo.c -o foo<br /># ls foo*<br />foo&nbsp; foo.c&nbsp; foo.i&nbsp; foo.s<br />&nbsp;</p>
<p><br />GCC支持的其它调试选项还包括-p和-pg,它们会将剖析(Profiling)信息加入到最终生成的二进制代码中.剖析信息对</p>
<p>于找出程序的性能瓶颈很有帮助,是协助Linux程序员开发出高性能程序的有力工具.在编译时加入-p选项会在生成的</p>
<p>代码中加入通用剖析工具(Prof)能够识别的统计信息,而-pg选项则生成只有GNU剖析工具(Gprof)才能识别的统计信</p>
<p>息. </p>
<p>最后提醒一点,虽然GCC允许在优化的同时加入调试符号信息,但优化后的代码对于调试本身而言将是一个很大的挑战</p>
<p>.代码在经过优化之后,在源程序中声明和使用的变量很可能不再使用,控制流也可能会突然跳转到意外的地方,循环</p>
<p>语句有可能因为循环展开而变得到处都有,所有这些对调试来讲都将是一场噩梦.建议在调试的时候最好不使用任何</p>
<p>优化选项,只有当程序在最终发行的时候才考虑对其进行优化.</p>
<p><br />上次的培训园地中介绍了GCC的编译过程、警告提示功能、库依赖、代码优化和程序调试六个方面的内容.这期是最</p>
<p>后的一部分内容. </p>
<p>加速 </p>
<p>在将源代码变成可执行文件的过程中,需要经过许多中间步骤,包含预处理、编译、汇编和连接.这些过程实际上是由</p>
<p>不同的程序负责完成的.大多数情况下GCC可以为Linux程序员完成所有的后台工作,自动调用相应程序进行处理. </p>
<p>这样做有一个很明显的缺点,就是GCC在处理每一个源文件时,最终都需要生成好几个临时文件才能完成相应的工作,</p>
<p>从而无形中导致处理速度变慢.例如,GCC在处理一个源文件时,可能需要一个临时文件来保存预处理的输出、一个临</p>
<p>时文件来保存编译器的输出、一个临时文件来保存汇编器的输出,而读写这些临时文件显然需要耗费一定的时间.当</p>
<p>软件项目变得非常庞大的时候,花费在这上面的代价可能会变得很沉重. </p>
<p>解决的办法是,使用Linux提供的一种更加高效的通信方式&mdash;管道.它可以用来同时连接两个程序,其中一个程序的输</p>
<p>出将被直接作为另一个程序的输入,这样就可以避免使用临时文件,但编译时却需要消耗更多的内存. </p>
<p>在编译过程中使用管道是由GCC的-pipe选项决定的.下面的这条命令就是借助GCC的管道功能来提高编译速度的: </p>
<p># gcc -pipe foo.c -o foo<br />&nbsp;</p>
<p><br />在编译小型工程时使用管道,编译时间上的差异可能还不是很明显,但在源代码非常多的大型工程中,差异将变得非常</p>
<p>明显. </p>
<p><br />文件扩展名 </p>
<p>在使用GCC的过程中,用户对一些常用的扩展名一定要熟悉,并知道其含义.为了方便大家学习使用GCC,在此将这些扩</p>
<p>展名罗列如下: </p>
<p>.c C原始程序； </p>
<p>.C C++原始程序； </p>
<p>.cc C++原始程序； </p>
<p>.cxx C++原始程序； </p>
<p>.m Objective-C原始程序； </p>
<p>.i 已经过预处理的C原始程序； </p>
<p>.ii 已经过预处理之C++原始程序； </p>
<p>.s 组合语言原始程序； </p>
<p>.S 组合语言原始程序； </p>
<p>.h 预处理文件(标头文件)； </p>
<p>.o 目标文件； </p>
<p>.a 存档文件. </p>
<p>GCC常用选项 </p>
<p>GCC作为Linux下C/C++重要的编译环境,功能强大,编译选项繁多.为了方便大家日后编译方便,在此将常用的选项及说</p>
<p>明罗列出来如下: </p>
<p>-c 通知GCC取消链接步骤,即编译源码并在最后生成目标文件； </p>
<p>-Dmacro 定义指定的宏,使它能够通过源码中的#ifdef进行检验； </p>
<p>-E 不经过编译预处理程序的输出而输送至标准输出； </p>
<p>-g3 获得有关调试程序的详细信息,它不能与-o选项联合使用； </p>
<p>-Idirectory 在包含文件搜索路径的起点处添加指定目录； </p>
<p>-llibrary 提示链接程序在创建最终可执行文件时包含指定的库； </p>
<p>-O、-O2、-O3 将优化状态打开,该选项不能与-g选项联合使用； </p>
<p>-S 要求编译程序生成来自源代码的汇编程序输出； </p>
<p>-v 启动所有警报； </p>
<p>-Wall 在发生警报时取消编译操作,即将警报看作是错误； </p>
<p>-Werror 在发生警报时取消编译操作,即把报警当作是错误； </p>
<p>-w 禁止所有的报警. </p>
<p>小结 </p>
<p>GCC是在Linux下开发程序时必须掌握的工具之一.本文对GCC做了一个简要的介绍,主要讲述了如何使用GCC编译程序</p>
<p>、产生警告信息、调试程序和加快GCC的编译速度.对所有希望早日跨入Linux开发者行列的人来说,GCC就是成为一名</p>
<p>优秀的Linux程序员的起跑线.<br /><br /><a href="http://delia.org.ru/ArticleView/2005-9-7/Article_View_131482.Htm">http://delia.org.ru/ArticleView/2005-9-7/Article_View_131482.Htm</a></p><img src ="http://www.blogjava.net/bluesky/aggbug/30466.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bluesky/" target="_blank">bluesky</a> 2006-02-13 16:12 <a href="http://www.blogjava.net/bluesky/archive/2006/02/13/30466.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>