windows编程
文章平均质量分 59
vsooda
这个作者很懒,什么都没留下…
展开
-
【问题解决】在C#中使用C++编写的类 使用托管c++(managed c++)
现在在Windows下的应用程序开发,VS.Net占据了绝大多数的份额。因此很多以前搞VC++开发的人都转向用更强大的VS.Net。在这种情况下,有很多开发人员就面临了如何在C#中使用C++开发好的类的问题。下面就用一个完整的实例来详细说明怎样用托管C++封装一个C++类以提供给C#使用。 比如,现在有一个工程名为NativeCppDll的由C++编写的DLL,里面输出了一个CPerso转载 2013-05-08 15:47:52 · 1289 阅读 · 0 评论 -
十四、探索虚拟内存
GetSystemInfoGlobalMemoryStatus 虚拟内存状态非统一内存访问(numa),机器中的cpu既能访问自己节点的内存,也能反问其它结点的内存。工作集; 我们把一个进程的地址空间中被保存在内存里的那些页面称为工作集。 getprocessMemeroinfovirtualQuery太粗略,未完待续。。。原创 2013-05-30 16:06:07 · 795 阅读 · 0 评论 -
十五、在应用程序中使用虚拟内存
windows提供一下三种机制来对内存进行操控:虚拟内存:最适合用来管理大型对象数组或大型结构数组内存映射文件: 最适合用来管理大型数据流,以及在同一机器上多个进程共享数据(17章)堆:最适合用来管理大量的小型对象windows提供了一些用来操控虚拟内存的函数,我们可以通过这些函数直接预定地址空间区域,给区域调拨(来自页交换文件的 )物理存储器。以及根据自己的需要来设置页面的保护属原创 2013-05-30 16:41:59 · 1043 阅读 · 0 评论 -
六、 线程
1. 线程 = 线程内核对象 + 线程栈 线程栈用于维护线程执行时所需的所有函数参数和局部变量2. 线程共享同一地址空间,线程共享内核对象句柄,因为句柄表是针对每一个进程的而不是针对线程的。3. 进程所使用的系统资源更多。其原因在于地址空间。(为一个进程创建一个虚拟的地址空间需要大量的系统资源,系统中会发生大量的记录活动,而这需要大量的内存)4. 所有窗口应该由同一个线程创原创 2013-05-30 10:49:15 · 830 阅读 · 0 评论 -
九、用内核对象进行同步
信号,互斥量,事件,可等待计时器1. 关键段只能对同一进程的线程进行同步,且无法设置最长等待时间,所以容易死锁。 使用内核对象的唯一缺点是它们的性能。调用本章的函数,线程都需要从用户模式切换到内核模式。 内核对象状态:触发signaled,未触发 nosignaled 为了理解,可以把内核对象当作旗帜,触发,旗帜升起,未触发,旗帜降下。当线程等待的对象处于未原创 2013-05-30 13:52:59 · 868 阅读 · 0 评论 -
十三、windows内存体系结构
1. 内核模式分区。 这一分区是操作系统代码的驻地。与线程调度,内存管理,文件系统支持,网络支持以及设备驱动程序相关的代码都载入该分区。驻留在这一分区的任何东西都为所有进程所用。受保护。如果一个应用程序试图读取或写入位于这一分区中的内存地址,会引发访问违规。2. 当系统创建一个内存并赋予它地址空间时,可用地址空间中的大部分都是闲置的或者尚未分配的。为了使用这部分地址空间,我们必须调用virtu原创 2013-05-30 16:02:45 · 1575 阅读 · 0 评论 -
在mfc程序中,打开控制台窗口的方法
在OnInitDialog函数返回之前加入,就可以观察控制台输出。AllocConsole();freopen("CONOUT$", "a+", stdout);原创 2013-05-30 15:36:37 · 7135 阅读 · 0 评论 -
多线程问题及面试题目
主要来自morewindows博客。1.主线程创建子线程并传入一个指向变量地址的指针作参数,由于线程启动须要花费一定的时间,所以在子线程根据这个指针访问并保存数据前,主线程应等待子线程保存完毕后才能改动该参数并启动下一个线程。这涉及到主线程与子线程之间的同步。(线程保存的编号可能被修改,于是线程编号就可能出现了重复的情况)2.子线程之间会互斥的改动和输出全局变量。要求全局变量的原创 2013-06-01 20:17:42 · 1237 阅读 · 0 评论 -
关于可变参数(不定参数),以及windows下将进程的cpu,内存统计信息写到日志
单纯的写日志,没必要使用可变参数,但是不利于封装,代码难看,今天研究了一下可变参数先查看手册:http://www.cplusplus.com/reference/cstdio/vsprintf/?kw=vsprintf functionvsprintfint vsprintf (char * s, const char * format, va_lis原创 2013-07-18 10:30:07 · 1836 阅读 · 0 评论 -
八、 用户模式下的线程同步
1. 在一下两种基本情况下,线程之间需要相互通信: (1). 需要让多个线程同时访问一个共享资源,同时不能破环资源的完整性 (2) . 一个线程需要通知其他线程某些任务已完成。2. 原子访问。 Interlocked 系列函数 Iterlocked在x86的实现方式: Interlocked会在总线上维持一个硬件信号,这个信号会阻止其他cpu访问同一内存地址原创 2013-05-30 11:28:13 · 967 阅读 · 0 评论 -
五、 作业
1. 想结束一个进程及其子进程在windows下很难,因为windows没有维护进程间的父子关系2. windows 提供一个作业内核对象,它允许我们将进程组合在一起并创建一个“沙箱”, 来限制进程能做什么3. 只有在作业中的所有进程都已终止运行之后,才会自动销毁4. 作业的cpu时间使用完,会杀死作业的所有进程待细化。。原创 2013-05-30 10:32:47 · 813 阅读 · 0 评论 -
【自定义控件】让你的控件也具有拖拽(drag-and-drop)功能 详细版
转自: 现在有很多软件都支持拖拽功能,就是用鼠标拖着文件放到软件窗口中某个位置,软件就可以做出相应的反应。比如,Windows自带的播放软件Windows Media Player,你可以拖着一个媒体文件放到它的主窗口中,它就会开始播放这个文件。 怎么让自己的软件也有这个功能呢? 其实,并不是很难,只要让你需要有拖拽功能的控件响应WM_DROPFILES消息就行了。下面转载 2013-05-08 20:41:48 · 3984 阅读 · 0 评论 -
【材料整理】VC 树形控件 例子及相关知识
转自:http://www.vckbase.com/index.php/wv/1352首先,我们要创建一个基本对话框的MFC工程MFC_TreeCRTL(名字随便给一个)。然后在资源视图中插入两个Dialog,ID分别为IDD_DIALOG11和IDD_DIALOG211,都更改Style属性为Child,Border属性为None,为它们建立两个类,分别命名为Cdialog11和Cdialo转载 2013-05-09 10:21:05 · 3745 阅读 · 2 评论 -
屏蔽控制台应用程序的窗口 #pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")
众所周知,控制台应用程序一般都会显示一个控制台窗口(虚拟DOS窗口),但很多时候控制台程序的执行逻辑根本不需要与用户进行交互,所以显示这个难看的窗口纯属多余,那么如何将它屏蔽掉呢?下面我向大家介绍一种方法。 操作系统装载应用程序后,做完初始化工作就转到程序的入口点执行。程序的默认入口点实际上是由连接程序设置的,不同的连接器选择的入口函数也不尽相 同。在VC下,连接器对控制台程序设置的入口函数转载 2013-05-13 16:14:30 · 1562 阅读 · 0 评论 -
Windows内存管理
转自:http://www.2cto.com/os/201107/95812.html本文主要内容:1.基本概念:物理内存、虚拟内存;物理地址、虚拟地址、逻辑地址;页目录,页表2.Windows内存管理3.CPU段式内存管理4.CPU页式内存管理 一、基本概念1. 两个内存概念物理内存:人尽皆知,就是插在主板上的内存条。他是固定的,内存条的容量多大,物理内存转载 2013-05-28 19:04:58 · 2062 阅读 · 2 评论 -
全面介绍Windows内存管理机制及C++内存分配实例
转自:http://blog.csdn.net/yeming81/article/details/2046193本文基本上是windows via c/c++上的内容,笔记做得不错。。本文背景:在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用;根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制。本文目转载 2013-05-30 09:44:10 · 30068 阅读 · 2 评论 -
windows via c/c++ 三. 内核对象
1. 内核对象都只是一个内存块,它由操作系统内核分配,并只能由操作系统内核访问,这个内存块是一个数据结构,其成员维护着与对象相关的信息。2. 调用一个创建内核对象的函数后,函数会返回一个句柄,它标识所创建的对象。这些句柄是进程相关的,无法直接在另一个进程通过句柄值调用。3. 内核对象在创建时,通常要指定其安全性,可以据此判定内核对象4. 进程终止时,系统能保证一切都被正确清除。5.原创 2013-05-30 10:12:43 · 1438 阅读 · 0 评论 -
四、进程
1. 进程 = 一个内核对象 + 一个地址空间2. 进程的实际执行者是线程 cpu调度的也是线程。 进程是最有惰性的,进程从来不执行任何东西,它只是一个线程的容器。3. hInstanceExe的实际值是一个内存基地址, 系统将可执行文件的映像加载到进程地址空间的这个位置。vs的基地址通常是0x00400000。 GetModuleHandle返回可执行文件或者dll文件映像加载到原创 2013-05-30 10:29:31 · 805 阅读 · 0 评论 -
七、线程调度优先级和关联性
1. 线程切换 --> 上下文切换2. 抢占式调度,很多线程无法调度。因为他们都在等待某种事情发生 p1663. 挂起和恢复 suspendThread 挂起 ResumeThread 恢复 对挂起进行计数,例如一个线程被挂起三次,则需要回复三次才能被调度。 在实际开发中,使用suspendThread要小心,若挂起一个正在堆中分配内存的线程,会导致其它线程不能原创 2013-05-30 11:05:28 · 1043 阅读 · 0 评论 -
十、同步设备I/O与异步设备I/O(I/O完成端口)
I/O完成端口是一种有无数用途的绝佳的线程间通信机制1. 打开和关闭设备 设备:能够与之进行通信的任何东西 createFile可以打开很多设备 缓存,标志2. 使用文件设备设置文件指针位置以及如何改变文件大小每个文件内核对象都有自己的文件指针如何追加内容到文件结尾,如何写入。3. 执行同步设备I/OreadFile writeFile原创 2013-05-30 15:25:50 · 1143 阅读 · 0 评论