win32-OS
神牛BB
精湛技术狂
展开
-
DLL动态链接库的工作原理
"动态链接"这几字指明了DLLs是如何工作的。对于常规的函数库,链接器从中拷贝它需要的所有库函数,并把确切的函数地址传送给调用这些函数的程序。而对于DLLs,函数储存在一个独立的动态链接库文件中。在创建Windows程序时,链接过程并不把DLLs文件链接到程序上。直到程 序运行并调用一个DLLs中的函数时,该程序才要求这个函数的地址。此时Windows才在DLLs中寻找被调用函数,并把它的转载 2015-02-28 17:28:33 · 699 阅读 · 0 评论 -
dll和exe的共享节------多进程共享dll/exe全局变量
我们都知道同一个应用程序的多个实例之间并不会影响各自的变量,虽然他们的地址空间都是被该应用程序的映像内的物理存储器所提交,他们的数据和代码都是指向了该应用程序的映像,但是他们还是不会影响各自的变量,因为采取了copy-on-write机制,当有一个实例去修改共享的那个数据区的时候,那么操作系统会另外分配一个内存块,该内存块就是存放这个实例修改的数据,所以并不会影响其他的应用程序实例。那么可转载 2015-02-28 17:42:56 · 434 阅读 · 0 评论 -
如何编写线程安全的DLL
在我的工作中经常会编写DLL,这些DLL有个共同的特点就是都有一个初始化函数,一个资源释放函数,其他几个函数都是核心功能函数。而且这些DLL有时会被多个进程同时调用,这就牵扯到多进程的多线程调用DLL的问题。有点绕口,以下我根据我实践中遇到的问题,分四种情况分享一下我解决此类问题的经验:1、动态库只有一个导出函数。这种情况非常少,也是最容易处理的情况。这种情况下编写函数时,只需要考转载 2015-02-28 18:05:50 · 464 阅读 · 0 评论 -
DLL入门浅析 - 多进程加载DLL内存模型
DLL入门浅析(5)——使用DLL在进程间共享数据 在Win16环境中,DLL的全局数据对每个载入它的进程来说都是相同的,因为所有的进程用的都收同一块地址空间;而在Win32环境中,情况却发生了变化,每个进程都有了它自己的地址空间,DLL函数中的代码所创建的任何对象(包括变量)都归调用它的进程所有。当进程在载入DLL时,操作系统自动把DLL地址映射到该进程的私有空间,也就是转载 2015-02-28 17:52:07 · 2393 阅读 · 0 评论 -
C++多线程安全类的问题
我们是多么渴望各种C++类都是多线程安全的,然而一旦涉及到对象间的交互,这样的渴望可能就只能是奢望了。下面,我们以设计一个双向链结点为例,看看要使其多线程安全将会带来一些什么问题。class DoublyLinedNode{ DoublyLinedNode* pPrevNode_; DoublyLinedNode* pNextNode_; public:转载 2015-02-28 18:22:59 · 6126 阅读 · 0 评论 -
Windows数字签名
数字签名(代码签名)流程出处:http://www.cnblogs.com/itech/archive/2011/07/21/2110924.htmlAuthenticode : 这里翻译为数字认证代码。 code sign : 字面的翻译为代码签名,但是通常的我们称为数字签名,以下的文中均称为数字签名。一 数字认证码如果你是软件开发人员,你可能转载 2015-02-15 11:02:18 · 794 阅读 · 0 评论 -
Windows内存管理
本文主要内容:1.基本概念:物理内存、虚拟内存;物理地址、虚拟地址、逻辑地址;页目录,页表2.Windows内存管理3.CPU段式内存管理4.CPU页式内存管理 一、基本概念1. 两个内存概念物理内存:人尽皆知,就是插在主板上的内存条。他是固定的,内存条的容量多大,物理内存就有多大(集成显卡系统除外)。但是如果程序运行很多或者程序本身很大的话,就会导致大量的物理内存转载 2015-03-01 18:02:04 · 768 阅读 · 0 评论 -
windows进程中的内存结构
windows进程中的内存结构在阅读本文之前,如果你连堆栈是什么多不知道的话,请先阅读文章后面的基础知识。 接触过编程的人都知道,高级语言都能通过变量名来访问内存中的数据。那么这些变量在内存中是如何存放的呢?程序又是如何使用这些变量的呢?下面就会对此进行深入的讨论。下文中的C语言代码如没有特别声明,默认都使用VC编译的release版。 首先,来了解一下 C 语言的变量是如转载 2015-03-05 21:38:01 · 651 阅读 · 0 评论 -
多线程 - CreateThread与_beginthreadex本质区别
本文将带领你与多线程作第一次亲密接触,并深入分析CreateThread与_beginthreadex的本质区别,相信阅读本文后你能轻松的使用多线程并能流畅准确的回答CreateThread与_beginthreadex到底有什么区别,在实际的编程中到底应该使用CreateThread还是_beginthreadex? 使用多线程其实是非常容易的,下面这个程序的主线程会创建了转载 2015-03-12 22:45:37 · 470 阅读 · 0 评论 -
DLL-LoadLibrary函数
加载指定的模块到调用进程的地址空间。指定的模块可能导致被装载的其它模块。有关其他加载选项,使用 函数LoadLibraryEx函数。句法C ++HMODULE WINAPI调用LoadLibrary( _In_ LPCTSTR lpFileName的对象);参数lpFileName的对象转载 2015-03-12 21:51:53 · 5104 阅读 · 0 评论 -
DLL-多个进程间共享动态链接库的原理
同样这个问题是我在面试总监的时候,总监问我的一个问题,这些天一直 忙活,都没有好好看书了,今天总结一下这个问题?为什么一个进程用完一个动态链接库以后另一个进程还可以继续使用呢?当时回答的很是笼统,只说对了答案的一半,现在就在这里好好总结一下吧!前面我们已经说过进程间的通信有好几种方式,其实现在我们讲的这种动态链接库也是进程间的通信方式之一。不管是windows还是Linux操作系统其实所有转载 2015-03-12 21:09:03 · 1510 阅读 · 0 评论 -
编写的windows程序,崩溃时产生crash dump文件的办法
一、引言dump文件是C++程序发生异常时,保存当时程序运行状态的文件,是调试异常程序重要的方法,所以程序崩溃时,除了日志文件,dump文件便成了我们查找错误的最后一根救命的稻草。windows程序产生dump文件和linux程序产生dump文件的方式不一样,linux默认是不让产生core dump文件,只要在用户自己的~/.bash_profile文件中增加ulimit -S转载 2015-07-28 08:37:39 · 737 阅读 · 0 评论 -
PDB文件:每个开发人员都必须知道的
PDB Files: What Every Developer Must Knowhttp://www.wintellect.com/CS/blogs/jrobbins/archive/2009/05/11/pdb-files-what-every-developer-must-know.aspx PDB文件:每个开发人员都必须知道的 一 什么是PDB文件大部分的开转载 2015-07-28 21:51:01 · 383 阅读 · 0 评论 -
Dump文件
Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中。Dump文件是用来给驱动程序编写人员调试驱动程序用的,这种文件必须用专用工具软件打开,比如使用WinDbg打开。在Windbg中可以通过.dump命令保存进程的dump文件。比如下面的命令把当前进程的镜像保存为c:\testdump.dmp文件:.dump /ma C:\tes转载 2015-07-28 22:01:27 · 554 阅读 · 0 评论 -
多线程同步(C++)event
上一篇中使用关键段来解决经典的多线程同步互斥问题,由于关键段的“线程所有权”特性所以关键段只能用于线程的互斥而不能用于同步。本篇介绍用事件Event来尝试解决这个线程同步问题。首先介绍下如何使用事件。事件Event实际上是个内核对象,它的使用非常方便。下面列出一些常用的函数。 第一个 CreateEvent函数功能:创建事件函数原型:HANDLECr转载 2015-02-12 19:58:33 · 739 阅读 · 0 评论 -
多线程同步 -原子操作 (Interlocked系列函数)
上一篇《多线程第一次亲密接触 CreateThread与_beginthreadex本质区别》中讲到一个多线程报数功能。为了描述方便和代码简洁起见,我们可以只输出最后的报数结果来观察程序是否运行出错。这也非常类似于统计一个网站每天有多少用户登录,每个用户登录用一个线程模拟,线程运行时会将一个表示计数的变量递增。程序在最后输出计数的值表示有今天多少个用户登录,如果这个值不等于我们启动的线程个数,那显转载 2015-02-12 14:41:12 · 1512 阅读 · 0 评论 -
多线程同步(C++)C/C++ Runtime函数使用
一 、简单实例(来自codeprojct:http://www.codeproject.com/useritems/MultithreadingTutorial.asp)主线程创建2个线程t1和t2,创建时2个线程就被挂起,后来调用ResumeThread恢复2个线程,是其开始执行,调用WaitForSingleObject等待2个线程执行完,然后推出主线程即结束进程。Runtime函转载 2015-02-12 11:02:38 · 1290 阅读 · 1 评论 -
windows 消息机制、窗口过程与线程间消息传递
按照自己的理解好好整理一遍消息机制windows是一个消息驱动的系统,会有一个总的系统消息的队列,鼠标、键盘等等都会流入到这个队列中,同时会为每个线程维护一个消息队列(注意默认是有GUI调用的线程才有,对于没有GUI或者窗口的线程,只有当在线程内调用get/peek message 才会自动创建一个消息队列),线程是容纳消息队列的基本单元,系统会把属于不同线程的消息投递转载 2015-02-03 16:44:30 · 744 阅读 · 0 评论 -
UI线程和windows消息队列机制
操作系统有一个系统消息队列,另外会为每一个UI线程创建一个消息队列。用户操作时,操作系统判断出当前操作是发生在哪个窗体组件对象,生成一条消息,先将其放在系统消息队列中,再分发到创建该组件对象的UI线程的消息队列中。UI线程中需要一个消息循环,不断从它自己的消息队列读取消息,并对取出的消息进行处理。 (猜测,待考证)java中,swing或awt对象包含了一个消息转载 2015-02-03 20:19:39 · 752 阅读 · 0 评论 -
windows消息分发机制
在TObject类中,有一个Dispatch()方法和一个DefaultHandler()方法,它们都是与消息分发机制相关的。Dispatch()负责将特定的消息分发给合适的消息处理函数。首先它会在对象本身类型的类中寻找该消息的处理函数,如果找到,则调用它;如果没有找到而该类覆盖了TObject的DefaultHandler(),则调用该类的DefaultHandler();如果两者都不存在,则继转载 2015-02-03 21:35:51 · 551 阅读 · 0 评论 -
深入解析SendMessage、PostMessage
本文将使用C++语言,在MFC框架的配合下给出PostMessage、SendMessage等的使用方式与使用不当造成的后果(讨论均针对自定义的消息进行)。如有什么错误,欢迎指正。 写过Windows程序的同学都知道PostMessage、SendMessage的区别,PostMessage函数调用发送之后,立即返回,不等待消息处理完成。而SendMessage则让调用的线程处于阻塞(BL转载 2015-02-03 21:18:11 · 387 阅读 · 0 评论 -
SendMessage、PostMessage原理
SendMessage、PostMessage原理本文讲解SendMessage、PostMessage两个函数的实现原理,分为三个步骤进行讲解,分别适合初级、中级、高级程序员进行理解,三个步骤分别为:1、SendMessage、PostMessage的运行机制。2、SendMessage、PostMessage的运行内幕。3、SendMessage、PostMessage的内部实转载 2015-02-03 20:39:35 · 430 阅读 · 0 评论 -
进程间通信 - 命名管道实现
引子好,到这里呢,就需要介绍实现进程间通信的第四种方式了,也就是通过命名管道来实现,前面介绍的那三种方式呢,都是有缺陷或者说局限性太强,而这里介绍的命名管道相对来说,在这方面就做得好很多了,比如,剪贴板的话只能实现本机上进程之间的通信,而邮槽的话虽然是可以实现跨网络之间的进程的通信,但麻烦的是邮槽的服务端只能接收数据,邮槽的客户端只能发送数据,太悲剧转载 2015-01-20 16:33:40 · 538 阅读 · 0 评论 -
进程概述及创建,终止(VC_Win32)
目录进程概述创建进程函数详解进程的创建进程的终止进程总体执行流程进程线程优先级进程通信(本章节中例子都是用 VS2005 编译调试的)进程概述进程定义:通常被定义为一个正在运行的程序实例,是一个程序在其自身的地址空间中的一次执行活动程序相关描述:定义: 计算机指令集合,它以文件的形式存储在磁盘上与进程转载 2015-01-22 10:18:29 · 576 阅读 · 0 评论 -
多线程同步-临界区(深入理解CRITICAL_SECTION)
深入理解CRITICAL_SECTION临界区是一种防止多个线程同时执行一个特定代码节的机制,这一主题并没有引起太多关注,因而人们未能对其深刻理解。在需要跟踪代码中的多线程处理的性能时,对 Windows 中临界区的深刻理解非常有用。本文深入研究临界区的原理,以揭示在查找死锁和确认性能问题过程中的有用信息。它还包含一个便利的实用工具程序,可以显示所有临界区及其当前状态。转载 2015-02-10 18:09:05 · 10207 阅读 · 0 评论 -
多线程同步 - 同步方法列表
转自:http://anwj336.blog.163.com/blog/static/89415209201010173049365/线程的同步Critical section(临界区)用来实现“排他性占有”。适用范围是单一进程的各线程之间。它是:· 一个局部性对象,不是一个核心对象。· 快速而有效率。· 不能转载 2015-02-10 17:16:53 · 723 阅读 · 0 评论 -
多线程同步 -(C++)主要函数
一、多线程的概述 进程和线程都是操作系统的概念。进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。 线程是进程内部的一个执行单元。系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数地址形式,比如说main或WinMain函数转载 2015-02-12 10:41:42 · 638 阅读 · 0 评论 -
多线程同步(C++)WIN API
一、 简单实例比较简单的代码,创建10个线程,其中使第4个线程在一创建就挂起,等到其他的线程执行的差不多的时候再使第4个线程恢复执行API" title="多线程(C++)WIN API" style="margin:0px; padding:0px; border:0px; list-style:none">#include stdio.h> API" title="多线程(C+转载 2015-02-12 10:46:11 · 463 阅读 · 0 评论 -
WaitForSingleObject 和 WaitForMultipleObjects函数 (让线程挂起等待事件)
WaitForSingleObject 和 WaitForMultipleObjects:1.WaitForSingleObject 等待函数可使线程自愿进入等待状态,直到一个特定的内核对象变为已通知状态为止。这些等待函数中最常用的是WaitForSingleObject: DWORD WaitForSingleObject(HANDLE hObject, DWORD dwMil转载 2015-02-11 16:09:30 · 2630 阅读 · 0 评论 -
多线程同步-信号量(深入理解Semaphore)
多线程同步之Semaphore (主要解决生产者消费者问题)一 信标Semaphore信标内核对象用于对资源进行计数。它们与所有内核对象一样,包含一个使用数量,但是它们也包含另外两个带符号的3 2位值,一个是最大资源数量,一个是当前资源数量。最大资源数量用于标识信标能够控制的资源的最大数量,而当前资源数量则用于标识当前可以使用的资源的数量。为了正确地说明这个问题,让我们来看一看转载 2015-02-11 21:43:47 · 2298 阅读 · 0 评论 -
多线程同步-互斥对象(深入理解Mutex)
多线程之线程同步Mutex (功能与Critial Sections相同,但是属于内核对象,访问速度较慢,可以被不同进程调用)一 Mutex 互斥对象(mutex)内核对象能够确保线程拥有对单个资源的互斥访问权。实际上互斥对象是因此而得名的。互斥对象包含一个使用数量,一个线程ID和一个递归计数器。 互斥对象的行为特性与关键代码段相同,但是互斥对象属于内核对象,而关键代码转载 2015-02-11 15:54:25 · 3358 阅读 · 0 评论 -
Windows文件操作的API函数[转载]
在VC中,大多数情况对文件的操作都使用系统提供的 API 函数,但有的函数我们不是很熟悉,以下提供一些文件操作 API 函数介绍: 一般文件操作 API CreateFile 打开文件 要对文件进行读写等操作,首先必须获得文件句柄,通过该函数可以获得文件句柄,该函数是通向文件世界的大门。 ReadFile 从文件中读取字节信息。 在打开文件获得了文件句柄之后转载 2015-07-28 22:28:24 · 546 阅读 · 0 评论