核心编程
Hustudent20080101
MFC Qt 瑞萨 ARM Linux
展开
-
消息发送 环境变量继承
当然,可以使用其他形式的进程间通信,将已继承的内核对象句柄值从父进程传送给子进程。方法之一是让父进程等待子进程完成初始化(使用第9章介绍的Wa i t F o r I n p u I d l e函数),然后,父进程可以将一条消息发送或展示在子进程中的一个线程创建的窗口中。 另一个方法是让父进程将一个环境变量添加给它的环境程序块。该变量的名字是子进程知道要查找的某种信息转载 2012-07-05 18:10:21 · 604 阅读 · 0 评论 -
3.3.3 命名对象
3.3.3 命名对象共享跨越进程边界的内核对象的第二种方法是给对象命名。许多(虽然不是全部)内核对象都是可以命名的。例如,下面的所有函数都可以创建命名的内核对象: 所有这些函数都有一个共同的最后参数p s z N a m e。当为该参数传递N U L L时,就向系统指明了想创建一个未命名的(匿名)内核对象。当创建一个未命名的对象时,可以通过使用继承性(如上一节介绍的那样)转载 2012-07-05 18:35:53 · 388 阅读 · 0 评论 -
3.3.4 终端服务器的名字空间
3.3.4 终端服务器的名字空间注意,终端服务器能够稍稍改变上面所说的情况。终端服务器拥有内核对象的多个名字空间。如果存在一个可供内核对象使用的全局名字空间,就意味着它可以供所有的客户程序会话访问。该名字空间主要供服务程序使用。此外,每个客户程序会话都有它自己的名字空间。它能防止运行相同应用程序的两个或多个会话之间出现互相干扰的情况,也就是说一个会话无法访问另一个会话的对象,尽转载 2012-07-05 19:54:03 · 557 阅读 · 0 评论 -
进程通常定义 线程
进程通常被定义为一个正在运行的程序的实例,它由两个部分组成:• 一个是操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方。• 另一个是地址空间,它包含所有可执行模块或D L L模块的代码和数据。它还包含动态内存分配的空间。如线程堆栈和堆分配空间。进程是不活泼的。若要使进程完成某项操作,它必须拥有一个在它的环境中运行的线程,该线程负责执行包含在进转载 2012-07-05 21:05:42 · 469 阅读 · 0 评论 -
用于C U I应用程序:/ S U B S Y S T E M : C O N D O L E,而用于G U I :S U B S Y S T E M : W
当使用Microsoft Visual C++来创建应用程序时,这种集成式环境安装了许多不同的链接程序开关,这样,链接程序就可以将相应的子系统嵌入产生的可执行程序。用于C U I应用程序的链接程序开关是/ S U B S Y S T E M : C O N D O L E,而用于G U I 应用程序的链接程序开关是S U B S Y S T E M : W I N D O W S。当用转载 2012-07-05 21:10:03 · 3423 阅读 · 0 评论 -
给对象命名,用这种方法来共享对象。
既然已知道如何给对象命名,那么让我们来看一看如何用这种方法来共享对象。比如说,Process A启动运行,并调用下面的函数:调用该函数能创建一个新的互斥内核对象,为它赋予名字“ J e ff M u t e x”。请注意,P r o c e s sA的句柄h M u t e x P r o c e s s A不是一个可继承的句柄,并且当你只是命名对象时,它不必是个可继承的句柄。转载 2012-07-05 19:28:53 · 757 阅读 · 0 评论 -
调用C r e a t e *函数与调用O p e n *函数之间的主要差别
按名字共享对象的另一种方法是,进程不调用C r e a t e *函数,而是调用下面显示的O p e n *函数中的某一个:注意,所有这些函数都拥有相同的原型。最后一个参数p s z N a m e用于指明内核对象的名字。不能为该参数传递N U L L,必须传递以0结尾的地址。这些函数要搜索内核对象的单个名空间,以便找出匹配的空间。如果不存在带有指定名字的内核对象,该函数返回N U转载 2012-07-05 19:35:23 · 1514 阅读 · 0 评论 -
CreateMutex GetLastError防止多个实例运行
else { // TODO: code your application's behavior here. /* CString strHello; strHello.LoadString(IDS_HELLO); cout << (LPCTSTR)strHello << endl; //*/ HANDLE h=CreateMutex(NULL,FALSE,"my13原创 2012-07-05 19:49:09 · 837 阅读 · 0 评论 -
3.3.5 复制对象句柄
3.3.5 复制对象句柄共享跨越进程边界的内核对象的最后一个方法是使用D u p l i c a t e H a n d l e函数:第3章内核对象计计39下载简单说来,该函数取出一个进程的句柄表中的项目,并将该项目拷贝到另一个进程的句柄表中。D u p l i c a t e H a n d l e函数配有若干个参数,但是实际上它是非常简单的。D u p l i c a t转载 2012-07-05 20:07:32 · 654 阅读 · 0 评论 -
D u p l i c a t e H a n d l e函数存在的奇怪现象之一是,目标进程没有得到关于新内 核对象现在可以访问它的通知
与继承性一样,D u p l i c a t e H a n d l e函数存在的奇怪现象之一是,目标进程没有得到关于新内核对象现在可以访问它的通知。因此, Process C必须以某种方式来通知Process T,它现在拥有对内核对象的访问权,并且必须使用某种形式的进程间通信方式,以便将h O b j中的句柄值传递给Process T。显然,使用命令行参数或者改变Process T的转载 2012-07-05 20:52:47 · 2826 阅读 · 0 评论 -
C / C + +运行期启动函数
操作系统实际上并不调用你编写的进入点函数。它调用的是C / C + +运行期启动函数。该函数负责对C / C + +运行期库进行初始化,这样,就可以调用m a l l o c和f r e e之类的函数。它还能够确保已经声明的任何全局对象和静态C + +对象能够在代码执行以前正确地创建。下面说明源代码中可以实现哪个进入点以及何时使用该进入点(见表4 - 1 )。链接程序负责在它连转载 2012-07-05 21:14:22 · 782 阅读 · 0 评论 -
可以在CR t0.c文件中找到这4个启动函数的代码
所有的C / C + +运行期启动函数的作用基本上都是相同的。它们的差别在于,它们究竟是处理A N S I字符串还是U n i c o d e字符串,以及它们在对C运行期库进行初始化后它们调用哪个进入点函数。Visual C++配有C运行期库的源代码。可以在CR t0.c文件中找到这4个启动函数的代码。现在将启动函数的功能归纳如下:• 检索指向新进程的完整命令行的指针。• 检索转载 2012-07-05 21:16:42 · 540 阅读 · 0 评论 -
4.1.1 进程的实例句柄
4.1.1 进程的实例句柄加载到进程地址空间的每个可执行文件或D L L文件均被赋予一个独一无二的实例句柄。可执行文件的实例作为( w ) Wi n M a i n的第一个参数h i n s t E x e来传递。对于加载资源的函数调用来说,通常都需要该句柄的值。例如,若要从可执行文件的映象来加载图标资源,需要调用下面这个函数:L o a d I c o n的第一个参数用于指明转载 2012-07-05 21:32:47 · 472 阅读 · 0 评论 -
4.1.3 进程的命令行
4.1.3 进程的命令行当一个新进程创建时,它要传递一个命令行。该命令行几乎永远不会是空的,至少用于创建新进程的可执行文件的名字是命令行上的第一个标记。但是在后面介绍C r e a t e P r o c e s s函数时我们将会看到,进程能够接收由单个字符组成的命令行,即字符串结尾处的零。当C运行期的启动代码开始运行的时候,它要检索进程的命令行,跳过可执行文件的名字,并将指向命令转载 2012-07-05 21:46:39 · 608 阅读 · 0 评论 -
GetCommandLine CommandLineToArgvW
// CmdLine.cpp : Defines the entry point for the application.//#include "stdafx.h"#include #include #include int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst原创 2012-07-06 09:47:45 · 1721 阅读 · 0 评论 -
ErrorLookUp
// Get the error code DWORD dwError = GetDlgItemInt(IDC_ERRORCODE, NULL, FALSE); HLOCAL hlocal = NULL; // Buffer that gets the error message string // Get the error code's textua转载 2012-06-27 11:08:54 · 557 阅读 · 0 评论 -
要为Windows CE开发应用程序,必须懂得U n i c o d e
2.5 Windows CE与U n i c o d eWindows CE操作系统是为小型设备开发的,这些设备的内存很小,并且不带磁盘存储器。你可能认为,由于M i c r o s o f t公司的主要目标是建立一种尽可能小的操作系统,因此它会使用A N S I作为自己的字符集。但是M i c r o s o f t公司并非鼠目寸光,他们懂得, Windows CE的设备要在世界转载 2012-06-27 19:50:19 · 1456 阅读 · 0 评论 -
Wi n E x e c和O p e n F i l e等,只是为了实现与1 6位Wi n d o w s程 序的向后兼容而存在
Windows API中的某些函数,比如Wi n E x e c和O p e n F i l e等,只是为了实现与1 6位Wi n d o w s程序的向后兼容而存在,因此,应该避免使用。应该使用对C r e a t e P r o c e s s和C r e a t e F i l e函数的调用来取代对Wi n E x e c和O p e n F i l e函数的调用。从系统内部来讲,老转载 2012-06-28 15:03:32 · 3427 阅读 · 0 评论 -
在VC6所带的stdlib.h里没有这个_countof()宏的
以对于stdlib.h里的这个_countof(),如果传递一个指针给它,编译就会失败。同时,需要指出的是,VC6对模板支持的很不好,一些复杂的模板语法就编译不了。根据我的测试,就这里所说的_countof(),在VC6里就编译不了。VC2005/2008就已经支持的很好的。所以这个_countof()是在VC2005中才提供的。在VC6所带的stdlib.h里没有这个_countof()转载 2012-06-28 16:41:50 · 1063 阅读 · 0 评论 -
详解C++版的_countof
详解C++版的_countof (2012-01-05 09:40:48)转载▼标签: 杂谈分类: VCPlusPlus本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yuanmanzheng/archive/2010/04/11/5472967.aspx在stdlib.h里有转载 2012-06-28 16:42:55 · 2290 阅读 · 0 评论 -
2.9.2 资源2.9.3 确定文本是A N S I文本还是U n i c o d e文本
2.9.2 资源当资源编译器对你的所有资源进行编译时,输出文件是资源的二进制文件。资源(字符串表、对话框模板和菜单等)中的字符串值总是写作U n i c o d e字符串。在Windows 98和Wi n d o w s2 0 0 0下,如果应用程序没有定义U N I C O D E宏,那么系统就会进行内部转换。例如,如果在编译源代码模块时没有定义U N I C O D E,调用L转载 2012-06-28 18:52:45 · 1879 阅读 · 0 评论 -
2.8 如何编写U n i c o d e源代码
2.8 如何编写U n i c o d e源代码M i c r o s o f t公司为U n i c o d e设计了Windows API,这样,可以尽量减少对你的代码的影响。实际上,你可以编写单个源代码文件,以便使用或者不使用U n i c o d e来对它进行编译。只需要定义两个宏(U N I C O D E和_ U N I C O D E),就可以修改然后重新编译该源文件。转载 2012-06-27 20:12:41 · 1529 阅读 · 0 评论 -
2.8.2 Wi n d o w s定义的U n i c o d e数据类型
Wi n d o w s头文件定义了表2 - 3列出的数据类型。表2-3 Uincode 数据类型数据类型说明W C H A R U n i c o d e字符P W S T R 指向U n i c o d e字符串的指针P C W S T R 指向一个恒定的U n i c o d e字符串的指针这些数据类型是指U n i c o d e字符和字符串。Wi n d o w转载 2012-06-27 20:45:54 · 1616 阅读 · 0 评论 -
2.1 字符集
2.1 字符集软件的本地化要解决的真正问题,实际上就是如何来处理不同的字符集。多年来,许多人一直将文本串作为一系列单字节字符来进行编码,并在结尾处放上一个零。对于我们来说,这已经成了习惯。当调用s t r l e n函数时,它在以0结尾的单字节字符数组中返回字符的数目。问题是,有些文字和书写规则(比如日文中的汉字就是个典型的例子)的字符集中的符号太多了,因此单字节(它提供的符号转载 2012-06-28 14:52:26 · 394 阅读 · 0 评论 -
Shlwapi.h的所有函数列表
下面是Shlwapi.h中的所有函数列表,注意:在使用之前一定要查询最新的MSDN,以确定哪些函数有安全隐患,因而是不被推荐使用的。String Function=====================================CharLowerWrapWCharUpperBuffWrapWChrCmpICompareStringWrapWGetAcceptLa转载 2012-06-28 15:16:24 · 1691 阅读 · 0 评论 -
Windows 2000是使用U n i c o d e从头进行开发的
2.3 Windows 2000与U n i c o d eWindows 2000是使用U n i c o d e从头进行开发的,用于创建窗口、显示文本、进行字符串操作等的所有核心函数都需要U n i c o d e字符串。如果调用任何一个Wi n d o w s函数并给它传递一个A N S I字符串,那么系统首先要将字符串转换成U n i c o d e,然后将U n i c o转载 2012-06-27 18:29:18 · 1299 阅读 · 0 评论 -
Unicode & COM
2.6 需要注意的问题下面让我们进一步明确一下“M i c r o s o f t公司对U n i c o d e支持的情况”:• Windows 2000既支持U n i c o d e,也支持A N S I,因此可以为任意一种开发应用程序。• Windows 98只支持A N S I,只能为A N S I开发应用程序。• Windows CE只支持U n i c o d e,只转载 2012-06-27 20:10:54 · 542 阅读 · 0 评论 -
UNICODE,_UNICODE
else { // TODO: code your application's behavior here. CString strHello; strHello.LoadString(IDS_HELLO); cout << (LPCTSTR)strHello << endl; TCHAR str[256]=_TEXT("HelloWorld\n"); _tprintf(原创 2012-06-27 21:20:20 · 552 阅读 · 0 评论 -
<shlwapi.h> StrCat(a1,a2);
#include "stdafx.h"#include //加这个头文件 #pragma comment(lib,"shlwapi.lib")int main(int argc, char* argv[]){ //for(int i=0;i<1000;i++) //printf("Hello World%d!\n",i); char a1[100]="Hell原创 2012-06-28 15:30:57 · 767 阅读 · 0 评论 -
2.9 成为符合A N S I和U n i c o d e的应用程序
2.9 成为符合A N S I和U n i c o d e的应用程序即使你不打算立即使用U n i c o d e,最好也应该着手将你的应用程序转换成符合U n i c o d e的应用程序。下面是应该遵循的一些基本原则:• 将文本串视为字符数组,而不是c h a r s数组或字节数组。• 将通用数据类型(如T C H A R和P T S T R)用于文本字符和字符串。• 将显转载 2012-06-28 15:55:22 · 1356 阅读 · 0 评论 -
Wi n d o w s函数l s t r c m p和l s t r c m p i是作为对Wi n d o w s函数 C o m p a r e S t r i n g的调用来实现
有两个字符串函数,即l s t r c m p和l s t r c m p i,它们的行为特性与等价的C运行期函数是不同的。C运行期函数s t r c m p、s t r c m p i、w c s c m p和w c s c m p i只是对字符串中的代码点的值进行比较,这就是说,这些函数将忽略实际字符的含义,只是将第一个字符串中的每个字符的数值与第二个字符串中的字符的数值进行比较。转载 2012-06-28 16:21:24 · 5851 阅读 · 0 评论 -
Watch窗口中的一行,并键入 “@err,hr”
Microsoft的调试程序支持一个非常有用的特性,即可以配置Watch窗口,以便始终都能显示线程的最后错误代码的号码和该错误的英文描述。通过选定Watch窗口中的一行,并键入“@err,hr”,就能够做到这一点。观察图1-1,你会看到已经调用了CreateFile函数。该函数返回INVALIDHANDLEVALUE(-1)的HANDLE,表示它未能打开指定的文件。但是Watch窗口转载 2012-07-11 10:12:52 · 558 阅读 · 0 评论 -
2.8.4 Wi n d o w s字符串函数
2.8.4 Wi n d o w s字符串函数Wi n d o w s还提供了一组范围很广的字符串操作函数。这些函数与C运行期字符串函数(如s t r c p y和w c s c p y)很相似。但是该操作系统函数是操作系统的一个组成部分,操作系统的许多组件都使用这些函数,而不使用C运行期库。建议最好使用操作系统函数,而不要使用C运行期字符串函数。这将有助于稍稍提高你的应用程序的运转载 2012-06-28 15:13:51 · 1229 阅读 · 0 评论 -
shlwapi.h所包含的函数
1. 加入#include .2. 在project(工程)->setting(设置)->link(连接)下objiect/library modules(对象/库模块)中加入shlwapi.lib.PathAddBackslash //路径后添加反斜杆 CString.GetBuffer(_MAX_PATH)PathAddExtension /转载 2012-06-28 15:24:48 · 899 阅读 · 0 评论 -
StrCat <shlwapi.h> strcat <string.h> wcscat <string.h>
StrCat Function -------------------------------------------------------------------------------- Appends one string to another. Syntax LPTSTR StrCat( LP转载 2012-06-28 15:33:22 · 609 阅读 · 0 评论 -
除了内核对象外,你的应用程序也可以使用其他类型的对象
除了内核对象外,你的应用程序也可以使用其他类型的对象,如菜单、窗口、鼠标光标、刷子和字体等。这些对象属于用户对象或图形设备接口( G D I)对象,而不是内核对象。当初次着手为Wi n d o w s编程时,如果想要将用户对象或G D I对象与内核对象区分开来,你一定会感到不知所措。比如,图标究竟是用户对象还是内核对象呢?若要确定一个对象是否属于内核对象,最容易的方法是观察创建该对转载 2012-06-29 09:17:56 · 614 阅读 · 0 评论 -
3.2 进程的内核对象句柄表
3.2 进程的内核对象句柄表当一个进程被初始化时,系统要为它分配一个句柄表。该句柄表只用于内核对象,不用于用户对象或G D I对象。句柄表的详细结构和管理方法并没有具体的资料说明。通常我并不介绍操作系统中没有文档资料的那些部分。不过,在这种情况下,我会进行例外处理,因为,作为一个称职的Wi n d o w s程序员,必须懂得如何管理进程的句柄表。由于这些信息没有文档资料,因此不转载 2012-06-29 09:27:56 · 519 阅读 · 0 评论 -
3.3 跨越进程边界共享内核对象
3.3 跨越进程边界共享内核对象许多情况下,在不同进程中运行的线程需要共享内核对象。下面是为何需要共享的原因:• 文件映射对象使你能够在同一台机器上运行的两个进程之间共享数据块。• 邮箱和指定的管道使得应用程序能够在连网的不同机器上运行的进程之间发送数据块。• 互斥对象、信标和事件使得不同进程中的线程能够同步它们的连续运行,这与一个应用程序在完成某项任务时需要将情况通知另一个应转载 2012-06-29 10:06:50 · 473 阅读 · 0 评论 -
3.3.1 对象句柄的继承性
3.3.1 对象句柄的继承性只有当进程具有父子关系时,才能使用对象句柄的继承性。在这种情况下,父进程可以使用一个或多个内核对象句柄,并且该父进程可以决定生成一个子进程,为子进程赋予对父进程的内核对象的访问权。若要使这种类型的继承性能够实现,父进程必须执行若干个操作步骤。首先,当父进程创建内核对象时,必须向系统指明,它希望对象的句柄是个可继承的句柄。请记住,虽然内核对象句柄具有继转载 2012-06-29 10:09:38 · 537 阅读 · 0 评论 -
C r e a t e P r o c e s s的b I n h e r i t H a n d l e s参数
使用对象句柄继承性时要执行的下一个步骤是让父进程生成子进程。这要使用C r e a t eP r o c e s s函数来完成:下一章将详细介绍这个函数的用法,不过现在我想要让你注意b I n h e r i t H a n d l e这个参数。一般来说,当生成一个进程时,将为该参数传递FA L S E。该值告诉系统,不希望子进程继承父进程的句柄表中的可继承句柄。但是,转载 2012-06-29 10:23:30 · 4472 阅读 · 0 评论