VC
文章平均质量分 73
wangsifu2009
这个作者很懒,什么都没留下…
展开
-
C运行时库详解(C Run-Time Library)
<br />运行时库是程序在运行时所需要的库文件,通常运行时库是以LIB或DLL形式提供的。C运行时库诞生于20世纪70年代,当时的程序世界还很单纯,应用程序都是单线程的,多任务或多线程机制在此时还属于新观念。所以这个时期的C运行时库都是单线程的。 <br /> 随着操作系统多线程技术的发展,最初的C运行时库无法满足程序的需求,出现了严重的问题。C运行时库使用了多个全局变量(例如errno)和静态变量,这可能在多线程程序中引起冲突。假设两个线程都同时设置errno,其结果是后设置的errno会将先前的覆盖转载 2010-10-24 14:25:00 · 640 阅读 · 0 评论 -
windows 异常处理机制
SEH 的工作原理: Windows 程序设计中最重要的理念就是消息传递,事件驱动。当GUI应用程序触发一个消息时,系统将把该消息放入消息队列,然后去查找并调用窗体的消息处理函数(CALLBACK),传递的参数当然就是这个消息。我们同样可以把异常也当作是一种消息,应用程序发生异常时就触发了该消息并告知系统。系统接收后同样会找它的“回调函数”,也就是我们的异常处理例程。当然,如果我们在程序中没有做异常处理的话,系统也不会置之不理,它将弹出我们常见的应用程序错误框,然后结束该程序。所以,当我们改原创 2010-11-09 18:48:00 · 865 阅读 · 0 评论 -
window 核心编程 (内存映射文件)
<br />1、内存映射文件<br /> <br /> 内存映射文件允许开发人员预定一块地址空间区域并给区域调拨物理存储器。<br /> 内存映射文件的物理存储器来自磁盘上已有的文件,而不是系统的页交换文件。<br /> <br /> 内存映射文件主要用于以下三种情况:<br /> (1) 系统使用内存映射文件来载入并运行.exe和动态链接库.dll文件<br /> (2) 开发人员可以用内存映射文件来访问磁盘上的数据文件。<br /> (3) 通过使用内存映射文件,我们原创 2010-11-05 21:20:00 · 654 阅读 · 0 评论 -
windows 核心编程 (内存体系结构)
<br />1、进程的虚拟地址空间<br /> <br /> 每个进程都有自己的虚拟地址空间。对于32位进程来说,这个地址空间大小为4G。<br /> 每个进程都有自己的专有地址空间,当进程中的各线程运行时,它们只能访问属于该进程的内存。线程既看不到属于其他进程的内存,也无法访问它们。<br /> <br />2、虚拟地址空间的分区<br /> <br /> 每个进程的虚拟地址空间被划分成许多分区。<br /> x86 32位windows系统进程地址空间分区:<br />原创 2010-11-05 13:30:00 · 862 阅读 · 0 评论 -
Windows 核心编程 (线程)要点
<br />1、线程的终止(ExitThread和TerminateThread的区别)<br /> <br /> ExitThread终止主调线程的运行,并导致操作系统清理该线程使用的所有操作系统资源(线程的堆栈会销毁),但是C/C++资源不会被销毁。<br /> TerminateThread能杀死任何线程,但除非拥有此线程的进程终止运行,否则系统不会销毁这个线程的堆栈。Microsoft故意以这种方式来实现TerminateThread,让被杀死的线程的堆栈保留在内存中,其它的线程就可以继原创 2010-10-29 21:50:00 · 879 阅读 · 0 评论 -
windows 核心编程 (线程调度,优先级和关联性)
<br />1、windows是抢占式多线程操作系统<br /> <br /> 系统可以在任何时刻停止一个线程而另行调度另一个线程。<br /> 我们无法保证线程总在运行,线程会获得整个处理器,系统将不允许运行其他线程。<br /> 系统只调度可调度的线程,事实上,系统大多数线程都不是可调度的。有些线程对象的挂起计数大于0,这意味着该线程已经被挂起,不应该给它调度任何CPU时间。<br /> 除了被挂起的线程外,还有其他很多线程无法调度,因为它们都在等待某种事件发生。<br />原创 2010-10-30 13:44:00 · 1103 阅读 · 0 评论 -
windows 核心编程(进程)
<br />1、进程:一个正在运行的程序的实例,它由两部分组成:<br />(1) 一个内核对象,操作系统用它来管理进程。内核对象也是系统保存进程统计信息的地方。<br />(2) 一个地址空间,其中包含所有可执行文件或DLL模块的代码和数据,此外,它还包含动态分配内存,比如线程堆栈和堆的分配。<br />2、windows应用程序必须有一个入口点函数,应用程序开始运行时,这个函数会被调用。操作系统实际并不调用我们所写的入口点函数。相反,它会调用由C/C++运行库实现并在链接时使用-entry:命令行选项来转载 2010-10-28 20:33:00 · 608 阅读 · 0 评论 -
windows 核心编程(用户模式下的线程同步)
<br />1、线程之间需要相互通信<br /> <br /> (1)需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性<br /> (2)一个线程需要通知其他线程某项任务已经完成<br /> <br />2、原子访问:Interlocked系列函数<br /> <br /> Interlocked函数时如何工作的呢?答案取决于代码运行的CPU平台。如果是X86系列CPU,那么Interlocked函数会在总线上维持一个硬件信号,这个信号会阻止其他CPU访问同一个内存地址。<br原创 2010-10-30 16:13:00 · 597 阅读 · 0 评论 -
运行时和编译时的安全性检查 /RTC
<br />RTC 表示运行时检查。RTC 有若干子选项。与 /GS 不同,/RTC 设计用于调试版本,而不用于优化代码。与 /GS 相同的是,如果您不喜欢默认对话框,可以编写自己的处理程序。<br />使用 Microsoft® Visual Studio® 调试应用程序时,RTC 对话框可以为您提供在错误发生之处调试应用程序的选项。此外,还可以在 Visual Studio 中创建若干个配置,每个配置都包含各种选项的不同组合,例如,对发布版本使用 /GS 选项,而对调试版本使用一个或多个 /RTC 选项转载 2010-10-24 22:04:00 · 698 阅读 · 0 评论 -
VC++ 6.0 编译器参数设置
<br />主要通过VC的菜单项Project->Settings->C/C++页来完成。我们可以看到这一页的最下面Project Options中的内容,一般如下:<br /><br />/nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D"_MBCS" /Fp"Debug/WritingDlgTest.pch" <br />/Yu"stdafx.h" /Fo"Debug/" /Fd"De转载 2010-10-24 20:28:00 · 897 阅读 · 0 评论 -
线程局部存储TLS
Thread local storage (TLS)统一进程的多个线程可以通过由TlsAlloc方法返回的索引值在线程自身的空间内存储和取回一个值。在以下这个例子里,索引值在进程开始时创建,当各个线程启动时,会各自申请一块动态内存并且将内存指针通过TlsSetValue方法存储到各自的TLS空间中(由先前的索引值标定)。CommonFunc方法使用TlsGetValue方法通过索引取得数据指针。在各个线程结束前,释放动态内存块。在进程结束见,调用TlsFree方法释放索引。 1#include转载 2010-10-24 16:55:00 · 435 阅读 · 0 评论 -
FormatMessage
<br /> FormatMessage函数用来格式化一个消息字符串。函数需要一个消息定义作为输入,消息定义可以来源于一个buffer,也可来源于一个加载到模块的消息表资源,或者调用者可以使用此函数来在系统消息表资源中寻找消息定义。函数基于一个消息标识和一种语言标识来从一个消息表资源中寻找消息定义。<br /> 通常,在写WINDOWS程序的时候我们会用 GetLastError()来获得错误代号,进而想要知道具体出错原因(文本描述),我们可以用 FormatMessage 函数来得到。<br原创 2010-10-24 20:41:00 · 542 阅读 · 0 评论 -
VC++ 6.0 编译器参数设置
<br />主要通过VC的菜单项Project->Settings->C/C++页来完成。我们可以看到这一页的最下面Project Options中的内容,一般如下:<br /><br />/nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D"_MBCS" /Fp"Debug/WritingDlgTest.pch" <br />/Yu"stdafx.h" /Fo"Debug/" /Fd"De转载 2010-10-24 14:32:00 · 1813 阅读 · 0 评论 -
VC Debug版本与Release版本
今天又遇到这个问题了,使用Debug版本运行时成功的,然而,使用Release版本就会出现错误。。然后你基本找不到错误在哪。。。 以前也遇到过这类问题,在网上搜索,给出的回答基本都与Rlease版本的优化有关,特别强调了DLL,如果编译DLL的话,使用Release版本出问题的可能性很大。。 算了,也只能把优化级数降低吧,看问题能不能解决。。原创 2011-06-12 14:29:00 · 493 阅读 · 0 评论