﻿<?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>C++博客-weiyan-随笔分类-技术探索</title><link>http://www.cppblog.com/weiyan/category/2080.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 20 May 2008 13:36:23 GMT</lastBuildDate><pubDate>Tue, 20 May 2008 13:36:23 GMT</pubDate><ttl>60</ttl><item><title>VC++下关于工具条的设计</title><link>http://www.cppblog.com/weiyan/archive/2006/07/06/9502.html</link><dc:creator>will</dc:creator><author>will</author><pubDate>Thu, 06 Jul 2006 11:03:00 GMT</pubDate><guid>http://www.cppblog.com/weiyan/archive/2006/07/06/9502.html</guid><wfw:comment>http://www.cppblog.com/weiyan/comments/9502.html</wfw:comment><comments>http://www.cppblog.com/weiyan/archive/2006/07/06/9502.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/weiyan/comments/commentRss/9502.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weiyan/services/trackbacks/9502.html</trackback:ping><description><![CDATA[在VC++下实现高彩色工具条 <br /><br />　　引言<br /><br />　　一些Windows系统自带程序如资源管理器、Internet Explorer等程序的工具条看上去和其他一些程序的工具条不太一样，在颜色上要漂亮许多。其实这些程序的工具条上的图标均为256色，而普通应用程序 在工具栏上所显示图标的颜色通常只有16色，这就决定了后者在视觉上远没有前者美观。由于Windows随系统而带的程序也是由开发人员编写的应用程序， 这就说明通过程序编码可以实现256色甚至更多色彩的图标在工具栏上的显示。为此笔者经过摸索，通过MFC编程在应用程序中实现了高彩色工具条。现将实现 的主要方法介绍如下，以飨广大读者。<br /><br />　　基本设计思路<br /><br />　　在实现高彩色工具条之前，先研究一下普通16色的工具条的实现过程，并从中总结出改进方法。在VC的资源视图中工具条是一个资源名为 IDR_MAINFRAME的Toolbar型资源，并可通过在编辑按钮上的图标来完成工具条上图标的绘制。虽然在资源视图中工具条上各按钮的图标是相互 独立的，但在存储时并非像图标一样保存为ico格式文件而是以bmp位图格式保存在磁盘上的。该位图是一个由工具条上的按钮图标组成的长条型位图图像，中 间没有任何缝隙，在程序运行和在资源视图对工具条进行编辑时该图像首先装载到一个图像列表中，然后工具栏根据索引依次从图像列表中将图像显示到工具条的各 个按钮上。由于VC限制工具栏上的图标不能超出16色，因此不论是在资源视图直接编辑位图还是用复制粘贴等手段均无法获取超出256色的工具条（注：用复 制粘贴的方法虽然在编辑视图中可以暂时显示出256色的图标，但在程序运行时仍会退化成16色）。<br /><br />　　由于不能在资源视图中通过编辑Toolbar资源实现16色以上的图标，加之工具条在显示时有并不直接从Toolbar获取图标而是从图像列表中读 取，因此可以通过其他一些图像处理软件做好类似于工具条的bmp图像（仅颜色比普通工具条bmp图像丰富，其余完全一样），并以位图的形式加入到程序资 源。在使用时，先将其读取到图像列表，这样图像列表中用于显示到工具条上的图标的颜色就可以是256、24位、甚至32位色的了。由于工具条缺省时将直接 加载资源名为IDR_MAINFRAME的Toolbar型资源作为图标的来源，因此还必须通过SetImageList（）函数将含有高彩色工具条位图 的图像列表指定为工具条的图标来源。<br /><br />　　真彩工具条的实现<br /><br />　　由于工具条的创建是在主框架类的OnCreate（）函数中完成的，因此高彩色图像的装载和图像列表的替换工作必须也在此进行。在进行程序设计之前， 需要做好各种准备工作，比如高彩色工具条位图的绘制、高彩色位图加入到资源等。绘制工具条位图时，必须控制好图像的尺寸，如需要有N个边长为 M的图标，那么需要绘制的位图尺寸为长=N*M；宽=M。真彩位图在加入到工程之后就不能再在VC的资源视图中进行编辑了。由于这个彩色位图仅起到美化界 面的作用，因此具体对的事件响应等工作还要通过设置原有的Toolbar资源来完成。<br /><br />　　准备工作就绪后，先要把工具条位图装载到图像列表，这样才能被工具条做获取。在作这一步时，必须用::LoadImage（）函数去加载工具条位图，并通过宏MAKEINTRESOURCE()来指定具体要加载哪一个资源位图：<br /><br />HBITMAP hbm = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),<br />MAKEINTRESOURCE(IDB_TOOLBAR), //加载IDB_TOOLBAR<br />IMAGE_BITMAP, //按位图格式<br />0,0, // cx,cy<br />LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS );<br /><br />LoadImage返回一个位图句柄HBITMAP，但在MFC下使用CBitmaps会更加方便，可创建一个<br />CBitmap对象并用Attach()成员函数将它与位图句柄联系起来：<br /><br />CBitmap bm;<br />bm.Attach(hbm); <br /><br />　　MFC加载工具栏位图时使用了一个内部函数AfxLoadSysColorBitmap（）将缺省颜色设定为16色，因此为了显示16色以上的图像，必须在调用图像列表类CImageList的Create（）函数创建图像列表时对图像清单做进一步的处理：<br /><br />m_ilToolBar.Create(32,32,ILC_COLOR8, 4, 4);<br />m_ilToolBar.Add(&amp;bm,(CBitmap*)NULL); <br /><br />　　这里用ILC_COLOR8标明了创建的图像列表是256色的，在VC的commctrl.h中对其有定义，并且还提供有其他几种颜色位深度的预定义：<br /><br />#define ILC_COLOR4 0x0004 //16色<br />#define ILC_COLOR8 0x0008 //256色<br />#define ILC_COLOR16 0x0010 //16位色<br />#define ILC_COLOR24 0x0018 //24位色<br />#define ILC_COLOR32 0x0020 //32位色 <br /><br />　　如果使用的工具条位图只有256色（对于多数程序这样已经足够），则显然没有必要再使用更高级别的位深度定义。最后一步，也是最关键的一步，必须通过 SetImageList（）函数指定工具条m_wndToolBar的图标来源不再是原来缺省的图像列表而是含有高彩色位图的图像列表 m_ilToolBar：<br /><br />m_wndToolBar.GetToolBarCtrl().SetImageList(&amp;m_ilToolBar); <br /><br />　　到此为止就可以通过MFC在自己编写的程序中实现类似于IE等软件的漂亮的工具条了。下图就是笔者用上述方法得到的程序界面：<br /><br /><center><img alt="" src="http://www.czvc.com/articles/97.jpg" border="0" /></center><br /><br />　　小结<br /><br />　　本文通过对作为工具条图标来源的图像列表的替换，实现了在普通MFC应用程序中具备了以往只有Windows系统自带程序才具备的高彩色工具条。较好 地美化了程序的界面。本文程序在Windows 98下，由Microsoft Visual C++ 6.0编译通过。<br /><br /><br />用VC制作非常酷的工具条 <br /><br />　　自微软推出Windows 95后,一大批全新的控件使我们的应用程序更加美观,使用也更加方便。其中一个显著的变化就是工具条不再是一个突出的3D小方框,而是变成了平面的状态,但 是只要把鼠标移动到上面,它就会自动地浮出来，大大方便了用户。 <br /><br />　　笔者经过一段时间摸索,终于找到了制作这种工具条的方法。原来Windows 95封装了许多常用的控件,大都被放在Comctrl32.dll中，其中Toolbar控件是用于制作工具条的。下面 简要介绍一下如何在VC5.0中添加一个Toolbar。 <br /><br />　　众所周知,所有的控件都是某一类型的窗口,所以制作Toolbar也要从制作窗口开始。由于MFC的Toolbar类并不支持新的功能,所以我们只好用SDK方法,通过API调用来完成整个过程 ，该过程与制作一个传统的工具条类似。 <br /><br />　　Toolbar是属于comctrl32.dll的扩展功能,所以要先调用InitCommonControlsEx()的函 数。该函数有一个重要的参数决定了对Toolbar的支持,它的主要作用是注册Toolbar窗口,以 便在以后的程序中制作这种窗口,而普通的工具条则要调用InitCommandControls()。需要注意的是这两个函数的写法。 <br /><br />INITCOMMONCONTROLSEX icex; <br />DWORD dwStyle; <br />icex.dwSize = sizeof(INITCOMMONCONTROLSEX); <br /><br />//注意下面这两个参数决定了是否注册Toolbar <br /><br />icex.dwICC=ICC_COOL_CLASSES|ICC_BAR_ CLASSES; <br />InitCommonControlsEx(＆icex); <br /><br /><br /><br />　　然后就可以调用CreateWindowEx这个函数来建立Toolbar窗口: <br /><br />HWND hwndTB = CreateWindowEx( <br />WS_EX_TOOLWINDOW, //扩展工具条风格 <br />TOOLBARCLASSNAME, //Toolbar类名 <br />NULL, <br />WS_CHILD|WS_VISIBLE|TBSTYLE_FLAT， //窗口风格 <br />0,0,0,0, //大小 <br />AfxGetApp()－＞GetMainWnd(), //父窗口名 <br />NULL, <br />AfxGetInstanceHandle(), //实例 <br />NULL); <br /><br /><br /><br />　　判断一下窗口句柄,如果不为空,就表示窗口建立成功。此时的Toolbar不过是一个空空的窗口，我们可以根据需要向里面添加按钮。向Toolbar 中添加按钮是通过向它发送消息来 实现的,以下过程与制作传统的工具条基本一致。首先,建立一个ImageList控件,然后通过定义按钮的数据结构来确定每个按钮的类型。 <br />// 建立一个Imagelist 控件, <br /><br />HWND himl; <br />//MYICON_CX,MYICON_CY是每个按钮的大小 <br />himl= ImageList_Create(MYICON_CX,MYICON_CY,ILC_COLOR4,0,4); <br /><br />//加入事先作好的工具条位图IDB_BITMAP2 <br />ImageList_Add( himl, <br />LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP2)),NULL); <br /><br />//通过消息把位图加入到Toolbar中 <br />SendMessage(hwndTB, TB_SETIMAGELIST, 0, (LPARAM)himl); <br /><br />　　下面加入5个普通的按钮: <br /><br />TBBUTTON tbArray[5]; //按钮的数据结构 <br />for(i=0;i＜5;i＋＋)<br />{ <br />tbArray[i].iBitmap = i; //第i个位图 <br />tbArray[i].idCommand = IDM_BUTTONSTART＋i; <br />//命令ID <br />tbArray[i].fsState = TBSTATE_ENABLED; <br />tbArray[i].fsStyle = TBSTYLE_BUTTON; <br />//按钮风格 <br />tbArray[i].dwData = 0; <br />tbArray[i].iString = i; //显示的字符串 <br />} <br /><br />//设置按钮结构的大小 <br /><br />::SendMessage(hwndTB,TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0); <br />//添加按钮到Toolbar中 <br />::SendMessage(hwndTB,TB_ADDBUTTONS,(UINT)5, (LPARAM)tbArray); <br /><br /><br /><br />　　至此,一个很酷的工具条基本上制作完成,最后再调用函数ShowWindow()即可: ShowWindow(hwndTB, SW_SHOWMAXIMIZED); <br /><br />　　当点击按钮时,Toolbar就把消息传送到父窗口中,由父窗口响应消息。Toolbar中按钮的ID包含在消息函数的wParam参数中,可以设置 它来调度不同的模块。这时可以重载父窗口的O nCommand()函数,根据wParam参数判断点击了哪个按钮。假定父窗口是主窗口框架,代码如下: <br /><br />BOOL CMainFrame::OnCommand(WPARAM wParam,LPARAM lParam) <br />{ <br />switch(wParam)<br />{ <br />case IDM_BUTTONSTART＋0: <br />AfxMessageBox(“你点中了第一个按钮!!", MB_ICONINFORMATION); <br />break; <br />case IDM_BUTTONSTART＋1: <br />AfxMessageBox(“你点中了第二个按钮!!",MB_ICONINFORMATION); <br />break; <br />case IDM_BUTTONSTART＋2: <br />AfxMessageBox(“你点中了第三个按钮!!", MB_ICONINFORMATION); <br />break; <br />} <br />return CMainFrame::OnCommand(wParam,lParam); <br />} <br /><br />Visual C++ 版本6中工具条的新特色 <br /><br />Dave Schmi<br /><br /><br />　　微软在www.microsoft.com/visualc已经推出Visual C++6.0预览版几个月了。正式版预计到今年年底发布。同时，预览版显示出版本6将包含大量的改进和提高，包括支持Internet控件,例如扁平工具 条等。虽然改进的控件包与Internet无关，但它首先出现在Internet Explorer中，因此它就被取做这个名字了。事实上，官方发布的预览版的标题是“针对Internet Explorer 4.0的Visual C++ 5.0技术预览”。<br /><br />　　在以前关于MFC工具条类的讨论专题中，我曾答应提供一个在版本6中工具条的外观演示。有一个很好的消息，那就是你现在用CToolBar所作的所有 工作在新的版本中都是有效的，包括那些在以前的栏目中所描述的一些扩展功能。因此，你将很容易修改现存的程序以获得象Internet Explorer和Visual Studio中那样“酷”的界面。此外，并没有什么坏消息。<br /><br />工具条的新特色<br /><br />　　早在版本4中，CToolBar就已被MFC库完全实现了。一旦公用控件动态链接库（命名为comctl32.dll）变得无所不在了， CToolBar就成了如今已包含在操作系统中的工具条控件的代名词了。然而，CToolBar并没有揭示公用工具条控件的所有能力。如今，通过 CreateEx()函数，它成功了。<br /><br />　　公用控件动态链接库现在包含了至少三类风格：最初的、在Internet Explorer3.0中加入的以及在Internet Explorer 4.0中加入的。虽然这些版本理论上是向下兼容的，但某些专业人员曾写出一些不能在后来版本中正常运行的应用程序，这可能是这些程序采用了一些没有公开的 功能，而这些功能并没有被包含在所有的版本中。 <br /><br />　　Visual C++程序员没有这样的经历，因为在Visual C++4.0或5.0中comctl32.dll并不是一个可以再分发的组件，它在安装Internet Explorer时被更新，因此MFC程序员无法依靠最新版本的某些功能来用于他们的程序。这就是CToolBar仅仅具有最初的DLL的有限功能的原 因。CToolBar能够实现最新的特色意味着微软将在Visual C++6.0中包含最新的DLL并将其作为一个可以再分发的组件。<br /><br />　　绝大多数新特色将由在调用CreateEx()和其它CToolBar成员函数时指定的新的风格标志来确定。下面是commctrl.h的一部分，它定义了TBSTYLE类标识符：<br /><br /><br />#define TBSTYLE_BUTTON 0x0000<br />#define TBSTYLE_SEP 0x0001<br />#define TBSTYLE_CHECK 0x0002<br />#define TBSTYLE_GROUP 0x0004<br />#define TBSTYLE_CHECKGROU TBSTYLE_GROUP | TBSTYLE_CHECK)<br />#if (_WIN32_IE $#@62;= 0x0300)<br />　　#define TBSTYLE_DROPDOWN 0x0008<br />#endif<br />#if (_WIN32_IE $#@62;= 0x0400)<br />　　#define TBSTYLE_AUTOSIZE 0x0010<br />　　#define TBSTYLE_NOPREFIX 0x0020 <br />#endif<br /><br />#define TBSTYLE_TOOLTIPS 0x0100<br />#define TBSTYLE_WRAPABLE 0x0200<br />#define TBSTYLE_ALTDRAG 0x0400<br />#if (_WIN32_IE $#@62;= 0x0300)<br />　　#define TBSTYLE_FLAT 0x0800<br />　　#define TBSTYLE_LIST 0x1000<br />　　#define TBSTYLE_CUSTOMERASE 0x2000<br />#endif<br />#if (_WIN32_IE $#@62;= 0x0400)<br />　　#define TBSTYLE_REGISTERDROP 0x4000<br />　　#define TBSTYLE_TRANSPARENT 0x8000<br />　　#define TBSTYLE_EX_DRAWDDARROWS 0x00000001<br />#endif<br /><br /><br /><br />　　你会注意到其中的一些采用了条件编译，依赖于_WIN32_IE的值，它缺省指的是Internet Explorer 4.0（即取值为0x0400）。对于Internet Explorer 3.0（即取值为0x0300）以前的版本，大多数的TBSTYLE标识符指的是按钮或是一组按钮。Internet Explorer3.0引入了扁平钮、文本标签、下拉列表和自定义绘制。Internet Explorer 4.0增强了下拉列表和自定义绘制功能，并且增加了支持OLE拖动目标到一个工具条。<br /><br />扁平钮和把手<br /><br />　　在过去的18个月中我常常被问及该如何获得象Internet Explorer和Visual Studio中的工具条一样不使用浮雕按钮而是用扁平钮并且带有便于移动和定位的把手那样酷的界面。这些特色并不被MFC所支持，因此最简单获取的方法就 是购买一个扩展库。而对于Visual C++ 6.0来说却无须多此一举，因为它使得CToolBar类实现了对扁平钮、把手和其它新的视觉效果的支持。<br /><br />　　在预览版中，AppWizard并不会自动包括这些新特色，但它们却很容易被加入。表1显示了AppWizard创建的主框架窗口的OnCreate ()函数，表2显示了需要做哪些修改以获得具有扁平钮和把手的工具条。图1显示了表1创建出的工具条，而图2显示出了表2实现的工具条。 <br /><br /><br />表 1: CMainFrame::OnCreate as generated by AppWizard<br />int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)<br />{<br />if(CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)<br />　　return -1;<br /><br />if(!m_wndToolBar.Create(this)||!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))<br />　　{<br />　　　TRACE0("Failed to create toolbar\n");<br />　　　return -1; // fail to create<br />　　}<br /><br />if(!m_wndStatusBar.Create(this) ||<br />　　!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators))) <br />　　图1 <br />表2: Adding flat buttons and the gripper<br />int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)<br />{<br />if(CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)<br />　　return -1;<br /><br />if(!m_wndToolBar.CreateEx(this)||!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))<br />　　{<br />　　　TRACE0("Failed to create toolbar\n");<br />　　　return -1; // fail to create<br />　　}<br /><br />if(!m_wndStatusBar.Create(this)||!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT)))<br />{<br />TRACE0("Failed to create status bar\n");<br />return -1; // fail to create<br />}<br /><br />// TODO: Remove this if you dont want tool tips or a resizeable toolbar<br />m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |<br />CBRS_GRIPPER | CBRS_BORDER_3D | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);<br /><br />// TODO: Delete these three lines if you dont want the toolbar to<br />// be dockable<br />m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);<br />EnableDocking(CBRS_ALIGN_ANY);<br />DockControlBar(&amp;m_wndToolBar);<br /><br />return 0;<br />} <br />图2 <br /><br />　　为了作出扁平按钮我必须使用CreateEx()来代替Create()。这个新的函数在afxext.h中声明：<br /><br />BOOL CreateEx<br />(<br />CWnd* pParentWnd, // parent window<br />DWORD dwCtrlStyle = TBSTYLE_FLAT, // extended style<br />DWORD dwStyle = // style<br />WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP,<br />CRect rcBorders = CRect(0,0,0,0), // border rectangle<br />UINT nID = AFX_IDW_TOOLBAR // identifier<br />); <br /><br /><br />　　因为扩展风格缺省指的就是TBSTYLE_FLAT，因此我要得到扁平按钮就只需要简单地将AppWizard形成的代码中的Create()改为 CreateEx()即可。我将在后面实现其它的扩展风格。为了获得把手，我必须在调用SetBarStyle()函数时包含CBRS_GRIPPER标 志，参看表2。这是CControlBar类的一个新风格，而CToolBar类是从它继承而来的。请注意到我也加入了CBRS_BORDER_3D标 志，这是为了修正一个未知的绘制问题，该问题将会在工具条的边缘绘制一些多余的点。这也许意味着预览版确实有这个问题，因为一旦我将3D标志加入就立即解 决了并且也似乎没有影响到别的什么。<br /><br />　　上面所作的两个简单的改变是使得一个已存程序获得酷界面的最省力的方法。在一个程序具有了扁平钮和把手的同时，它也不会发生不应有的其它改变。<br /><img src ="http://www.cppblog.com/weiyan/aggbug/9502.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weiyan/" target="_blank">will</a> 2006-07-06 19:03 <a href="http://www.cppblog.com/weiyan/archive/2006/07/06/9502.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> C/C+语言struct深层探索</title><link>http://www.cppblog.com/weiyan/archive/2006/07/06/9500.html</link><dc:creator>will</dc:creator><author>will</author><pubDate>Thu, 06 Jul 2006 10:42:00 GMT</pubDate><guid>http://www.cppblog.com/weiyan/archive/2006/07/06/9500.html</guid><wfw:comment>http://www.cppblog.com/weiyan/comments/9500.html</wfw:comment><comments>http://www.cppblog.com/weiyan/archive/2006/07/06/9500.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/weiyan/comments/commentRss/9500.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weiyan/services/trackbacks/9500.html</trackback:ping><description><![CDATA[
		<p>
				<font size="2">C/C+语言struct深层探索</font>
		</p>
		<p>
				<font size="2">出处：PConline</font>
		</p>
		<p>
				<font size="2">1. struct的巨大作用<br />　　面对一个人的大型C/C++程序时，只看其对struct的使用情况我们就可以对其编写者的编程经验进行评估。因为一个大型的C/C++程序，势必要涉及一些(甚至大量)进行数据组合的结构体，这些结构体可以将原本意义属于一个整体的数据组合在一起。从某种程度上来说，会不会用struct，怎样用struct是区别一个开发人员是否具备丰富开发经历的标志。</font>
		</p>
		<p>
				<font size="2">　　在网络协议、通信控制、嵌入式系统的C/C++编程中，我们经常要传送的不是简单的字节流（char型数组），而是多种数据组合起来的一个整体，其表现形式是一个结构体。</font>
		</p>
		<p>
				<font size="2">　　经验不足的开发人员往往将所有需要传送的内容依顺序保存在char型数组中，通过指针偏移的方法传送网络报文等信息。这样做编程复杂，易出错，而且一旦控制方式及通信协议有所变化，程序就要进行非常细致的修改。</font>
		</p>
		<p>
				<font size="2">　　一个有经验的开发者则灵活运用结构体，举一个例子，假设网络或控制协议中需要传送三种报文，其格式分别为packetA、packetB、packetC：</font>
		</p>
		<p>
				<font size="2">struct structA <br />{<br />int a;<br />char b;<br />};</font>
		</p>
		<p>
				<font size="2">struct structB <br />{<br />char a;<br />short b;<br />};</font>
		</p>
		<p>
				<font size="2">struct structC<br />{<br />int a;<br />char b;<br />float c;<br />}<br />　　优秀的程序设计者这样设计传送的报文：</font>
		</p>
		<p>
				<font size="2">struct CommuPacket<br />{<br />int iPacketType;　　//报文类型标志<br />union　　　　　　//每次传送的是三种报文中的一种，使用union<br />{<br />  struct structA packetA;<br />  struct structB packetB;<br />  struct structC packetC;<br />}<br />};<br />　　在进行报文传送时，直接传送struct CommuPacket一个整体。</font>
		</p>
		<p>
				<font size="2">　　假设发送函数的原形如下：</font>
		</p>
		<p>
				<font size="2">// pSendData：发送字节流的首地址，iLen：要发送的长度<br />Send(char * pSendData, unsigned int  iLen);<br />发送方可以直接进行如下调用发送struct CommuPacket的一个实例sendCommuPacket：<br />Send( (char *)&amp;sendCommuPacket , sizeof(CommuPacket) );<br />假设接收函数的原形如下：<br />// pRecvData：发送字节流的首地址，iLen：要接收的长度<br />//返回值：实际接收到的字节数<br />unsigned int Recv(char * pRecvData, unsigned int  iLen)；<br />　　接收方可以直接进行如下调用将接收到的数据保存在struct CommuPacket的一个实例recvCommuPacket中：</font>
		</p>
		<p>
				<font size="2">Recv( (char *)&amp;recvCommuPacket , sizeof(CommuPacket) );<br />　　接着判断报文类型进行相应处理：</font>
		</p>
		<p>
				<font size="2">switch(recvCommuPacket. iPacketType)<br />{<br />    case PACKET_A:<br />    …    //A类报文处理<br />    break;<br />    case PACKET_B:<br />    …　  //B类报文处理<br />    break;<br />    case PACKET_C:<br />    …   //C类报文处理<br />    break;<br />}<br />　　以上程序中最值得注意的是</font>
		</p>
		<p>
				<font size="2">Send( (char *)&amp;sendCommuPacket , sizeof(CommuPacket) );<br />Recv( (char *)&amp;recvCommuPacket , sizeof(CommuPacket) );<br />　　中的强制类型转换：(char *)&amp;sendCommuPacket、(char *)&amp;recvCommuPacket，先取地址，再转化为char型指针，这样就可以直接利用处理字节流的函数。</font>
		</p>
		<p>
				<font size="2">　　利用这种强制类型转化，我们还可以方便程序的编写，例如要对sendCommuPacket所处内存初始化为0，可以这样调用标准库函数memset()：</font>
		</p>
		<p>
				<font size="2">memset((char *)&amp;sendCommuPacket,0, sizeof(CommuPacket));</font>
		</p>
		<p>
				<font size="2">2. struct的成员对齐<br />　　Intel、微软等公司曾经出过一道类似的面试题：<br />1. #include &lt;iostream.h&gt;<br />2. #pragma pack(8)<br />3. struct example1<br />4. {<br />5. short a;<br />6. long b;<br />7. };<br />8. struct example2<br />9. {<br />10. char c;<br />11. example1 struct1;<br />12. short e;    <br />13. };<br />14. #pragma pack()<br />15. int main(int argc, char* argv[])<br />16. {<br />17. example2 struct2;<br />18. cout &lt;&lt; sizeof(example1) &lt;&lt; endl;<br />19. cout &lt;&lt; sizeof(example2) &lt;&lt; endl;<br />20. cout &lt;&lt; (unsigned int)(&amp;struct2.struct1) - (unsigned int)(&amp;struct2) &lt;&lt; endl;<br />21. return 0;<br />22. }<br />　　问程序的输入结果是什么？<br />　　答案是：<br />8<br />16<br />4<br />　　不明白？还是不明白？下面一一道来：<br />2.1 自然对界<br />　　struct是一种复合数据类型，其构成元素既可以是基本数据类型（如int、long、float等）的变量，也可以是一些复合数据类型（如array、struct、union等）的数据单元。对于结构体，编译器会自动进行成员变量的对齐，以提高运算效率。缺省情况下，编译器为结构体的每个成员按其自然对界（natural alignment）条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储，第一个成员的地址和整个结构的地址相同。<br />　　自然对界(natural alignment)即默认对齐方式，是指按结构体的成员中size最大的成员对齐。<br />　　例如：<br />struct naturalalign<br />{<br />char a;<br />short b;<br />char c;<br />};<br />　　在上述结构体中，size最大的是short，其长度为2字节，因而结构体中的char成员a、c都以2为单位对齐，sizeof(naturalalign)的结果等于6；<br />　　如果改为：<br />struct naturalalign<br />{<br />char a;<br />int b;<br />char c;<br />};<br />　　其结果显然为12。</font>
		</p>
		<p>
				<font size="2">2.2指定对界<br />　　一般地，可以通过下面的方法来改变缺省的对界条件：<br />　　· 使用伪指令#pragma pack (n)，编译器将按照n个字节对齐；<br />　　· 使用伪指令#pragma pack ()，取消自定义字节对齐方式。<br />　　注意：如果#pragma pack (n)中指定的n大于结构体中最大成员的size，则其不起作用，结构体仍然按照size最大的成员进行对界。<br />　　例如：<br />#pragma pack (n)<br />struct naturalalign<br />{<br />char a;<br />int b;<br />char c;<br />};<br />#pragma pack ()<br />　　当n为4、8、16时，其对齐方式均一样，sizeof(naturalalign)的结果都等于12。而当n为2时，其发挥了作用，使得sizeof(naturalalign)的结果为8。<br />　　在VC++ 6.0编译器中，我们可以指定其对界方式，其操作方式为依次选择projetct &gt; setting &gt; C/C++菜单，在struct member alignment中指定你要的对界方式。<br />　　另外，通过__attribute((aligned (n)))也可以让所作用的结构体成员对齐在n字节边界上，但是它较少被使用，因而不作详细讲解。</font>
		</p>
		<p>
				<font size="2">2.3 面试题的解答<br />　　至此，我们可以对Intel、微软的面试题进行全面的解答。<br />　　程序中第2行#pragma pack (8)虽然指定了对界为8，但是由于struct example1中的成员最大size为4（long变量size为4），故struct example1仍然按4字节对界，struct example1的size为8，即第18行的输出结果；<br />　　struct example2中包含了struct example1，其本身包含的简单数据成员的最大size为2（short变量e），但是因为其包含了struct example1，而struct example1中的最大成员size为4，struct example2也应以4对界，#pragma pack (8)中指定的对界对struct example2也不起作用，故19行的输出结果为16；<br />　　由于struct example2中的成员以4为单位对界，故其char变量c后应补充3个空，其后才是成员struct1的内存空间，20行的输出结果为4。<br /></font>
		</p>
<img src ="http://www.cppblog.com/weiyan/aggbug/9500.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weiyan/" target="_blank">will</a> 2006-07-06 18:42 <a href="http://www.cppblog.com/weiyan/archive/2006/07/06/9500.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库中存取BMP图像</title><link>http://www.cppblog.com/weiyan/archive/2006/07/06/9482.html</link><dc:creator>will</dc:creator><author>will</author><pubDate>Thu, 06 Jul 2006 03:56:00 GMT</pubDate><guid>http://www.cppblog.com/weiyan/archive/2006/07/06/9482.html</guid><wfw:comment>http://www.cppblog.com/weiyan/comments/9482.html</wfw:comment><comments>http://www.cppblog.com/weiyan/archive/2006/07/06/9482.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/weiyan/comments/commentRss/9482.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weiyan/services/trackbacks/9482.html</trackback:ping><description><![CDATA[
		<p>二进制大对象BLOB(Binary Large Object)<br />其存取的方式与普通数据有所区别。本文将介绍利用ADO在数据库中存取BLOB数据的具体实现过程，并给出实现图像存取显示的完整示例工程。 </p>
		<p>二、前期准备 </p>
		<p>首先我们建立一张名为userinfo的表，包含三个字段:id,username,old,photo,其中photo是一个可以存储二进制数据的字段。 </p>
		<p>2.1 在SQL SERVER中我们可以在Query Analyzer中直接输入如下语句创建： </p>
		<p>CREATE TABLE [dbo].[userphoto] ( <br />[id] [int] IDENTITY (1, 1) NOT NULL , <br />[username] [varchar] (50) NULL , <br />[old] [int] NULL , <br />[photo] [image] NULL <br />) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] <br />其中photo我们定义为image类型的字段。 </p>
		<p>2.2 在ACCESS中创建的方法如下： </p>
		<p>建立一张新表包括id,username,old,photo四个字段，然后打开表，选视图菜单中设计视图，将id设置为自动编号的递增长整型，username为文本，old为数字，photo为OLE对象。 <br />在我们的示例工程中已经包含了一个建立好的ACCESS2000的库，你可以直接拿来使用。 </p>
		<p>三、具体步骤 </p>
		<p>3.1 BLOB数据的保存 </p>
		<p>BLOB类型的数据无法用普通的方式进行存储，我们需要使用AppendChunk函数，AppendChunk包含在Field对象中，原型如下： <br />HRESULT AppendChunk (const _variant_t &amp; Data ); <br />从函数原型中可以看到关键的问题是我们需把二进制数据赋值给VARIANT类型的变量，下面我们给出具体的代码并作简单的分析: </p>
		<p>///假设m_pBMPBuffer指针指向一块长度为m_nFileLen的二进制数据,并且已经成功打开了记录集对象m_pRecordset/// </p>
		<p>char *pBuf = m_pBMPBuffer ; <br />VARIANT varBLOB; <br />SAFEARRAY *psa; <br />SAFEARRAYBOUND rgsabound[1]; </p>
		<p>m_pRecordset-&gt;AddNew(); ///添加新记录 <br />m_pRecordset-&gt;PutCollect("username",_variant_t("小李")); ///为新记录填充username字段 <br />m_pRecordset-&gt;PutCollect("old",_variant_t((long)28); ///填充old字段 </p>
		<p>if(pBuf){ <br />rgsabound[0].lLbound = 0; <br />rgsabound[0].cElements = m_nFileLen; <br />psa = SafeArrayCreate(VT_UI1, 1, rgsabound); ///创建SAFEARRAY对象 </p>
		<p>for (long i = 0; i &lt; (long)m_nFileLen; i++) <br />SafeArrayPutElement (psa, &amp;i, pBuf++); ///将pBuf指向的二进制数据保存到SAFEARRAY对象psa中 </p>
		<p>varBLOB.vt = VT_ARRAY | VT_UI1;///将varBLOB的类型设置为BYTE类型的数组 </p>
		<p>varBLOB.parray = psa; ///为varBLOB变量赋值 </p>
		<p>m_pRecordset-&gt;GetFields()-&gt;GetItem("photo")-&gt;AppendChunk(varBLOB); ///加入BLOB类型的数据 <br />} </p>
		<p>m_pRecordset-&gt;Update(); ///保存我们的数据到库中 </p>
		<p>至此我们的数据已经成功地保存到了数据库中,接下来我们所要做的工作便是将该数据提取出来,让我们继续吧! </p>
		<p>3.2 BLOB数据的读取 </p>
		<p>对应于保存数据时我们所使用的AppendChunk函数，读取数据应该使用GetChunk函数,GetChunk的原型如下: <br />_variant_t GetChunk (long Length ); <br />给出数据的长度后GetChunk将返回包含数据的VARIANT类型变量,然后我们可以利用SafeArrayAccessData函数得到VARIANT变量中指向数据的char *类型的指针,以方便我们的处理，具体代码如下： </p>
		<p>long lDataSize = m_pRecordset-&gt;GetFields()-&gt;GetItem("photo")-&gt;ActualSize; <br />///得到数据的长度 </p>
		<p>if(lDataSize &gt; 0) <br />{ <br />_variant_t varBLOB; </p>
		<p>varBLOB = m_pRecordset-&gt;GetFields()-&gt;GetItem("photo")-&gt;GetChunk(lDataSize); </p>
		<p>if(varBLOB.vt == (VT_ARRAY | VT_UI1)) ///判断数据类型是否正确 <br />{ <br />　　 char *pBuf = NULL; <br />　　 SafeArrayAccessData(varBLOB.parray,(void **)&amp;pBuf); <br />　　 ///得到指向数据的指针 /*****在这里我们可以对pBuf中的数据进行处理*****/ <br />　　 SafeArrayUnaccessData (varBLOB.parray); <br />　　 } </p>
		<p>} </p>
		<p>以上我们成功实现了BLOB数据在数据库中的存取，为了让大家有现成的例子可以参考，本文提供了示例工程，在示例工程中我们在数据库中保存图像数据，并可以对这些图像进行浏览、修改，该例子还涉及到如何用char *指向的BMP文件数据创建BITMAP对象然后显示出来。<br /></p>
<img src ="http://www.cppblog.com/weiyan/aggbug/9482.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weiyan/" target="_blank">will</a> 2006-07-06 11:56 <a href="http://www.cppblog.com/weiyan/archive/2006/07/06/9482.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SAFEARRAY使用方法示例</title><link>http://www.cppblog.com/weiyan/archive/2006/07/05/9452.html</link><dc:creator>will</dc:creator><author>will</author><pubDate>Wed, 05 Jul 2006 12:09:00 GMT</pubDate><guid>http://www.cppblog.com/weiyan/archive/2006/07/05/9452.html</guid><wfw:comment>http://www.cppblog.com/weiyan/comments/9452.html</wfw:comment><comments>http://www.cppblog.com/weiyan/archive/2006/07/05/9452.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/weiyan/comments/commentRss/9452.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weiyan/services/trackbacks/9452.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: Wingdings; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">l<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">创建</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: blue; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
						<?XML:NAMESPACE PREFIX = O /?>
						<o:p>
						</o:p>
				</span>
		</p>
		<table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt" cellspacing="0" cellpadding="0" border="1">
				<tbody>
						<tr>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
												<font face="Times New Roman">
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
																<span style="mso-tab-count: 3">                            </span>
														</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: blue; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">long</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
														</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">i</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt"> = 0;<o:p></o:p></span>
												</font>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
												<font face="Times New Roman">
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
																<span style="mso-tab-count: 3">                            </span>
														</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: blue; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">VARIANT</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
														</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">va</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt"> = {0};<o:p></o:p></span>
												</font>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
												<font face="Times New Roman">
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
																<span style="mso-tab-count: 3">                            </span>
														</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">va</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">.</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">vt</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt"> = </span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #a000a0; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">VT_BSTR</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">;<o:p></o:p></span>
												</font>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
												<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
														<font face="Times New Roman">
																<span style="mso-tab-count: 3">                            </span>
																<o:p>
																</o:p>
														</font>
												</span>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
												<font face="Times New Roman">
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
																<span style="mso-tab-count: 3">                            </span>
														</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: blue; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">SAFEARRAYBOUND</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
														</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">bounds</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">[1] = {0};<o:p></o:p></span>
												</font>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
												<font face="Times New Roman">
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
																<span style="mso-tab-count: 3">                            </span>
														</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">bounds</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">[0].</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">cElements</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt"> = 5;<o:p></o:p></span>
												</font>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font face="Times New Roman">
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
																<span style="mso-tab-count: 3">                            </span>
														</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: blue; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">SAFEARRAY</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">* </span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">psa</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt"> = </span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #880000; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">SafeArrayCreate</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">(</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #a000a0; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">VT_VARIANT</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">, 1, </span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">bounds</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">);</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: blue; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
																<o:p>
																</o:p>
														</span>
												</font>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: blue; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
						<font face="Times New Roman"> <o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: Wingdings; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">l<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">存入元素</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: blue; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt" cellspacing="0" cellpadding="0" border="1">
				<tbody>
						<tr>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
												<font face="Times New Roman">
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
																<span style="mso-tab-count: 3">                            </span>
														</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: blue; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">for</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">(</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">i</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt"> = 0; </span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">i</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt"> &lt; 5; </span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">i</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">++)<o:p></o:p></span>
												</font>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
												<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
														<font face="Times New Roman">
																<span style="mso-tab-count: 3">                            </span>{<o:p></o:p></font>
												</span>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
												<font face="Times New Roman">
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
																<span style="mso-tab-count: 4">                                     </span>
														</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">va</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">.</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">bstrVal</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt"> = </span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #880000; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">SysAllocString</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">(L</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #000077; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">"test"</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">);<o:p></o:p></span>
												</font>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
												<font face="Times New Roman">
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
																<span style="mso-tab-count: 4">                                     </span>
														</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #880000; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">SafeArrayPutElement</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">(</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">psa</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">, &amp;</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">i</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">, &amp;</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">va</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">);<o:p></o:p></span>
												</font>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font face="Times New Roman">
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
																<span style="mso-tab-count: 3">                            </span>}</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: blue; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
																<o:p>
																</o:p>
														</span>
												</font>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: blue; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
						<font face="Times New Roman"> <o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: Wingdings; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">l<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">获取元素</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: blue; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt" cellspacing="0" cellpadding="0" border="1">
				<tbody>
						<tr>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
												<font face="Times New Roman">
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
																<span style="mso-tab-count: 3">                            </span>
														</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: blue; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">for</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">(</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">i</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt"> = 0; </span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">i</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt"> &lt; 5; </span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">i</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">++)<o:p></o:p></span>
												</font>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
												<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
														<font face="Times New Roman">
																<span style="mso-tab-count: 3">                            </span>{<o:p></o:p></font>
												</span>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
												<font face="Times New Roman">
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
																<span style="mso-tab-count: 4">                                     </span>
														</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">va</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">.</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">bstrVal</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt"> = </span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #880000; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">SysAllocString</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">(L</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #000077; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">"test"</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">);<o:p></o:p></span>
												</font>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
												<font face="Times New Roman">
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
																<span style="mso-tab-count: 4">                                     </span>
														</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #880000; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">SafeArrayGetElement</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">(</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">psa</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">, &amp;</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">i</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">, &amp;</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">va</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">);<o:p></o:p></span>
												</font>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
												<font face="Times New Roman">
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
																<span style="mso-tab-count: 4">                                     </span>
														</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #880000; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">SysFreeString</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">(</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">va</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">.</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">bstrVal</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">);<o:p></o:p></span>
												</font>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font face="Times New Roman">
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
																<span style="mso-tab-count: 3">                            </span>}</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: blue; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
																<o:p>
																</o:p>
														</span>
												</font>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: blue; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
						<font face="Times New Roman"> <o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: Wingdings; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">l<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">销毁</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: blue; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt" cellspacing="0" cellpadding="0" border="1">
				<tbody>
						<tr>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font face="Times New Roman">
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
																<span style="mso-tab-count: 3">                            </span>
														</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #880000; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">SafeArrayDestroy</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">(</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">psa</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">);</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: blue; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
																<o:p>
																</o:p>
														</span>
												</font>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: blue; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
						<font face="Times New Roman"> <o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Wingdings; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">l<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">生成</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
						<font face="Times New Roman">VARIANT</font>
				</span>
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">变量</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt" cellspacing="0" cellpadding="0" border="1">
				<tbody>
						<tr>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" valign="top" width="568">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
												<font face="Times New Roman">
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
																<span style="mso-tab-count: 3">                            </span>
														</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: blue; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">VARIANT</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
														</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">vsa</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt"> = {0};<o:p></o:p></span>
												</font>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
												<font face="Times New Roman">
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
																<span style="mso-tab-count: 3">                            </span>
														</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">vsa</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">.</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">vt</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt"> = </span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #a000a0; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">VT_ARRAY</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt"> | </span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #a000a0; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">VT_BSTR</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">;<o:p></o:p></span>
												</font>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font face="Times New Roman">
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">
																<span style="mso-tab-count: 3">                            </span>
														</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">vsa</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">.</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">parray</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt"> = </span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: gray; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">psa</span>
														<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt">;</span>
												</font>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cppblog.com/weiyan/aggbug/9452.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weiyan/" target="_blank">will</a> 2006-07-05 20:09 <a href="http://www.cppblog.com/weiyan/archive/2006/07/05/9452.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>野指针</title><link>http://www.cppblog.com/weiyan/archive/2006/07/05/9409.html</link><dc:creator>will</dc:creator><author>will</author><pubDate>Tue, 04 Jul 2006 16:32:00 GMT</pubDate><guid>http://www.cppblog.com/weiyan/archive/2006/07/05/9409.html</guid><wfw:comment>http://www.cppblog.com/weiyan/comments/9409.html</wfw:comment><comments>http://www.cppblog.com/weiyan/archive/2006/07/05/9409.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/weiyan/comments/commentRss/9409.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weiyan/services/trackbacks/9409.html</trackback:ping><description><![CDATA[         野指针，也就是指向不可用内存区域的指针。通常对这种指针进行操作的话，将会使程序发生不可预知的错误。但是，我在文中要说的，就是野指针的“安全”使用方法以及其内部的原因.<br /><br /><p>首先请诸位看以下一段“危险”的C++代码：</p><p></p><table class="codetable" cellspacing="1" border="0"><tbody><tr><td><code><font color="blue">void</font> function( <font color="blue">void</font> )<br />{<br />    <font color="blue">char</font>* str = <font color="blue">new</font> <font color="blue">char</font>[100];<br />    <font color="blue">delete</font>[] str;<br />    <font color="green">// Do something</font><br />    strcpy( str, "Dangerous!!" );<br />}</code></td></tr></tbody></table><p>之所以说其危险，是因为这是一段完全合乎语法的代码，编译的时候完美得一点错误也不会有，然而当运行到strcpy一句的时候，问题就会出现，因为在这之前，str的空间已经被delete掉了，所以strcpy当然不会成功。对于这种类似的情况，在林锐博士的书中有过介绍，称其为“野指针”。</p><p>那么，诸位有没有见过安全的“野指针”呢？下面请看我的一段C++程序，灵感来自CSDN上的一次讨论。在此，我只需要C++的“类”，C++的其余一概不需要，因此我没有使用任何的C++标准库，连输出都是用printf完成的。</p><p></p><table class="codetable" cellspacing="1" border="0"><tbody><tr><td><code><font color="blue">#include</font> &lt;stdio.h&gt;<br /><br /><font color="blue">class</font> CTestClass<br />{<br /><font color="blue">public</font>:<br />    CTestClass( <font color="blue">void</font> );<br />    <font color="blue">int</font> m_nInteger;<br />    <font color="blue">void</font> Function( <font color="blue">void</font> );<br />};<br /><br />CTestClass::CTestClass( <font color="blue">void</font> )<br />{<br />    m_nInteger = 0;<br />}<br /><br /><font color="blue">void</font> CTestClass::Function( <font color="blue">void</font> )<br />{<br />    printf( "This is a test function.\n" );<br />}<br /><br /><font color="blue">void</font> main( <font color="blue">void</font> )<br />{<br />    CTestClass* p = <font color="blue">new</font> CTestClass;<br />    <font color="blue">delete</font> p;<br />    p-&gt;Function();<br />}</code></td></tr></tbody></table><p>OK，程序到此为止，诸位可以编译运行一下看看结果如何。你也许会惊异地发现：没有任何的出错信息，屏幕上竟然乖乖地出现了这么一行字符串：</p><p>This is a test function.</p><p>奇怪吗？不要急，还有更奇怪的呢，你可以把主函数中加上一句更不可理喻的：</p><p></p><table class="codetable" cellspacing="1" border="0"><tbody><tr><td><code>((CTestClass*)NULL)-&gt;Function();</code></td></tr></tbody></table><p>这仍然没有问题！！</p><p>我这还有呢，哈哈。现在你在主函数中这么写，倘说上一句不可理喻，那么以下可以叫做无法无天了：</p><p></p><table class="codetable" cellspacing="1" border="0"><tbody><tr><td><code><font color="blue">int</font> i = 888;<br />CTestClass* p2 = (CTestClass*)&amp;i;<br />p2-&gt;Function();</code></td></tr></tbody></table><p>你看到了什么？是的，“This is a test function.”如约而至，没有任何的错误。</p><p>你也许要问为什么，但是在我解答你之前，请你在主函数中加入如下代码：</p><p></p><table class="codetable" cellspacing="1" border="0"><tbody><tr><td><code>printf( "%d, %d", <font color="blue">sizeof</font>( CTestClass ), <font color="blue">sizeof</font>( <font color="blue">int</font> ) );</code></td></tr></tbody></table><p>这时你就会看到真相了：输出结果是——得到的两个十进制数相等。对，由sizeof得到的CTestClass的大小其实就是它的成员m_nInteger的大小。亦即是说，对于CTestClass的一个实例化的对象（设为a）而言，只有a.m_nInteger是属于a这个对象的，而a.Function()却是属于CTestClass这个类的。所以以上看似危险的操作其实都是可行且无误的。</p><p>现在你明白为什么我的“野指针”是安全的了，那么以下我所列出的，就是在什么情况下，我的“野指针”不安全：</p><ol><li>在成员函数Function中对成员变量m_nInteger进行操作； 
</li><li>将成员函数Function声明为虚函数（virtual）。 </li></ol><p>以上的两种情况，目的就是强迫野指针使用属于自己的东西导致不安全，比如第一种情况中操作本身的m_nInteger，第二种情况中变为虚函数的Function成为了属于对象的函数（这一点可以从sizeof看出来）。</p><p>其实，安全的野指针在实际的程序设计中是几乎毫无用处的。我写这一篇文章，意图并不是像孔乙己一样去琢磨回字有几种写法，而是想通过这个小例子向诸位写明白C++的对象实例化本质，希望大家不但要明白what和how，更要明白why。李马二零零三年二月二十日作于自宅。</p><p><br /><b>关于成员函数CTestClass::Function的补充说明</b><br /><br /></p><p>这个函数是一个普通的成员函数，它在编译器的处理下，会成为类似如下的代码：</p><p></p><table class="codetable" cellspacing="1" border="0"><tbody><tr><td><code><font color="blue">void</font> Function( <font color="blue">const</font> CTestClass * <font color="blue">this</font> ) <font color="green">// ①</font><br />{<br />    printf("This is a test function.\n");<br />}</code></td></tr></tbody></table><p>那么p-&gt;Function();一句将被编译器解释为：</p><p></p><table class="codetable" cellspacing="1" border="0"><tbody><tr><td><code>Function( p ); </code></td></tr></tbody></table><p>这就是说，普通的成员函数必须经由一个对象来调用（经由this指针激活②）。那么由上例的delete之后，p指针将会指向一个无效的地址，然而p本身是一个有效的变量，因此编译能够通过。并且在编译通过之后，由于CTestClass::Function的函数体内并未对这个传入的this指针进行任何的操作，所以在这里，“野指针”便成了一个看似安全的东西。</p><p>然而若这样改写CTestClass::Function：</p><p></p><table class="codetable" cellspacing="1" border="0"><tbody><tr><td><code><font color="blue">void</font> CTestClass::Function( <font color="blue">void</font> )<br />{<br />    m_nInteger = 0;<br />}</code></td></tr></tbody></table><p>那么它将会被编译器解释为：</p><p></p><table class="codetable" cellspacing="1" border="0"><tbody><tr><td><code><font color="blue">void</font> Function( <font color="blue">const</font> CTestClass * <font color="blue">this</font> )<br />{<br />    <font color="blue">this</font>-&gt;m_nInteger = 0;<br />}</code></td></tr></tbody></table><p>你看到了，在p-&gt;Function();的时候，系统将会尝试在传入的这个无效地址中寻找m_nInteger成员并将其赋值为0，剩下的我不用说了——非法操作出现了。</p><p>至于virtual虚函数，如果在类定义之中将CTestClass声明为虚函数：</p><p></p><table class="codetable" cellspacing="1" border="0"><tbody><tr><td><code><font color="blue">class</font> CTestClass<br />{<br /><font color="blue">public</font>:<br />    <font color="green">// ...</font><br />    <font color="blue">virtual</font> <font color="blue">void</font> Function( <font color="blue">void</font> );<br />};</code></td></tr></tbody></table><p>那么C++在构建CTestClass类的对象模型时，将会为之分配一个虚函数表vptr（可以从sizeof看出来）。vptr是一个指针，它指向一个函数指针的数组，数组中的成员即是在CTestClass中声明的所有虚函数。在调用虚函数的时候，必须经由这个vptr，这也就是为什么虚函数较之普通成员函数要消耗一些成本的缘故。以本例而言，p-&gt;Function();一句将被编译器解释为：</p><p></p><table class="codetable" cellspacing="1" border="0"><tbody><tr><td><code>(*p-&gt;vptr[1])( p ); <font color="green">// 调用vptr表中索引号为1的函数（即Function）③</font></code></td></tr></tbody></table><p>上面的代码已经说明了，如果p指向一个无效的地址，那么必然会有非法操作。</p><p>备注：</p><p>①关于函数的命名，我采用了原名而没有变化。事实上编译器为了避免函数重载造成的重名情况，会对函数的名字进行处理，使之成为独一无二的名称。<br />②将成员函数声明为static，可以使成员函数不经由this指针便可调用。<br />③vptr表中，索引号0为类的type_info。</p><br /><br /><img src ="http://www.cppblog.com/weiyan/aggbug/9409.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weiyan/" target="_blank">will</a> 2006-07-05 00:32 <a href="http://www.cppblog.com/weiyan/archive/2006/07/05/9409.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VISUAL C++软件开发中几个常用功能</title><link>http://www.cppblog.com/weiyan/archive/2006/07/05/9408.html</link><dc:creator>will</dc:creator><author>will</author><pubDate>Tue, 04 Jul 2006 16:26:00 GMT</pubDate><guid>http://www.cppblog.com/weiyan/archive/2006/07/05/9408.html</guid><wfw:comment>http://www.cppblog.com/weiyan/comments/9408.html</wfw:comment><comments>http://www.cppblog.com/weiyan/archive/2006/07/05/9408.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/weiyan/comments/commentRss/9408.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weiyan/services/trackbacks/9408.html</trackback:ping><description><![CDATA[         在进行软件开发过程中间，有很多小功能的实现，虽然这些东西你可以不用，但是如果应用仂将会是你的程序更具有专业性。  <br />一、设置程序自动运行。  <br />       很多监控软件要求软件能够在系统重新启动后不用用户去点击图标启动项目，而是直接能够启动运行，方法是写注册表Software\\Microsoft\\Windows\\CurrentVersion\\Run。参考程序可以见下：(查找程序目录的执行文件，存在则进行添加注册表操作)  <br />         HKEY RegKey;  <br />         CString sPath;  <br />         GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);  <br />         sPath.ReleaseBuffer();  <br />         int nPos;  <br />    nPos=sPath.ReverseFind(’\\’);  <br />    sPath=sPath.Left(nPos);  <br />    CString lpszFile=sPath+"<a href="file://****.exe%22;//"><font color="#000080">\\****.exe";//</font></a>这里加上你要查找的执行文件名称  <br />    CFileFind fFind;  <br />    BOOL bSuccess;  <br />    bSuccess=fFind.FindFile(lpszFile);  <br />    fFind.Close();  <br />    if(bSuccess)  <br />    {  <br />        CString fullName;  <br />        fullName=lpszFile;  <br />        RegKey=NULL;  <br />        RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&amp;RegKey);  <br />        RegSetValueEx(RegKey,"*****",0,REG_SZ,(const unsigned char*)(LPCTSTR)fullName,fullName.GetLength());//这里加上你需要在注册表中注册的内容  <br />        this-&gt;UpdateData(FALSE);  <br />    }  <br />    else  <br />    {  <br />        theApp.SetMainSkin();  <br />        ::AfxMessageBox("没找到执行程序，自动运行失败");  <br />        exit(0);  <br />    }  
<p>二、自动配置数据源  <br />    很多的程序都要用到数据库结合的操作，这里举例ACCESS，因为ACCESS在中小型VC系统开发中是最常用到的，如果程序的移植，如果对于很初级的用户来说，你还需要他到配置面板中进行数据源配置的话，那就有点说不过去了。  <br />         #include &lt;odbcinst.h&gt;  <br />         //配置数据源，数据库在应用程序目录下,这里比如数据库文件名为***.mdb，程序运行时候可以将数据库文件拷贝到程序目录下面。  <br />    CString sPath;  <br />    GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);  <br />    sPath.ReleaseBuffer();  <br />    int nPos;  <br />    nPos=sPath.ReverseFind(’\\’);  <br />    sPath=sPath.Left(nPos);  <br />    CString lpszFileName = sPath + "<a href="file://***.mdb%22;//"><font color="#000080">\\***.mdb";//</font></a>这里修改成你的数据库文件名称  <br />    CFileFind  fFind;  <br />    if(!fFind.FindFile(lpszFileName))  <br />    {  <br />        ::AfxMessageBox("没有找到数据库");  <br />        exit(0);  <br />    }   <br />    CString szDesc;  <br />    szDesc.Format( "DSN=****;Description=****;DESCRIPTION=The DataBase For ***;FIL=MicrosoftAccess;DEFAULTDIR=%s;DBQ=%s;" ,sPath,lpszFileName);//这里***号可以添加成你的描述  </p><p>    //添加数据源  <br />    if(!::SQLConfigDataSource(NULL,ODBC_ADD_DSN, "Microsoft Access Driver (*.mdb)",(LPCSTR)szDesc))  <br />    {  <br />        ::AfxMessageBox("32位ODBC数据源配置错误!");  <br />        exit(0);  <br />    }  </p><p>三、设置显示模式：  <br />    很多的程序的移植的运行环境是改变的。有可能你的原来开发环境是1024X768，但是到了那些显示器大于17的时候（分辨率超过你的开发时的分辨率时），程序的显示可能就不好看了。  <br />         DEVMODE lpDevMode;  <br />    lpDevMode.dmPelsHeight=768;//Y方向象素点  <br />    lpDevMode.dmPelsWidth=1024;//X方向象素点  <br />    lpDevMode.dmDisplayFrequency=85;//屏幕刷新率  <br />    lpDevMode.dmFields=DM_PELSWIDTH|DM_PELSHEIGHT|DM_DISPLAYFREQUENCY;  <br />    ChangeDisplaySettings(&amp;lpDevMode,0);  </p><p>四、在你的程序中间加载其他应用程序：  <br />    你的程序除了调用到各个模块进行协同工作外（DLL），还有可能调用不是同一个开发环境下的应用程序，比如VC环境下调用DELPHI，VB开发的执行程序，你就可以用到下面的方法（将调用的应用程序拷贝程序目录中）：  <br />         CString sPath;  <br />    GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);  <br />    sPath.ReleaseBuffer();  <br />    int nPos;  <br />    nPos=sPath.ReverseFind(’\\’);  <br />    sPath=sPath.Left(nPos);  <br />    CString lpszFileName = sPath + "<a href="file://***.exe%22;//"><font color="#000080">\\***.exe";//</font></a>这里修改成你的调用应用程序的文件名称  <br />    CFileFind  fFind;  <br />    if(!fFind.FindFile(lpszFileName))  <br />    {  <br />        ::AfxMessageBox("没有找到调用的应用程序！");   <br />        return FALSE;  <br />    }  <br />    else  <br />        ShellExecute(NULL,NULL,_T("***.exe"),NULL,sPath,NULL);   </p><p>五、结束进程：  <br />    在你的程序中结束别的程序进程，采用的方法是进行进程列举，然后采用查找的方法进行：  <br />         #include "TLHELP32.H"  <br />         DWORD ProcessID[50];  <br />    CString kkk[50];  <br />    HANDLE SnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);   <br />    PROCESSENTRY32* info=new PROCESSENTRY32;  <br />    PROCESSENTRY32 ProcessInfo;//声明进程信息变量  <br />    ProcessInfo.dwSize=sizeof(ProcessInfo);//设置ProcessInfo的大小  <br />    //返回系统中第一个进程的信息  <br />    BOOL Status=Process32First(SnapShot,&amp;ProcessInfo);  <br />    int m_nProcess=0;   <br />    while(Status)  <br />    {  <br />        CString s,str1,str2;  <br />        s.Format("%d",ProcessInfo.cntThreads);  <br />        str1.Format("%s",ProcessInfo.szExeFile);  <br />        str1=ProcessInfo.szExeFile;  <br />        kkk[m_nProcess]=ProcessInfo.szExeFile;   <br />        ProcessID[m_nProcess]=ProcessInfo.th32ProcessID;   <br />        if(str1=="***.exe")//***.exe就是你要结束的进程的名称  <br />        {  <br />            HANDLE ProcessHandle;  <br />            ProcessHandle=OpenProcess (PROCESS_ALL_ACCESS,FALSE,ProcessID[m_nProcess]);  <br />            TerminateProcess(ProcessHandle,0);      <br />        }  <br />        Status=Process32Next(SnapShot,&amp;ProcessInfo);  <br />        m_nProcess++;  <br />    }  <br /></p><img src ="http://www.cppblog.com/weiyan/aggbug/9408.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weiyan/" target="_blank">will</a> 2006-07-05 00:26 <a href="http://www.cppblog.com/weiyan/archive/2006/07/05/9408.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在VC中添加响应自定义的消息的代码步骤</title><link>http://www.cppblog.com/weiyan/archive/2006/07/02/9288.html</link><dc:creator>will</dc:creator><author>will</author><pubDate>Sun, 02 Jul 2006 10:00:00 GMT</pubDate><guid>http://www.cppblog.com/weiyan/archive/2006/07/02/9288.html</guid><wfw:comment>http://www.cppblog.com/weiyan/comments/9288.html</wfw:comment><comments>http://www.cppblog.com/weiyan/archive/2006/07/02/9288.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/weiyan/comments/commentRss/9288.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weiyan/services/trackbacks/9288.html</trackback:ping><description><![CDATA[
		<p>1. 首先定义一个消息代码</p>
		<p>#define <strong>WM_DEBUG</strong>     WM_USER + 1999</p>
		<p>
		</p>
		<p>2. 在窗口头文件中添加</p>
		<p>class CStreamServerDlg : public CDialog<br />{<br /> // Generated message map functions<br /> //{{AFX_MSG(CStreamServerDlg)<br />...<br /> //}}AFX_MSG<br /><font color="#ff0000"> afx_msg void OnDebug(WPARAM wParam, LPARAM lParam); <br /></font>...<br />}</p>
		<p>3. 在窗口的cpp文件中添加</p>
		<p>
				<br />BEGIN_MESSAGE_MAP(CStreamServerDlg, CDialog)<br />...<br /><strong> </strong><font color="#ff0000">ON_MESSAGE(WM_DEBUG, OnDebug)<br /></font>END_MESSAGE_MAP()</p>
		<p>
				<font color="#ff0000">
						<font color="#000000">LRESULT </font> CStreamServerDlg::OnDebug(WPARAM wParam, LPARAM lParam)<br />{<br />}</font>
		</p>
		<p>4. 其他地方就可以发送消息</p>
		<p>
				<font color="#ff0000">pWnd-&gt;PostMessage(WM_DEBUG,  (WPARAM)p, 0) )<br /><br /><br />说明：<br /><br /><font color="#000000">#define ON_MESSAGE(message, memberFxn) <br />{ message, 0, 0, 0, AfxSig_lwl, <br />(AFX_PMSG)(AFX_PMSGW)(LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM))&amp;memberFxn }, </font><br /><br /></font>
		</p>
<img src ="http://www.cppblog.com/weiyan/aggbug/9288.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weiyan/" target="_blank">will</a> 2006-07-02 18:00 <a href="http://www.cppblog.com/weiyan/archive/2006/07/02/9288.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>