??xml version="1.0" encoding="utf-8" standalone="yes"?>少妇久久久久久被弄到高潮 ,国产精品久久久久久久app,婷婷久久综合九色综合绿巨人http://m.shnenglu.com/xpzhou/category/4064.html要是生命真的有如果,׃?x)有q么多的遗憾Q要是等一分钟可以如愿Q就不会(x)有这么多的伤?..zh-cnThu, 22 May 2008 12:05:50 GMTThu, 22 May 2008 12:05:50 GMT60HOWTO: Create Debug Symbols for a Visual C++ Applicationhttp://m.shnenglu.com/xpzhou/archive/2007/06/11/26109.html榕树(wi)?/dc:creator>榕树(wi)?/author>Mon, 11 Jun 2007 14:54:00 GMThttp://m.shnenglu.com/xpzhou/archive/2007/06/11/26109.htmlhttp://m.shnenglu.com/xpzhou/comments/26109.htmlhttp://m.shnenglu.com/xpzhou/archive/2007/06/11/26109.html#Feedback0http://m.shnenglu.com/xpzhou/comments/commentRss/26109.htmlhttp://m.shnenglu.com/xpzhou/services/trackbacks/26109.html 1. ?#8220;解决Ҏ(gu)资源理?#8221;中,叛_要修改的目Q然后单?strong>属?/strong>?/td> 2. ?#8220;配置属?#8221;H口中,单击C/C++ 文g夹,然后单击常规?/td> 3. ?strong>调试信息格式下拉列表中,单击选择E序数据?(/Zi)?/td> 4. 如果(zhn)希望在调试转储文g或执行实时调试时获得有关局部变量的信息Q请单击选择优化下拉列表中的用 (/Od)?/td> 5. ?#8220;配置属?#8221;H口?Linker 文g夹中Q确?#8220;调试”子类别的生成调试信息属性设|ؓ(f)?(/DEBUG)?strong>备注Q尽ƈ不要求?zhn)在同一子类别中同样启用生成映射文gQ但该选项?x)创Z?.map 文gQ当(zhn)只有发生访问冲H的地址Ӟ该文件对定发生故障的位|可能很有用。有x多信息,请参?#8220;参?#8221;部分? ?Visual C++ 6.0 开发环境中为应用程序创建符hӞ(x)
1. ?strong>目菜单上,选择?/td>
2. ?strong>C/C++ 选项卡上Q将cd更改?strong>常规?/td>
3. ?strong>调试信息下拉列表中,选择E序数据?/strong>?strong>备注Q如果?zhn)希望在调试{储文件或执行实时调试时获得有兛_部变量的信息Q还应该选择优化下拉列表中的用Q调试)(j)?br>
4. ?strong>链接选项卡上Q将cd更改?strong>调试?/td>
5. ?strong>调试信息部分Q确保选中调试信息 选项Q然后选择两种格式?strong>备注Q尽不要求(zhn)在链接选项卡上同样启用常规cd中的生成映射文gQ但该选项?x)创Z?.map 文gQ当(zhn)只有发生访问冲H的地址Ӟ该文件对定发生故障的位|可能很有用。(有关更多信息Q请参见“参?#8221;。)(j)


]]>
VC++6.0~译环境介绍http://m.shnenglu.com/xpzhou/archive/2007/06/08/25807.html榕树(wi)?/dc:creator>榕树(wi)?/author>Fri, 08 Jun 2007 02:00:00 GMThttp://m.shnenglu.com/xpzhou/archive/2007/06/08/25807.htmlhttp://m.shnenglu.com/xpzhou/comments/25807.htmlhttp://m.shnenglu.com/xpzhou/archive/2007/06/08/25807.html#Feedback0http://m.shnenglu.com/xpzhou/comments/commentRss/25807.htmlhttp://m.shnenglu.com/xpzhou/services/trackbacks/25807.html

大家可能一直在?/font>VC开发YӞ但是对于q个~译器却未必很了(jin)解。原因是多方面的。大多数情况下,我们只停留在“使用”它,而不?x)想?#8220;?jin)?#8221;它。因为它只是一个工P我们宁可把更多的_֊攑֜C++语言和Y件设计上。我们习(fn)惯于q样一U?#8220;模式”Q徏立一个项目,然后写代码,然后~译Q反反复复调试。但是,所谓:(x)“公欲善其事,必先利其?#8221;。如果我们精?/span>VC开发环境,我们是不是能够做得更加游刃有余呢Q?/span>


Visual C++可新建的 Projects目

Visual C++可新建的 File文g

 

Visual C++的Build讄
1.Compile TEST.cpp选项 只编译当前文件而不调用链接器或其它工具。输出窗口将昄~译q程(g)查出的错误或警告信息Q在错误信息处单击鼠标右键,可以得到错误代码的位|?br>2. Build TEST.exe 选项 Ҏ(gu)后修改过的源文gq行~译和链?br>3. Rebuild All选项 该选项允许用户~译所有的源文Ӟ而不它们何时曾l被修改q?br>4. Batch Build选项 该选项能单步重新徏立多个工E文Ӟq允许用h定要建立的项目类?VC提供?jin)两U目标应用程序类?Win32 ReleaseQ发行版Q、Win32 DebugQ调试版Q?/font>


 

我们先来看一?/font>VC的处理流E,大致分ؓ(f)两步Q编译和q接。源文g通过~译生成?/span>.obj文gQ所?/span>.obj文g?/span>.lib文g通过q接生成.exe文g?/span>.dll文g。下面,我们分别讨论q两个步骤的一些细节?/font>

 

工程配置对话?/strong> 在这个对话框中,左上方的下拉列表框用于选择一U工E配|,包括有Win32 Debug、Win32 Release和All ConfigurationsQ指前两U配|一P(j)Q某些选项在不同的工程配置中有不同的缺省倹{左边的?wi)Ş视图l出?jin)当前工E所有的文g?qing)分cLc(din)如果我们把工程“Schedule”|ؓ(f)高亮昄Q正如图9-1那样Q,对话框的双׃(x)出现d十个选项卡,其中列出?jin)与工程有关的各U选项Q不选项卡中有一个Reset按钮Q按下它后可以把选项卡内的各设|恢复到生成工程时的初始倹{如果我们在?wi)Ş视图中选择一个文件类或一个文Ӟ那么对话框右边的选项卡会(x)自动减少C个或两个Q其中列出的都是与选中的文件类或文件有关的选项?/font>

 ~译参数的设|?/span>。主要通过VC的菜单项Project->Settings->C/C++|完成。我们可以看到这一늚最下面Project Options中的内容Q一般如下:(x)

/nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /Fp"Debug/WritingDlgTest.pch" /Yu"stdafx.h" /Fo"Debug/" /Fd"Debug/" /FD /GZ /c

各个参数代表的意义,可以参?/font>Project Option语法解释。比?/span>/nologo表示~译时不在输出窗口显C些设|(我们可以把这个参数去掉来看看效果Q等{。一般我们不?x)直接修改这些设|,而是通过q一|上面?/span>Category中的各项来完成?/font>

1)GeneralQ一些M讄?/span>Warning level用来控制警告信息Q?/span>None表示不显CZQ何警告,L1表示只显CZ重的警告QL2表示昄比L1ơ严重的警告QL4则表C显C出所有的警告Q包括那些安全忽略的警告Q?/span>Warnings as errors警告信息当作错误处?/span>Q这样在~译完毕后就无法启动q接器来q行q接Q?/span>Optimizations是代码优化,可以?/span>Category?/span>Optimizations中q行更细的设|;Generate browse info用以生成.sbr文gQ记录类、变量等W号信息Q可以在Category?/span>Listing Files中q行更多的设|?/span>Debug infoQ生成调试信息:(x)NoneQ不产生M调试信息Q编译比较快Q;Line Numbers OnlyQ仅生成全局的和外部W号的调试信息到.OBJ文g?/span>.EXE文gQ减目标文件的寸Q?/span>C 7.0- CompatibleQ记录调试器用到的所有符号信息到.OBJ文g?/span>.EXE文gQ?/span>Program DatabaseQ创?/span>.PDB文g记录所有调试信息;Program Database for "Edit & Continue"Q创?/span>.PDB文g记录所有调试信息,q且支持调试时编辑?/font>

 

2)C++ LanguageQ?/span>pointer_to_member representation用来讄cd?/span>/引用的先后关p,一般ؓ(f)Best-Case Always表示在引用类之前该类肯定已经定义?jin)?/span>Enable Exception HandlingQ进行同步的异常处理Q?/span>Enable Run-Time Type Informationqɾ~译器增加代码在q行时进行对象类型检查;Disable Construction DisplacementsQ设|类构?/span>/析构函数调用虚函数问题?/font>

 

  

3)Code GenerationQ?/span>Processor表示代码指o(h)优化Q可以ؓ(f)80386?/span>80486?/span>Pentium?/span>Pentium ProQ或?/span>Blend表示混合以上各种优化?/span>Use run-time library用以指定E序q行时用的q行时库Q单U程或多U程Q?/span>Debug版本?/span>Release版本Q,有一个原则就是,一个进E不要同时用几个版本的q行时库?/span>Single-ThreadedQ静(rn)态连?/span>LIBC.LIB库;Debug Single-ThreadedQ静(rn)态连?/span>LIBCD.LIB库;MultithreadedQ静(rn)态连?/span>LIBCMT.LIB库;Debug MultithreadedQ静(rn)态连?/span>LIBCMTD.LIB库;Multithreaded DLLQ动态连?/span>MSVCRT.DLL库;Debug Multithreaded DLLQ动态连?/span>MSVCRTD.DLL库。连接了(jin)单线E库׃支持多线E调用,q接?jin)多U程库就要求创徏多线E的应用E序?/span>Calling convention可以用来讑֮调用U定Q有三种Q?/span>__cdecl?/span>__fastcall?/span>__stdcall。各U调用约定的主要区别在于Q函数调用时Q函数的参数是从左到叛_入堆栈还是从叛_左压入堆栈;在函数返回时Q由函数的调用者来清理压入堆栈的参数还是由函数本n来清理;以及(qing)在编译时对函数名q行的命名修饎ͼ可以通过Listing Files看到各种命名修饰方式Q?/span>Struct member alignment用以指定数据l构中的成员变量在内存中是按几字节对齐的Q根据计机数据ȝ的位敎ͼ不同的对齐方式存取数据的速度不一栗这个参数对数据包网l传输等应用ؓ(f)重要Q不是存取速度问题Q而是数据位的_定义问题Q一般在E序中?/span>#pragma pack来指定?/font>

 

4)CustomizeQ?/span>Disable Language ExtensionsQ表CZ使用微Y为标?/span>C做的语言扩展Q?/span>Eliminate Duplicate StringsQ主要用于字W串优化Q将字符串放到缓充池里以节省I间Q,使用q个参数Q?/font>

char *sBuffer = "This is a character buffer";

char *tBuffer = "This is a character buffer";

sBuffer?/span>tBuffer指向的是同一块内存空_(d)Enable Function-Level Linking Q告诉编译器各个函数按打包格式~译Q?/span>Enables minimal rebuildQ通过保存兌信息?/span>.IDB文gQɾ~译器只Ҏ(gu)新类定义改动q的源文件进行重~译Q提高编译速度Q?/span>Enable Incremental CompilationQ同样通过.IDB文g保存的信息,只重~译最新改动过的函敎ͼSuppress Startup Banner and Information MessagesQ用以控制参数是否在outputH口输出?/font>

 

5) Listing FilesQ?/span>Generate browse info的功能上面已l提到过。这里可以进行更多的讄?/span>Exclude Local Variables from Browse Info表示是否局部变量的信息攑ֈ.SBR文g中?/span>Listing file type可以讄生成的列表信息文件的内容Q?/span>Assembly-Only Listing仅生成汇~代码文Ӟ.ASM扩展名)(j)Q?/span>Assembly With Machine Code生成机器代码和汇~代码文Ӟ.COD扩展名)(j)Q?/span>Assembly With Source Code生成源代码和汇编代码文gQ?/span>.ASM扩展名)(j)Q?/span>Assembly, Machine Code, and Source生成机器码、源代码和汇~代码文Ӟ.COD扩展名)(j)?/span>Listing file name为生成的信息文g的\径,一般ؓ(f)Debug?/span>Release目录下,生成的文件名自动取源文g的文件名?/font>

 

 

6)OptimizationsQ?/span>代码优化讄。可以选择Maximize Speed生成最快速的代码Q或Minimize Size生成最尺寸的E序Q或?/span>Customize定制优化。定制的内容包括Q?/font>

Assume No AliasingQ不使用别名Q提高速度Q;

Assume Aliasing Across Function CallsQ仅函数内部不用别名;

Global OptimizationsQ全局优化Q比如经常用到的变量使用寄存器保存,或者@环内的计优化,?/font>

i = -100;

while( i < 0 ){    i += x + y;}

?x)被优化?/font>

i = -100;

t = x + y;

while( i < 0 ){i += t;}

Generate Intrinsic FunctionsQ用内部函数替换一些函数调用(提高速度Q;

Improve Float ConsistencyQQ点运方面的优化Q?/font>

Favor Small CodeQ程序(exe?/span>dllQ尺怼化优先于代码速度优化Q?/font>

Favor Fast CodeQ程序(exe?/span>dllQ代码速度优化优先于尺怼化;

Frame-Pointer OmissionQ不使用帧指针,以提高函数调用速度Q?/font>

Full OptimizationQ组合了(jin)几种参数Q以生成最快的E序代码?/font>

Inline function expansionQ内联函数扩展的三种优化Q用内联可以节省函数调用的开销Q加快程序速度Q:(x)Disable不用内联;Only __inlineQ仅函数定义前有inline?/span>__inline标记使用内联Q?/span>Any SuitableQ除?/span>inline?/span>__inline标记的函数外Q编译器“觉得”应该使用内联的函敎ͼ都用内联?/font>

 

7)Precompiled HeadersQ预~译头文件的讄?/font>

 预编译头的概念:(x) 所谓的预编译头是把一个工E中的那一部分代码,预先~译好放在一个文仉(通常是以.pch为扩展名?Q这个文件就UCؓ(f)预编译头文gq些预先~译好的代码可以是Q何的C/C++代码--------甚至是inline的函敎ͼ但是必须是稳定的Q在工程开发的q程中不?x)被l常改变。如果这些代码被修改Q则需要重新编译生成预~译头文件?/font>你可将一些公q、不大变动的头文Ӟ比如FILEX.h{)(j)集中攑ֈstdafx.h中,q一部分代码׃必每ơ都重新~译Q除非是Rebuild AllQ?/font>注意生成预编译头文g是很耗时间的。同时你得注意预~译头文仉常很大Q通常?-7M大?span lang=ZH-CN>使用预编译可以提高重复编译的速度?/span>

  也许你会(x)问:(x)现在的编译器都有Time stamp的功能,~译器在~译整个工程的时候,它只?x)编译那些经q修改的文gQ而不?x)去~译那些从上ơ编译过Q到现在没有被修改过的文件。那么ؓ(f)什么还要预~译头文件呢Q答案在q里Q我们知道编译器是以文g为单位编译的Q一个文件经q修改后Q会(x)重新~译整个文gQ当然在q个文g里包含的所有头文g中的东西Q?eg Macro, Preprocessor Q都要重新处理一遍。VC的预~译头文件保存的正是q部分信息。以避免每次都要重新处理q些头文件?/font>

1.q里是用工E里的设|,/Yu”stdafx.h”。如果用了(jin)/YuQ就是说使用?jin)预~译Q我们在每个.cpp文g的最开_(d)我强调一遍是最开_(d)包含 你指定生pch文g?h文gQ默认是stdafx.hQ不然就?x)有问题。如果你没有包含q个文gQ就告诉你Unexpected file end. 如果你不是在最开头包含的

2.如果你把pch文g不小?j)丢了(jin),最单的办法是选中W一个选项“Not using....",q样根本不用预~译头也不去Lpch文gQ就不会(x)出错?jin),但是q样做的后果是每ơ编译、连接都化更多的旉。也可以选第二个选项”Automatic use of",然后?#8220;Through header”力填上stdafx.hQ这样如果没有pch文gpȝ?x)自动生成一个pchQ如果有的话׃用这个pchQ这个选项是比?#8220;”的。第三个选项是强行创Z个pch文gQ第四个选项是直接用pch文g。当?#8220;Through headers”里都填stdafx.h?jin)?/font>

让编译器生成一个pch文g可以了(jin)。也是说把 stdafx.cppQ即指定/Yc的那个cpp文gQ从新编译一遍就可以?jin)。当然你可以d?Rebuild all?/font>

 

8) PreprocessorQ预~译处理?/span>我们可以在这里预先定义一些宏名,指定部分或所有符号具有未定义状?span lang=ZH-CN>?/span>Additional include directoriesQ可以指定额外的包含目录Q一般是相对于本目的目录,?/span>..\Include?/font>

 

Linkq接参数的设|?/strong>。主要通过VC的菜单项Project->Settings->Link|完成。我们可以看到这一늚最下面Project Options中的内容Q一般如下:(x)

/nologo /subsystem:windows /incremental:yes /pdb:"Debug/WritingDlgTest.pdb" /debug /machine:I386 /out:"Debug/WritingDlgTest.exe" /pdbtype:sept

下面我们分别来看一?/font>Category中的各项讄?/font>

 

1GeneralQ一些M讄。可以设|生成的文g路径、文件名 ?/span>?#8220;Output   file   name:”下面的编辑框中可输入Q?#8220;C:\bin\TEST.exe”Q连接的库文ӞGenerate debug infoQ生?/span>Debug信息?/span>.PDB文gQ具体格式可以在Category->Debug中设|)(j)Q?/span>Ignore All Default LibrariesQ放弃所有默认的库连接;Link IncrementallyQ通过生成. ILK文g实现递增式连接以提高后箋q接速度Q但一般这U方式下生成的文ӞEXE?/span>DLLQ较大;Generate MapfileQ生?/span>.MAP文g记录模块相关信息Q?/span>Enable ProfilingQ这个参数通常?/span>Generate Mapfile参数同时使用Q而且如果产生Debug信息的话Q不能用.PDB文gQ而且必须?/span>Microsoft Format?/span>  

2CustomizeQ这里可以进行用程序数据库文g的设|?/span>选中Use program database允许使用E序数据库,q样q接器会(x)把调试信息放在程序数据库中,如果不选中该选项Q那么也不能使用递增q接方式。Force File Output Q?/span>即某个模块引用?jin)一些未定义或者重复定义的W号Q连接器仍然?span lang=ZH-CN>强制Q但不一定能正确q行Q?span lang=ZH-CN>产生输出文gQ?/span>EXE?/span>DLLQ;Print Progress MessagesQ可以将q接q程中的q度信息输出?/span>OutputH口?/font>

  

3. DebugQ?/span>讄是否生成调试信息Q以?qing)调试信息的格式。格式可以有Microsoft Format?/span>COFF FormatQ?/span>Common Object File FormatQ和Both FormatsQ两U都?span lang=ZH-CN>Q三U选择Q?/span>Separate TypesQ表C将Debug格式信息以独立的.PDB文g存放Q还是直接放在各个源文g?/span>.PDB文g中。选中的话Q表C采用后者的方式Q这U方式调试启动比较快?/font>

4InputQ?/span>q里可以指定要连接的库文Ӟ攑ּq接的库文g。还可以增加额外的库文g目录Q一般是相对于本目的目录,?/span>..\Lib?/span>Force Symbol ReferencesQ可以指定连接特定符号定义的库?/span> ??#8220;Object/library   Modules:”下面的编辑框中输入:(x)“TestDll.lib”Q在“Additional   library   path:”下面的编辑框中输入:(x)“C:\bin”。可用Workspace另一个工E编译的?rn)态库
 

5.OutputQ?/span>Base Address可以改变E序默认的基地址Q?/span>EXE文g默认?/span>0x400000Q?/span>DLL默认?/span>0x10000000Q,操作pȝ装蝲一个程序时L试着先从q个基地址开始?/span>Entry-Point Symbol可以指定E序的入口地址Q一般ؓ(f)一个函数名Q且必须采用__stdcall调用U定Q。一?/span>Win32的程序,EXE的入口ؓ(f)WinMainQ?/span>DLL的入口ؓ(f)DllEntryPointQ最好让q接器自动设|程序的入口炏V默认情况下Q通过一?/span>C的运行时库函数来实现Q控制台E序采用mainCRTStartup (?/span>wmainCRTStartup)去调用程序的main (?/span>wmain)函数Q?/span>WindowsE序采用WinMainCRTStartup (?/span> wWinMainCRTStartup)调用E序?/span>WinMain (?/span> wWinMainQ必采?/span>__stdcall调用U定)Q?/span>DLL采用_DllMainCRTStartup调用DllMain函数Q必采?/span>__stdcall调用U定Q?/span>Stack allocationsQ用以设|程序用的堆栈大小Q请使用十进Ӟ(j)Q默认ؓ(f)1兆字节?/span>Version Information告诉q接器在EXE?/span>DLL文g的开始部分放上版本号?/span>一般情况下都不用改变?/font>

 

值得注意的是Q上面各个参数是大小写敏感的Q在参数后加?#8220;-”表示该参数无效;各个参数值选项?#8220;*”的表CZؓ(f)该参数的默认|可以使用右上角?#8220;Reset”按钮来恢复该늚所有默认设|?/font>

 

9)Resources选项?/strong>  Resources选项卡控制着VC6的资源编译器。如?-5所C,我们可以指定~译后生成的资源文g的\径,资源的语acdQ以?qing)额外的资源包含目录?/font>

 MIDL选项?q个选项卡与COMQ组件对象模型)(j)~程有关Q我们不讨论它?/font>

 

10)Browse Info选项?在这个选项卡中Q我们可以指定是否在建立工程的同时也生成览信息文gQ有?jin)这个文件后Q我们就能够在文本编辑器中通过兌菜单的相应命令快速定位到某个W号的定义或引用的地斏V?/font>

 

11)Pre-link step

q个选项卡用于添加在q接之前要执行的命o(h)?/font>

 

l2) Post-build step

q个选项卡用于添加在工程建立完毕之后要执行的命o(h) ?“copy debug\TestDll.lib C:\bin\TestDll.lib” q在C盘下Z个bin目录 做的件事情就是把TestDLL.lib拯到C:\bin所在的文g夹中
 

 

其它一些参数设|?/font>?/font>

  

13) Project->Settings->GeneralQ可以设|连?/span>MFC库的方式Q静(rn)态或动态)(j)。如果是动态连接,在你的Y件发布时不要忘了(jin)带上MFC?/span>DLL?/span>W二个选项用于指定在编译连接过E中生成的中间文件和输出文g的存攄录,对于调试版本来说Q缺省的目录是工E下面的“Debug”子目录。最下面的第三个选项用于指定是否允许每种工程配置都有自己的文件依赖关p(主要指头文gQ,׃l大多数工程的调试版本和发布版本都具有相同的文g依赖关系Q所以通常不需要更改该选项?/font>

 

14) Project->Settings->DebugQ可以设|调试时q行的可执行文gQ?/span>如果正在~写的程序是一个DLLQ那么应在此处指定一个用来调试该DLL的EXE文g。另外三个选项可以指定用于调试的工作目录,开始调试时l程序传送的命o(h)行参敎ͼ以及(qing)q行q程调试时可执行文g的\径。把cd切换到Additional DLLs后,我们可以指定在开始调试时是否Z些额外的DLL装蝲调试W号信息Q只有装载了(jin)W号信息后才能跟t进DLL?/font>

 

15)Project->Settings->Custom BuildQ可以设|编?/span>/q接成功后自动执行一些操作。比较有用的是,?/span>COM时希?/span>VC对编译通过?/span>COM文g自动注册Q可以如下设|:(x)

Description: Register COM

Commands: regsvr32 /s /c $(TargetPath)

echo regsvr32 exe.time > $(TargetDir)\$(TargetName).trg

Outputs: $(TargetDir)\$(TargetName).trg

 

16)Tools->Options->DirectoriesQ设|系l的Include?/span>Library路径?/font>

 

一些小H门

1) 有时候,你可能在~译的时候,计算机突焉法关Z(jin)Q可能某Z心(j)?l)C(jin)甉|或你的内存不E_{原因)(j)。当你重启机器后打开刚才的项目,重新q行~译Q发?/span>VC?x)崩掉。你或许以ؓ(f)你的VC~译器坏?jin),其实不然Q你试试~译其它目Q还是好的!Q,你只要将目?/span>.ncb?/span>.opt?/span>.aps?/span>.clw文g以及(qing)Debug?/span>Release目录下的所有文仉删掉Q然后重新编译就行了(jin)?/span> 

2) 如果你想与别人共享你的源代码目Q但是把整个目做拷贝又太大。你完全可以删掉以下文gQ?/span>.dsw?/span>.ncb?/span>.opt?/span>.aps?/span>.clw?/span>. plg文g以及(qing)Debug?/span>Release目录下的所有文件?/font>

3) 当你?/span>Workspace中包含多?/span>Project的时候,你可能不能直观地、一眼看出来哪个是当前项目。可以如下设|:(x)Tools->Options->FormatQ然后在Category中选择Workspace windowQ改变其默认的字体(比如设成FixedsysQ就行了(jin)?/font>

4) 如何l已有的Project改名字?该Projectx。然后以文本格式打开.dsp文gQ替换原来的Project名字卛_?/font>

5) VC6对类成员的智能提C功能很有用Q但有时候会(x)q。你可以先关掉项目,?/span>.clw?/span>.ncb删掉Q然后重新打开目Q点击菜单项View->ClassWizardQ在弹出的对话框中按一?#8220;Add All”按钮Q重?/span>Rebuild All。应该可以解决问题?/font>

 

?

VC文g扩展名解d?/font>

.APSQ存放二q制资源的中间文ӞVC把当前资源文件{换成二进制格式,q存攑֜APS文g中,以加快资源装载速度。资源辅助文件?/font>

.BMPQ位图资源文件?/font>

.BSCQ浏览信息文Ӟ由浏览信息维护工PBSCMAKEQ从原始览信息文gQ?SBRQ中生成QBSC文g可以用来在源代码~辑H口中进行快速定位。用于浏览项目信息的Q如果用source brower的话必Lq个文g。可以在project options里去掉Generate Browse Info FileQ这样可以加快编译进度?/font>

.CQ用C语言~写的源代码文g?/font>

.CLWQClassWizard生成的用来存攄信息的文件。classwizard信息文gQini文g的格式?/font>

.CNTQ用来定义帮助文件中“Contents”的结构?/font>

.CPP?CXXQ用C++语言~写的源代码文g?/font>

.CURQ光标资源文件?/font>

.DEFQ模块定义文Ӟ供生成动态链接库时用?/font>

.DLGQ定义对话框资源的独立文件。这U文件对于VC工程来说q必需Q因为VC一般把对话框资源放?RC资源定义文g中?/font>

.DSPQVC开发环境生成的工程文gQVC4?qing)以前版本用MAK文g来定义工E。项目文Ӟ文本格式?/font>

.DSWQVC开发环境生成的WorkSpace文gQ用来把多个工程l织C个WorkSpace中。工作区文gQ与.dsp差不多?/font>

.EXPQ由LIB工具从DEF文g生成的输出文Ӟ其中包含?jin)函数和数据目的输Z息,LINK工具用EXP文g来创建动态链接库。只有在~译DLL时才?x)生成,记录了(jin)DLL文g中的一些信息?/font>

.H?HPP?HXXQ用C/C++语言~写的头文gQ通常用来定义数据cdQ声明变量、函数、结构和cR?/font>

.HLPQWindows帮助文g?/font>

.HMQ在Help工程中,该文件定义了(jin)帮助文g与对话框、菜单或其它资源之间ID值的对应关系?/font>

.HPJQ由Help Workshop生成的Help工程文gQ用来控制Help文g的生成过E?/font>

.HPGQ生成帮助的文g的工E?/font>

.ICOQ图标资源文件?/font>

.ILKQ连接过E中生成的一U中间文Ӟ只供LINK工具使用?/font>

.INIQ配|文件?/font>

.LIBQ库文gQLINK工具用它来连接各U输入库Q以便最l生成EXE文g?/font>

.LICQ用戯可证书文Ӟ使用某些ActiveX控g旉要该文g?/font>

.MAKQ即MAKE文gQVC4?qing)以前版本用的工程文gQ用来指定如何徏立一个工E,VC6把MAK文g转换成DSP文g来处理?/font>

.MAPQ由LINK工具生成的一U文本文Ӟ其中包含有被q接的程序的某些信息Q例如程序中的组信息和公q号信息等。执行文件的映像信息记录文g?/font>

.MDPQ旧版本的项目文Ӟ相当?dsp

.NCBQNCB?#8220;No Compile Browser”的羃写,其中存放?jin)供ClassView、WizardBar和Component Gallery使用的信息,由VC开发环境自动生成。无~译览文g。当自动完成功能出问题时可以删除此文件。编译工E后?x)自动生成?/font>

.OBJQ由~译器或汇编工具生成的目标文Ӟ是模块的二进制中间文件?/font>

.ODLQ用对象描述语言~写的源代码文gQVC用它来生成TLB文g?/font>

.OLBQ带有类型库资源的一U特D的动态链接库Q也叫对象库文g?/font>

.OPTQVC开发环境自动生成的用来存放W(wng)orkSpace中各U选项的文件。工E关于开发环境的参数文g。如工具条位|信息等?/font>

.PBI?PBO?PBTQ由VC的性能分析工具PROFILE生成q用的三种文g?/font>

.PCHQ预~译头文Ӟ比较大,q译器在徏立工E时自动生成Q其中存放有工程中已l编译的部分代码Q在以后建立工程时不再重新编译这些代码,以便加快整个~译q程的速度?/font>

.PDBQ程序数据库文gQ在建立工程时自动生成,其中存放E序的各U信息,用来加快调试q程的速度。记录了(jin)E序有关的一些数据和调试信息?/font>

.PLGQ编译信息文Ӟ~译时的error和warning信息文g?/font>

.RCQ资源定义文件?/font>

.RC2Q资源定义文Ӟ供一些特D情况下使用?/font>

.REGQ注册表信息文g?/font>

.RESQ二q制资源文gQ资源编译器~译资源定义文g后即生成RES文g?/font>

.RTFQRich Text FormatQ丰富文本格式)(j)文档Q可由Word或写字板来创建,常被用来生成Help文g?/font>

.SBRQVC~译器ؓ(f)每个OBJ文g生成的原始浏览信息文Ӟ览信息l护工具QBSCMAKEQ将利用SBR文g来生成BSC文g?/font>

.TLBQOLE库文Ӟ其中存放?jin)OLE自动化对象的数据cd、模块和接口定义Q自动化服务器通过TLB文gp?jin)解自动化对象的使用?gu)?/font>

.WAVQ声韌源文件?/font>



]]>
Select模型http://m.shnenglu.com/xpzhou/archive/2007/04/25/22786.html榕树(wi)?/dc:creator>榕树(wi)?/author>Wed, 25 Apr 2007 01:09:00 GMThttp://m.shnenglu.com/xpzhou/archive/2007/04/25/22786.htmlhttp://m.shnenglu.com/xpzhou/comments/22786.htmlhttp://m.shnenglu.com/xpzhou/archive/2007/04/25/22786.html#Feedback0http://m.shnenglu.com/xpzhou/comments/commentRss/22786.htmlhttp://m.shnenglu.com/xpzhou/services/trackbacks/22786.html套接字模式:(x)d套接字和非阻塞套接字。或者叫同步套接字和异步套接字?br>套接字模型:(x)描述如何对套接字的I/O行ؓ(f)q行理?br>Winsock提供的I/O模型一共有五种Q?br>select,WSAAsyncSelect,WSAEventSelect,Overlapped,Completion。今天先讲解select?br>
1Qselect模型Q选择模型Q?br>先看一下下面的q句代码Q?br>int iResult = recv(s, buffer,1024);
q是用来接收数据的,在默认的d模式下的套接字里Qrecv?x)阻塞在那里Q直到套接字q接上有数据可读Q把数据dbuffer里后recv函数才会(x)q回Q不然就?x)一直阻塞在那里。在单线E的E序里出现这U情况会(x)DȝE(单线E程序里只有一个默认的ȝE)(j)被阻?q样整个E序被锁dq里Q如果永q没数据发送过来,那么E序׃(x)被永q锁歅R这个问题可以用多线E解冻I但是在有多个套接字连接的情况下,q不是一个好的选择Q扩展性很差。Select模型是Z(jin)解决q个问题而出现的?br>再看代码Q?br>
int iResult = ioctlsocket(s, FIOBIO, (unsigned long *)&ul);
iResult = recv(s, buffer,1024);

q一ơrecv的调用不套接字q接上有没有数据可以接收都会(x)马上q回。原因就在于我们用ioctlsocket把套接字讄为非d模式?jin)。不q你跟踪一下就?x)发玎ͼ在没有数据的情况下,recv实是马上返回了(jin)Q但是也q回?jin)一个错误:(x)WSAEWOULDBLOCKQ意思就是请求的操作没有成功完成。看到这里很多h可能?x)说Q那么就重复调用recvq检查返回|直到成功为止Q但是这样做效率很成问题Q开销太大?br>感谢天才的微软工E师吧,他们l我们提供了(jin)好的解决办法?br>先看看select函数
int select(
int nfds,
fd_set FAR *readfds,
fd_set FAR *writefds,
fd_set FAR *exceptfds,
const struct timeval FAR *timeout
);
W一个参C要管Q会(x)被系l忽略的。第二个参数是用来检查套接字可读性,也就说检查套接字上是否有数据可读Q同PW三个参数用来检查数据是否可以发出。最后一个是(g)查是否有带外数据可读取?br>参数详细的意思请ȝMSDNQ这里限于篇q不详细解释?jin)?br>最后一个参数是用来讄select{待多久的,是个l构Q?br>

struct timeval {
long tv_sec; // seconds
long tv_usec; // and microseconds
};
如果这个结构设|ؓ(f)(0,0)Q那么select函数?x)马上返回?br>说了(jin)q么久,select的作用到底是什么?
他的作用是Q防止在在阻塞模式的套接字里被锁死,避免在非d套接字里重复(g)查WSAEWOULDBLOCK错误?br>他的工作程如下Q?br>1Q用FD_ZERO宏来初始化我们感兴趣的fd_setQ也是select函数的第二三四个参数?br>2Q用FD_SET宏来套接字句柄分配l相应的fd_set?br>3Q调用select函数?br>4Q用FD_ISSET对套接字句柄q行(g)查,如果我们所x的那个套接字句柄仍然在开始分配的那个fd_set里,那么说明马上可以q行相应的IO操作。比如一个分配给selectW一个参数的套接字句柄在selectq回后仍然在selectW一个参数的fd_set里,那么说明当前数据已经来了(jin)Q马上可以读取成功而不?x)被d?br>
下面l出一个简单的select模型的服务端套接字?br>
#include “iostream.h”
#include “winsock2.h”
#include “windows.h”


#define InternetAddr "127.0.0.1"
#define iPort 5055

#pragma comment(lib, "ws2_32.lib")


void main()
{
    WSADATA wsa;
    WSAStartup(MAKEWORD(2,2), &wsa);
    
    SOCKET fdServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    
    struct sockaddr_in server;
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = inet_addr(InternetAddr);
    server.sin_port = htons(iPort);
    
    int ret = bind(fdServer, (sockaddr*)&server, sizeof(server));
    ret = listen(fdServer, 4);


    SOCKET AcceptSocket;
    fd_set fdread;
    timeval tv;
    int nSize;

    while(1)
    {
        
        FD_ZERO(&fdread);//初始化fd_set
        FD_SET(fdServer, &fdread);//分配套接字句柄到相应的fd_set
        
        
        tv.tv_sec = 2;//q里我们打算让select{待两秒后返回,避免被锁死,也避免马上返?br>        tv.tv_usec = 0;
        
        select(0, &fdread, NULL, NULL, &tv);
        
        nSize = sizeof(server);
        if (FD_ISSET(fdServer, &fdread))//如果套接字句柄还在fd_set里,说明客户端已l有connect的请求发q来?jin),马上可以accept成功
        {
            AcceptSocket = accept(fdServer,( sockaddr*) &server, &nSize);
            break;
        }
        
        else//q没有客L(fng)的connecthQ我们可以去做别的事Q避免像没有用select方式的阻塞套接字E序被锁ȝ情况Q如果没用select,当程序运行到accept的时候客L(fng)恰好没有connecthQ那么程序就?x)被锁死Q做不了(jin)M事情
        {
            //do something
            ::MessageBox(NULL, "waiting...", "recv", MB_ICONINFORMATION);//别的事做完后Ql去(g)查是否有客户端连接请?br>        }
    }

    char buffer[128];
    ZeroMemory(buffer, 128);

    ret = recv(AcceptSocket,buffer,128,0);//q里同样可以用selectQ用法和上面一?br>
    ::MessageBox(NULL, buffer, "recv", MB_ICONINFORMATION);

    closesocket(AcceptSocket);
    WSACleanup();
    
    return;

}

基本上就q样Q个人感觉select模型用处不是很大Q我只用q一ơ,d写端口扫描器的时候用select来检查超时?br>感觉讲得不是很清楚,虽然东西我很明白Q但是要讲解出来讲解得很清楚真不Ҏ(gu)?br>不知道大家能不能看懂Q如果看得过E中有什么问题就问吧?br>

]]>
WinSock学习(fn)W记http://m.shnenglu.com/xpzhou/archive/2007/04/25/22785.html榕树(wi)?/dc:creator>榕树(wi)?/author>Wed, 25 Apr 2007 01:08:00 GMThttp://m.shnenglu.com/xpzhou/archive/2007/04/25/22785.htmlhttp://m.shnenglu.com/xpzhou/comments/22785.htmlhttp://m.shnenglu.com/xpzhou/archive/2007/04/25/22785.html#Feedback0http://m.shnenglu.com/xpzhou/comments/commentRss/22785.htmlhttp://m.shnenglu.com/xpzhou/services/trackbacks/22785.html与socket有关的一些函Cl?br>
1、读取当前错误|(x)每次发生错误Ӟ如果要对具体问题q行处理Q那么就应该调用q个函数取得错误代码?
      int  WSAGetLastError(void );
#define h_errno   WSAGetLastError()
错误D自己阅读Winsock2.h?br>
2、将L的unsigned longD{换ؓ(f)|络字节序(32?Qؓ(f)什么要q样做呢Q因Z同的计算Z用不同的字节序存储数据。因此Q何从Winsock函数对IP地址和端口号的引用和传给Winsock函数的IP地址和端口号均时按照|络序l织的?br>
      u_long  htonl(u_long hostlong);
举例Qhtonl(0)=0
htonl(80)= 1342177280
3、将unsigned longC|络字节序转换位主机字节顺序,是上面函数的逆函数?
      u_long  ntohl(u_long netlong);
举例Qntohl(0)=0
ntohl(1342177280)= 80
4、将L的unsigned shortD{换ؓ(f)|络字节序(16?Q原因同2Q?
      u_short  htons(u_short hostshort);
举例Qhtonl(0)=0
htonl(80)= 20480
5、将unsigned shortC|络字节序转换位主机字节顺序,是上面函数的逆函数?
      u_short  ntohs(u_short netshort);
举例Qntohs(0)=0
ntohsl(20480)= 80
6、将用点分割的IP地址转换位一个in_addrl构的地址Q这个结构的定义见笔?一)Q实际上是一个unsigned long倹{计机内部处理IP地址可是不认识如192.1.8.84之类的数据?
      unsigned long  inet_addr( const char FAR * cp );
举例Qinet_addr("192.1.8.84")=1409810880
inet_addr("127.0.0.1")= 16777343
如果发生错误Q函数返回INADDR_NONE倹{?br>
7、将|络地址转换位用点分割的IP地址Q是上面函数的逆函数?
      char FAR *  inet_ntoa( struct in_addr in );
举例Qchar * ipaddr=NULL;
char addr[20];
in_addr inaddr;
inaddr. s_addr=16777343;
ipaddr= inet_ntoa(inaddr);
strcpy(addr,ipaddr); 
q样addr的值就变ؓ(f)127.0.0.1?br>注意意不要修改返回值或者进行释攑֊作。如果函数失败就?x)返回NULL倹{?br>
8、获取套接字的本地地址l构Q?
      int  getsockname(SOCKET s, struct sockaddr FAR * name, int FAR * namelen );
s为套接字
name为函数调用后获得的地址?
namelen为缓冲区的大?
9、获取与套接字相q的端地址l构Q?br>
      int  getpeername(SOCKET s, struct sockaddr FAR * name, int FAR * namelen );
s为套接字
name为函数调用后获得的端地址?
namelen为缓冲区的大?
10、获取计机名:(x)
      int  gethostname( char FAR * name, int namelen );
name是存放计机名的~冲?
namelen是缓冲区的大?
用法Q?
char szName[255];
memset(szName,0,255);
if(gethostname(szName,255)==SOCKET_ERROR)
{
//错误处理
}
q回gؓ(f)QszNmae="xiaojin"
11、根据计机名获取主机地址Q?
      struct hostent FAR *  gethostbyname( const char FAR * name );
name机名?
用法Q?
hostent * host;
char* ip;
host= gethostbyname("xiaojin");
if(host->h_addr_list[0])
{
struct in_addr addr;
memmove(&addr, host->h_addr_list[0]Q?);
//获得标准IP地址
ip=inet_ ntoa (addr);
}
q回gؓ(f)Qhostent->h_name="xiaojin"
hostent->h_addrtype=2    //AF_INET
hostent->length=4
ip="127.0.0.1"
Winsock 的I/O操作Q?/strong>

1?两种I/O模式
  • d模式Q执行I/O操作完成前会(x)一直进行等待,不会(x)控制权交给E序。套接字 默认为阻塞模式。可以通过多线E技术进行处理?
  • 非阻塞模式:(x)执行I/O操作ӞW(xu)insock函数?x)返回ƈ交出控制权。这U模式?h比较复杂Q因为函数在没有q行完成p行返回,?x)不断地q回 WSAEWOULDBLOCK错误。但功能强大?/li>
Z(jin)解决q个问题Q提Z(jin)q行I/O操作的一些I/O模型,下面介绍最常见的三U:(x)

2、select模型Q?br>
  通过调用select函数可以定一个或多个套接字的状态,判断套接字上是否有数据,?br>者能否向一个套接字写入数据?
      int  select( int nfds, fd_set FAR * readfds, fd_set FAR * writefds, 
fd_set FAR *exceptfds, const struct timeval FAR * timeout );
◆先来看看涉?qing)到的结构的定义Q?br>a?d_setl构Q?br>
#define FD_SETSIZE 64?
typedef struct fd_set {
u_int fd_count; /* how many are SET? */
SOCKET fd_array[FD_SETSIZE]; /* an array of SOCKETs */
} fd_set;      
fd_count为已讑֮socket的数?br>fd_array为socket列表QFD_SETSIZE为最大socket数量Q徏议不于64。这是微软徏
议的?br>
B、timevall构Q?
struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* and microseconds */
};
tv_sec为时间的U倹{?br>tv_usec为时间的毫秒倹{?br>q个l构主要是设|select()函数的等待|如果该l构讄?0,0)Q则select()函数
?x)立卌回?br>
◆再来看看select函数各参数的作用Q?
  1. nfdsQ没有Q何用处,主要用来q行pȝ兼容用,一般设|ؓ(f)0?br>
  2. readfdsQ等待可L检查的套接字组?br>
  3. writefdsQ等待可写性检查的套接字组?br>
  4. exceptfdsQ等待错误检查的套接字组?br>
  5. timeoutQ超时时间?br>
  6. 函数p|的返回|(x)调用p|q回SOCKET_ERROR,时q回0?/li>
readfds、writefds、exceptfds三个变量臛_有一个不为空Q同时这个不为空的套接字l?br>U至有一个socketQ道理很单,否则要selectq什么呢?举例Q测试一个套接字是否可读Q?
fd_set fdread;
//FD_ZERO定义
// #define FD_ZERO(set) (((fd_set FAR *)(set))->fd_count=0)
FD_ZERO(&fdread);
FD_SET(s,&fdread)Q?//加入套接字,详细定义L(fng)winsock2.h
if(select(0,%fdread,NULL,NULL,NULL)>0
{
//成功
if(FD_ISSET(s,&fread) //是否存在fread中,详细定义L(fng)winsock2.h
{
//是可ȝ
}
}

◆I/O操作函数Q主要用于获取与套接字相关的操作参数?

 int  ioctlsocket(SOCKET s, long cmd, u_long FAR * argp );     
s为I/O操作的套接字?br>cmd为对套接字的操作命o(h)?br>argp为命令所带参数的指针?br>
常见的命令:(x)
//定套接字自动读入的数据?
#define FIONREAD _IOR(''''f'''', 127, u_long) /* get # bytes to read */
//允许或禁止套接字的非d模式Q允ؓ(f)?Q禁止ؓ(f)0
#define FIONBIO _IOW(''''f'''', 126, u_long) /* set/clear non-blocking i/o */
//定是否所有带外数据都已被d
#define SIOCATMARK _IOR(''''s'''', 7, u_long) /* at oob mark? */
3、WSAAsynSelect模型Q?br>WSAAsynSelect模型也是一个常用的异步I/O模型。应用程序可以在一个套接字上接收以
WINDOWS消息为基的网l事仉知。该模型的实现方法是通过调用WSAAsynSelect?br>?自动套接字讄为非d模式Qƈ向WINDOWS注册一个或多个|络旉Qƈ提供一
个通知时用的H口句柄。当注册的事件发生时Q对应的H口收C个基于消息的通知?br>
      int  WSAAsyncSelect( SOCKET s, HWND hWnd, u_int wMsg, long lEvent);       
s为需要事仉知的套接字
hWnd为接收消息的H口句柄
wMsg接收的消?br>lEvent为掩码,指定应用E序感兴的|络事gl合Q主要如下:(x)
#define FD_READ_BIT 0
#define FD_READ (1 << FD_READ_BIT)
#define FD_WRITE_BIT 1
#define FD_WRITE (1 << FD_WRITE_BIT)
#define FD_OOB_BIT 2
#define FD_OOB (1 << FD_OOB_BIT)
#define FD_ACCEPT_BIT 3
#define FD_ACCEPT (1 << FD_ACCEPT_BIT)
#define FD_CONNECT_BIT 4
#define FD_CONNECT (1 << FD_CONNECT_BIT)
#define FD_CLOSE_BIT 5
#define FD_CLOSE (1 << FD_CLOSE_BIT)
用法Q要接收d通知Q?
int nResult= WSAAsyncSelect(s,hWnd,wMsg,FD_READ|FD_WRITE)Q?
if(nResult==SOCKET_ERROR)
{
//错误处理
}
取消通知Q?br>
      int nResult= WSAAsyncSelect(s,hWnd,0Q?)Q?
当应用程序窗口hWnd收到消息ӞwMsg.wParam参数标识?jin)套接字QlParam的低字标?br>?jin)网l事Ӟ高字则包含错误代码?br>
4、WSAEventSelect模型
WSAEventSelect模型cMWSAAsynSelect模型Q但最主要的区别是|络事g发生时会(x)被发
送到一个事件对象句柄,而不是发送到一个窗口?br>
使用步骤如下Q?br>a?创徏事g对象来接收网l事Ӟ(x)
#define WSAEVENT HANDLE
#define LPWSAEVENT LPHANDLE
WSAEVENT WSACreateEvent( void );
该函数的q回gؓ(f)一个事件对象句柄,它具有两U工作状态:(x)已传?signaled)和未传信
(nonsignaled)以及(qing)两种工作模式Qh工重?manual reset)和自动重?auto reset)。默认未
未传信的工作状态和人工重设模式?br>
b、将事g对象与套接字兌Q同时注册事Ӟ使事件对象的工作状态从未传信{变未
已传信?br>
      int  WSAEventSelect( SOCKET s,WSAEVENT hEventObject,long lNetworkEvents );  
s为套接字
hEventObject为刚才创建的事g对象句柄
lNetworkEvents为掩码,定义如上面所q?br>
c、I/O处理后,讄事g对象为未传信
BOOL WSAResetEvent( WSAEVENT hEvent );

HeventZ件对?br>
成功q回TRUEQ失败返回FALSE?br>
d、等待网l事件来触发事g句柄的工作状态:(x)

DWORD WSAWaitForMultipleEvents( DWORD cEvents,
const WSAEVENT FAR * lphEvents, BOOL fWaitAll,
DWORD dwTimeout, BOOL fAlertable );

lpEventZ件句柄数l的指针
cEventZؓ(f)事g句柄的数目,其最大gؓ(f)WSA_MAXIMUM_WAIT_EVENTS 
fWaitAll指定{待cdQTRUEQ当lphEvent数组重所有事件对象同时有信号时返回;
FALSEQQ一事g有信号就q回?br>dwTimeout为等待超Ӟ毫秒Q?br>fAlertable为指定函数返回时是否执行完成例程

对事件数l中的事件进行引用时Q应该用WSAWaitForMultipleEvents的返回|减去
预声明值WSA_WAIT_EVENT_0Q得到具体的引用倹{例如:(x)

nIndex=WSAWaitForMultipleEvents(…);
MyEvent=EventArray[Index- WSA_WAIT_EVENT_0];

e、判断网l事件类型:(x)

int WSAEnumNetworkEvents( SOCKET s,
WSAEVENT hEventObject, LPWSANETWORKEVENTS lpNetworkEvents );

s为套接字
hEventObject为需要重讄事g对象
lpNetworkEvents录网l事件和错误代码Q其l构定义如下Q?/p>

typedef struct _WSANETWORKEVENTS {
long lNetworkEvents;
int iErrorCode[FD_MAX_EVENTS];
} WSANETWORKEVENTS, FAR * LPWSANETWORKEVENTS;

f、关闭事件对象句柄:(x)

BOOL WSACloseEvent(WSAEVENT hEvent);

调用成功q回TRUEQ否则返回FALSE?br>



]]>pragma指o(h)?/title><link>http://m.shnenglu.com/xpzhou/archive/2007/04/18/22193.html</link><dc:creator>榕树(wi)?/dc:creator><author>榕树(wi)?/author><pubDate>Wed, 18 Apr 2007 02:24:00 GMT</pubDate><guid>http://m.shnenglu.com/xpzhou/archive/2007/04/18/22193.html</guid><wfw:comment>http://m.shnenglu.com/xpzhou/comments/22193.html</wfw:comment><comments>http://m.shnenglu.com/xpzhou/archive/2007/04/18/22193.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/xpzhou/comments/commentRss/22193.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/xpzhou/services/trackbacks/22193.html</trackback:ping><description><![CDATA[在编写程序的时?我们l常要用?pragma指o(h)来设定编译器的状态或者是指示~译器完成一些特定的动作.<br> 下面介绍?jin)一下该指o(h)的一些常用参?希望对大家有所帮助! <p> 一. message 参数?br> message<br> 它能够在~译信息输出H口中输出相应的信息Q这对于源代码信息的控制是非帔R要的?/p> <p> 其用方法ؓ(f)Q?nbsp; #pragma message("消息文本")</p> <p> 当编译器遇到q条指o(h)时就在编译输出窗口中消息文本打印出来?br> 当我们在E序中定义了(jin)许多宏来控制源代码版本的时候,我们自己有可能都?x)忘记有没有正确的设|这些宏Q此时我们可以用q条指o(h)在编译的时候就q行(g)查。假设我们希望判断自己有没有在源代码的什么地方定义了(jin)_X86q个宏可以用下面的方法:(x)<br>#ifdef _X86<br>#pragma message("_X86 macro activated!")<br>#endif<br> 当我们定义了(jin)_X86q个宏以后,应用E序在编译时׃(x)在编译输出窗口里昄<br> "_X86 macro activated!"<br> q样Q我们就不会(x)因ؓ(f)不记得自己定义的一些特定的宏而抓x腮了(jin)?/p> <p> ? 另一个用得比较多的#pragma参数是code_seg?br> 格式如:(x)<br> #pragma code_seg( [ [ { push | pop}, ] [ identifier, ] ] [ "segment-name" [, "segment-class" ] )<br> 该指令用来指定函数在.obj文g中存攄?观察OBJ文g可以使用VC自带的dumpbin命o(h)行程?函数?obj文g中默认的存放节ؓ(f).text节,如果code_seg没有带参数的?则函数存攑֜.text节中?/p> <p> push (可选参? 一个记录放到内部编译器的堆栈中,可选参数可以ؓ(f)一个标识符或者节?br> pop(可选参? 一个记录从堆栈端弹出,该记录可以ؓ(f)一个标识符或者节?br> identifier (可选参? 当用push指o(h)?为压入堆栈的记录指派的一个标识符,当该标识W被删除的时候和其相关的堆栈中的记录被弹出堆栈<br>   "segment-name" (可选参? 表示函数存放的节?br> 例如:<br> //默认情况?函数被存攑֜.text节中<br> void func1() {   // stored in .text<br> }</p> <p> //函数存攑֜.my_data1节中<br> #pragma code_seg(".my_data1")<br> void func2() {   // stored in my_data1<br> }</p> <p> //r1为标识符,函数放?my_data2节中<br> #pragma code_seg(push, r1, ".my_data2")<br> void func3() {   // stored in my_data2<br> }</p> <p> int main() {<br> }</p> <p> ? #pragma once (比较常用Q?br> q是一个比较常用的指o(h),只要在头文g的最开始加入这条指令就能够保证头文件被~译一?/p> <p> ? #pragma hdrstop表示预编译头文g到此为止Q后面的头文件不q行预编译?br> BCB可以预编译头文g以加快链接的速度Q但如果所有头文g都进行预~译又可能占太多盘I间Q所以用这个选项排除一些头文g?br> 有时单元之间有依赖关p,比如单元A依赖单元BQ所以单元B要先于单元A~译。你可以?pragma startup指定~译优先U,如果使用?pragma package(smart_init) QBCB׃(x)Ҏ(gu)优先U的大小先后~译?/p> <p> ? #pragma warning指o(h)<br> 该指令允许有选择性的修改~译器的警告消息的行?br> 指o(h)格式如下:<br> #pragma warning( warning-specifier : warning-number-list [; warning-specifier : warning-number-list...]<br> #pragma warning( push[ ,n ] )<br> #pragma warning( pop )</p> <p> 主要用到的警告表C有如下几个:</p> <p> once:只显CZ?警告/错误{?消息<br> default:重置~译器的警告行ؓ(f)到默认状?br> 1,2,3,4:四个警告U别<br> disable:止指定的警告信?br> error:指定的警告信息作ؓ(f)错误报告</p> <p> 如果大家对上面的解释不是很理?可以参考一下下面的例子?qing)说?/p> <p> #pragma warning( disable : 4507 34; once : 4385; error : 164 )<br> {h(hun)于:(x)<br> #pragma warning(disable:4507 34)  // 不显C?507?4可告信?br> #pragma warning(once:4385)   // 4385可告信息仅报告一?br> #pragma warning(error:164)   // ?64可告信息作Z个错误?br> 同时q个pragma warning 也支持如下格式:(x)<br> #pragma warning( push [ ,n ] )<br> #pragma warning( pop )<br> q里n代表一个警告等U?1---4)?br> #pragma warning( push )保存所有警告信息的现有的警告状态?br> #pragma warning( push, n)保存所有警告信息的现有的警告状态,q且把全局警告{讑֮为n?br> #pragma warning( pop )向栈中弹出最后一个警告信息,在入栈和出栈之间所作的一切改动取消。例如:(x)<br> #pragma warning( push )<br> #pragma warning( disable : 4705 )<br> #pragma warning( disable : 4706 )<br> #pragma warning( disable : 4707 )<br> #pragma warning( pop )</p> <p> 在这D代码的最后,重新保存所有的警告信息(包括4705Q?706?707)</p> <p> 在用标准C++q行~程的时候经怼(x)得到很多的警告信?而这些警告信息都是不必要的提C?所以我们可以?pragma warning(disable:4786)来禁止该cd的警告在vc中用ADO的时候也?x)得C必要的警告信?q个时候我们可以通过#pragma warning(disable:4146)来消除该cd的警告信?/p> <p> ? pragma comment(...)<br> 该指令的格式为:(x)  #pragma comment( "comment-type" [, commentstring] )<br> 该指令将一个注释记录放入一个对象文件或可执行文件中,comment-type(注释cd):可以指定ZU预定义的标识符的其中一U?br> 五种预定义的标识Wؓ(f):</p> <p> 1、compiler:编译器的版本号和名U放入目标文件中,本条注释记录被~译器忽?br>如果你ؓ(f)该记录类型提供了(jin)commentstring参数,~译器将?x)生一个警?br>例如:#pragma comment( compiler )</p> <p> 2、exestr:commentstring参数攑օ目标文g?在链接的时候这个字W串被攑օ到可执行文g?当操作系l加载可执行文g的时?该参数字W串不会(x)被加载到内存?但是,该字W串可以被dumpbin之类的程序查扑ևq打印出?你可以用q个标识W将版本L(fng)之类的信息嵌入到可执行文件中!</p> <p> 3、lib:q是一个非常常用的关键?用来一个库文g链接到目标文件中常用的lib关键字,可以帮我们连入一个库文g?br> 例如: <br> #pragma comment(lib, "user32.lib")<br> 该指令用来将user32.lib库文件加入到本工E中</p> <p> 4、linker:一个链接选项攑օ目标文g?你可以用这个指令来代替由命令行传入的或者在开发环境中讄的链接选项,你可以指?include选项来强制包含某个对?例如:<br>#pragma comment(linker, "/include:__mySymbol")<br>你可以在E序中设|下列链接选项<br>/DEFAULTLIB<br>/EXPORT<br>/INCLUDE<br>/MERGE<br>/SECTION</p> <p> q些选项在这里就不一一说明?详细信息L(fng)msdn!</p> <p> 5、user:一般的注释信息攑օ目标文g中commentstring参数包含注释的文本信?q个注释记录被链接器忽?br> 例如:<br> #pragma comment( user, "Compiled on " __DATE__ " at " __TIME__ ) </p> <img src ="http://m.shnenglu.com/xpzhou/aggbug/22193.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/xpzhou/" target="_blank">榕树(wi)?/a> 2007-04-18 10:24 <a href="http://m.shnenglu.com/xpzhou/archive/2007/04/18/22193.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://m.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.ypnlb.cn" target="_blank">þþAVҰ</a>| <a href="http://www.duansisi.cn" target="_blank">Ʒþþþþ</a>| <a href="http://www.mk606.cn" target="_blank">þþƷվ</a>| <a href="http://www.taiguolu.com.cn" target="_blank">þùҹaӰԺ</a>| <a href="http://www.jinshengsuliao.cn" target="_blank">þþþþavѿƬ </a>| <a href="http://www.ycsxw.cn" target="_blank">þպƷһ</a>| <a href="http://www.bushenba.cn" target="_blank">ۺŮþþ30p</a>| <a href="http://www.hhjzw.cn" target="_blank">þþƷһ</a>| <a href="http://www.tupw.cn" target="_blank">޹˾þһþ</a>| <a href="http://www.vtsg.cn" target="_blank">þ96Ʒþþ</a>| <a href="http://www.sxstreet.cn" target="_blank">þþþƷһ</a>| <a href="http://www.maosite.cn" target="_blank">www.þ.com</a>| <a href="http://www.bwart.com.cn" target="_blank">99ξþþŷƷվ</a>| <a href="http://www.66zhuangzxkcw.cn" target="_blank">9þ9þþƷ</a>| <a href="http://www.pajiangxing.com.cn" target="_blank">þþƷþþþùۿ99ˮ</a>| <a href="http://www.dgabs.cn" target="_blank">99reþùƷҳ</a>| <a href="http://www.baobaonin.cn" target="_blank">˼˼þþƷ</a>| <a href="http://www.chec-qhd.com.cn" target="_blank">޹˾þþƷ</a>| <a href="http://www.rfgjqh.cn" target="_blank">޹þþþƷ</a>| <a href="http://www.sa88.cn" target="_blank">һþþƷһ</a>| <a href="http://www.ozxt.cn" target="_blank">Ʒþþþ</a>| <a href="http://www.leftbank-cn.cn" target="_blank">þþƷձҰ</a>| <a href="http://www.qgnz.net.cn" target="_blank">һaƬþëƬëƬ</a>| <a href="http://www.abctoy.com.cn" target="_blank">66ƷۺϾþþþþþ</a>| <a href="http://www.yk999.cn" target="_blank">Ʒþþþþ޾Ʒ </a>| <a href="http://www.pobk.cn" target="_blank">޾þһ </a>| <a href="http://www.jiansuj.cn" target="_blank">þþƷ</a>| <a href="http://www.hzmgdj.com.cn" target="_blank">þþþþƷĻ</a>| <a href="http://www.1hkl.cn" target="_blank">Сڵþþþþ</a>| <a href="http://www.itkuo.cn" target="_blank">ҰAVþһ</a>| <a href="http://www.yc9z.com.cn" target="_blank">޹Ʒþ</a>| <a href="http://www.wrene.com.cn" target="_blank">ƷѾþ</a>| <a href="http://www.rootwiremesh.cn" target="_blank">һaƬþëƬ</a>| <a href="http://www.hbjboke.cn" target="_blank">þþþø߳ëƬȫ</a>| <a href="http://www.jrchen.cn" target="_blank">þ޹ƷAVϼ</a>| <a href="http://www.swangxinwen.cn" target="_blank">þþžžþƷ</a>| <a href="http://www.j16dr.cn" target="_blank">þñþۺ</a>| <a href="http://www.quheitou.net.cn" target="_blank">þ99Ʒþþþþò </a>| <a href="http://www.zgpojie.cn" target="_blank">wwwԾþþcom</a>| <a href="http://www.gwuq.cn" target="_blank">˾þ91</a>| <a href="http://www.hwah.cn" target="_blank">޹˾þþƷӰ </a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>