摘要:本文以USB存储设备为例,讲解对内核函数的直接挂钩 简介 有时在开发中,会遇到这样一种情况,当非常需要对某些内核函数进行挂钩时,而常规基于PE的挂钩,往往达不到目的。在本文中将要探讨的,是怎样直接挂钩内核函数,另外,在示例中,还要演示在系统中显示为一个基本磁盘的可移动USB存储设备,并在其上创建及管理多个分区(因为这样或那样的原因,Windows既不允许,也不能识别可移动存储设备上的多个分区,所以我们要“欺骗”一下系统)。因为本文中的示例只用作演示目的,所以只对一个函数进行了挂钩,但可对文中阐述的方法进行扩展,以处理多个函数(例如,工程中可能需要直接挂钩好几个NDIS库中的函数)。再者,你应该
阅读全文
01 2011 档案
摘要:相信大多数的程序员或用户,在Windows中见到类似于下面的亲切而又温馨的提示信息,都不会感到陌生:“XXX执行了非法操作,将被关闭。要终止程序,请单击确定;要调试程序,请单击取消。”或者,“是否向Microsoft发送错误报告?发送,不发送。”如果这个程序运行在无人值守、需要保持连续工作状态的场合,而其中的bug又一时难以排除,就需要采取应急措施,消除或减少程序出错造成的影响。本文讨论解决这个问题的办法。做过一定硬件开发的人都知道,恶劣的工作环境,带有缺陷的硬件设计,不完善的算法等内外因素,都可能造成程序“跑飞”,因此专门加装一个“看门狗”,负责监视程序主体,必要时产生复位中
阅读全文
摘要:我们知道,在NT/2K/XP中,操作系统利用虚拟内存管理技术来维护地址空间映像,每个进程分配一个4GB的虚拟地址空间。运行在用户态的应用程序,不能直接访问物理内存地址;而运行在核心态的驱动程序,能将虚拟地址空间映射为物理地址空间,从而访问物理内存地址。如果要在应用程序中以物理地址方式访问内存,自然而然的办法,是编写一个专用的驱动程序(如大家熟悉的WinIO),里面设置一定的IOCTL码,应用程序通过调用DeviceIoCtrol()来实现这样的功能。那么,有没有一种方法,省去编写专用驱动程序这一步,很方便地就能访问物理内存呢?答案是肯定的。实际上,微软早就给我们准备好了一套办法,只是他们秘而不
阅读全文
摘要:在Windows NT/2K/XP中,直接用CreateFile打开名称类似于"\\.\A:"的”文件”,就可以与设备驱动打交道,通过ReadFile/WriteFile以绝对地址方式访问磁盘了。但Windows 9X不支持这样的简单方法。本文介绍一种在Windows 9X中实现磁盘直接访问的方法:利用系统的vwin32.vxd,通过DeviceIoControl调用DOS INT21 7305H与440DH功能来完成。该调用支持FAT12、FAT16和FAT32,适用于Windows 95 SR2以及更高版本。 先来了解一下DOS INT21 7305H功能的入口参数: AX -- 功能号7
阅读全文
摘要:Q 在NT/2000/XP中,如何读取CMOS数据? Q 在NT/2000/XP中,如何控制speaker发声? Q 在NT/2000/XP中,如何直接访问物理端口? A 看似小小问题,难倒多少好汉!NT/2000/XP从安全性、可靠性、稳定性上考虑,应用程序和操作系统是分开的,操作系统代码运行在核心态,有权访问系统数据和硬件,能执行特权指令;应用程序运行在用户态,能够使用的接口和访问系统数据的权限都受到严格限制。当用户程序调用系统服务时,处理器捕获该调用,然后把调用的线程切换到核心态。当系统服务完成后,操作系统将线程描述表切换回用户态,调用者继续运行。 想在用户态应用程序中实现I/O读写,直
阅读全文
摘要:Q 前几次我们讨论的都是设备名比较清楚的情况,有了设备名(路径),就可以直接调用CreateFile打开设备,进行它所支持的I/O操作了。如果事先并不能确切知道设备名,如何去访问设备呢? A 访问设备必须用设备句柄,而得到设备句柄必须知道设备路径,这个套路以你我之力是改变不了的。每个设备都有它所属类型的GUID,我们顺着这个GUID就能获得设备路径。 GUID是同类或同种设备的全球唯一识别码,它是一个128 bit(16字节)的整形数,真实面目为 typedef struct _GUID{ unsigned long Data1; unsigned short Data2; unsigned
阅读全文
摘要:Q 用IOCTL_DISK_GET_DRIVE_GEOMETRY或IOCTL_STORAGE_GET_MEDIA_TYPES_EX只能得到很少的磁盘参数,我想获得包括硬盘序列号在内的更加详细的信息,有什么办法呀? A 确实,用你所说的I/O控制码,只能得到最基本的磁盘参数。获取磁盘出厂信息的I/O控制码,微软在VC/MFC环境中没有开放,在DDK中可以发现一些线索。早先,Lynn McGuire写了一个很出名的获取IDE硬盘详细信息的程序DiskID32,下面的例子是在其基础上经过增删和改进而成的。 本例中,我们要用到ATA/APAPI的IDENTIFY DEVICE指令。ATA/APAPI是
阅读全文
摘要:Q DOS命令DISKCOPY给我很深的印象,现在也有许多“克隆”软件,可以对磁盘进行全盘复制。我想,要制作磁盘镜像文件,DeviceIoControl应该很有用武之地吧? A 是的。这里举一个制作软盘镜像文件,功能类似于“DISKCOPY”的例子。本例实现其功能的核心代码如下: // 打开磁盘HANDLE OpenDisk(LPCTSTR filename){ HANDLE hDisk; // 打开设备 hDisk = ::CreateFile(filename, // 文件名 GENERIC_READ | GENERIC_WRITE, // 读写方式 FILE_SHARE_READ |
阅读全文
摘要:Q 在NT/2000/XP中,我想用VC编写应用程序访问硬件设备,如获取磁盘参数、读写绝对扇区数据、测试光驱实际速度等,该从哪里入手呢? A 在NT/2000/XP中,应用程序可以通过API函数DeviceIoControl来实现对设备的访问—获取信息,发送命令,交换数据等。利用该接口函数向指定的设备驱动发送正确的控制码及数据,然后分析它的响应,就可以达到我们的目的。 DeviceIoControl的函数原型为 BOOL DeviceIoControl( HANDLE hDevice, // 设备句柄 DWORD dwIoControlCode, // 控制码 LPVOID lpInBuffe
阅读全文
摘要:http://topic.csdn.net/t/20051128/13/4422955.html
阅读全文
摘要:Q 在MSDN的那个demo中,将设备名换成“A:”取A盘参数,先用资源管理器读一下盘,再运行这个程序可以成功,但换一张盘后就失败;换成“CDROM0”取CDROM参数,无论如何都不行。这个问题如何解决呢? A 取软盘参数是从软盘上读取格式化后的信息,也就是必须执行读操作,这一点与硬盘不同。将CreateFile中的访问方式改为GENERIC_READ就行了。 IOCTL_DISK_GET_DRIVE_GEOMETRY这个I/O控制码,对软盘和硬盘有效,但对一些可移动媒介如CD/DVD-ROM、TAPE等就不管用了。要取CDROM参数,还得另辟蹊径。IOCTL_STORAGE_GET_MEDI
阅读全文
摘要:检查自已的代码时,发现一个比较弱智的错误,是关于转码的,和CString的=操作符有关。 为了能简单重现,我模拟了一下代码: //未有UNICODE或_UNICODE定义 USES_CONVERSION; CString sTest(_T("test中文")); sTest = A2W(sTest); ::MessageBoxW(NULL,(LPCWSTR)sTest.GetBuffer(0),L"test中文标题",MB_OK); 输出: 对话框的内容区为乱码。 我的想象中:A2W取得宽字符串,然后赋值给CString,CString中应该保存的是宽字符串。 显然,并不如我想,想是没用的,仔
阅读全文
摘要:http://sosoman.wikidot.com/
阅读全文
摘要:静态数据成员:下面看一个例子:#include iostream.hclass Point{public:void output(){}static void init(){}};void main( void ){Point pt;pt.init();pt.output();}这样编译是不会有任何错误的。下面这样看#include iostream.hclass Point{public:void output(){}static void init(){}};void main( void ){Point::output();}这样编译会处错,错误信息:illegal call o
阅读全文
摘要:类中的静态成员真是个让人爱恨交加的特性。我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动。 静态类成员包括静态数据成员和静态函数成员两部分。 一 静态数据成员: 类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则。同时,静态数据成员还具有以下特点: 1.静态数据成员的定义。 静态数据成员实际上是类域中的全局变量。所以,静态数据成员的定义(初始化)不应该被放在头文件中。 其定义方式与全局变量相同。举例如下: xxx.h文件 class
阅读全文
摘要:听过无数次不要TerminateThread,只是工作中常用,貌似也没有什么问题。今天在高强度测试中发现了一个不可原谅的错误。参看下面的例子DWORD __stdcall mythread(void* ){ while( true ) { char* p = new char[1024]; delete p; }}int _tmain(int argc, _TCHAR* argv[]){ HANDLE h = CreateThread(NULL, 0, mythread, NULL, 0, NULL); Sleep(1000); TerminateThread(h, 0); h = NULL;
阅读全文
摘要:stl string 使用1. 查找字符std::wstring strData = L"result[北京市, 上海市, 深圳市]/result"void DoF(const std::wstring &strData, std::liststd::wstring& listDo){ std::wstring strTarB = L"result["; std::wstring strTarE = L"]/result"; std::wstring::size_type nBeginTempB = 0, nEndTempB = 0, nBeginTempE = 0, nE
阅读全文
摘要:本文分三部分来介绍如何构造一个简单的USB过滤驱动程序,包括“基本原理”、“程序的实现”、“使用INF安装”。此文的目的在于希望读者了解基本原理后,可以使用除DDK以外最流行也最方便的驱动开发工具DriverStudio来实现一个自己的过滤驱动,并正确地安装。一、基本原理我们知道,WDM(和KDM)是分层的,在构造设备栈时,IO管理器可以使一个设备对象附加到另外一个初始驱动程序创建的设备对象上。与初始设备对象相关的驱动程序决定的IRP,也将被发送到附加的设备对象相关的驱动程序上。这个被附加的驱动程序便是过滤驱动程序。如右图,过滤驱动可以在设备栈的任何层次中插入。IO管理器发出的IRP将会沿着右
阅读全文
摘要:4 编译与调试环境简介4.1 源码 ps/2键盘驱动的设备栈有3层,最底层设备对象的驱动是 acpi,中间层设备对象的驱动是 i8042prt,最高层设备对象的驱动是 kbdclass。 DDK 所附的源码中有 i8042prt 和 kbdclass 的源码,分别位于 ...\NTDDK\src\input\pnpi8042 ,...\NTDDK\src\input\kbdclass 。 注意,在目前DDK所附的源码中没有 acpi 的源码,不过 acpi 对于键盘驱动几乎没有起什么作用。在DDK中可以找到一个叫acpi的目录,但那个下面并不是acpi.sys的源码,而是acpiec.sys的
阅读全文
摘要:本文讲述Windows磁盘驱动的主要结构功能与编写方法基础。本文描述的内容仅限于软件层面,并不与具体的硬件相关。1.磁盘驱动基础 不少人把文件系统驱动和磁盘驱动混为一谈。实际上文件系统驱动应该与磁盘驱动是两类不同的驱动程序。文件系统仅仅考虑数据在存储设备上的保存格式(而不考虑具体是什么存储设备),而磁盘是存储设备的一种。 在存储设备驱动(storage driver)中,与实际的硬件设备打交道的驱动称为微端口(miniport)驱动,而更上层的驱动称为类驱动(class driver)。这里说的磁盘驱动(disk driver)是一个类驱动。类驱动具体功能通过下层的微端口驱动实现。而自己则抽象
阅读全文
摘要:2. 什么是“引用”?申明和使用“引用”要注意哪些问题? 答:引用就是某个目标变量的“别名”(alias),对应用的操作与对变量直接操作效果完全相同。申明一个引用的时候,切记要对其进行初始化。引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,不能再把该引用名作为其他变量名的别名。声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。不能建立数组的引用。 3. 将“引用”作为函数参数有哪些特点? (1)传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数
阅读全文
摘要:系统调用setjmp()和 longjmp() 有时候,当接收到一个信号时,希望能跳回程序中以前的一个位置执行。例如,在有的程序内,当用户按了中断键,则程序跳回到显示主菜单执行。我们可以用库系统调用setjmp()和 longjmp()来完成这项工作。setjmp()能保存程序中的当前位置(是通过保存堆栈环境实现的),longjmp()能把控制转回到被保存的位置。在某种意义上,longjmp()是远程跳转,而不是局部区域内的跳转。我们必须注意到,由于堆栈已经回到被保存位置这一点所以 longjmp()从来不返回。然而,与其对应的 setjmp()是要返回的。 setjmp()和 longjmp
阅读全文
摘要:目录: COM多线程原理与应用目录:前言:套间:套间的定义:套间的分类:套间的进入和退出:对象的同步:组件对象的同步:COM对象线程模型:进程内对象线程模型的种类:ATL对多线程的支持:对象引用的保护:成员变量的保护:COM+导致的变化:上下文概述:上下文对象:调用对象:前言: COM多线程一直是个不容易弄清的问题,我也被困扰了很久,特别是COM在线程方面的术语总是不能统一。本文是为了将我所学所用得做一个总结,本文不保证一定正确,但是会随着时间的推移逐渐完善改正。套间: 套间的定义: 我个人认为COM技术内幕中关于套间的定义是错误的,应采用COM本质论中的定义。COM技术内
阅读全文
摘要:一、COM是一个更好的C++1、COM 是什么Don Box说"COM IS LOVE"。COM 的全称是 Component Object Model 组件对象模型。2、从 C++ 到 DLL 再到 COM2.1 C++如某一软件厂商发布一个类库(CMath四则运算),此时类库的可执行代码将成为客户应用中不可分割的一部分。假设此类库的所产生的机器码在目标可执行文件中占有4MB的空间。当三个应用程序都使用CMath库时,那么每个可执行文件都包含4MB的类库代码(见图1.1)。当三个应用程序共同运行时,他们将会占用12MB的虚拟内存。问题还远不于此。一旦类库厂商发现CMath类库有一个缺陷后,发
阅读全文
摘要:在日常工作中,我看到过许多由不同开发人员编写的 COM 代码。我为许多富于创造性的使用 COM 的工作方式感到惊讶,有一些使 COM 工作的巧妙代码可能连Microsoft 都没有想到。同样,看到一些错误一次又一次地重犯,使我免不了心灰意懒。这些错误很多都与线程和安全有关,完全不成比例,而这也正是 COM 文档资料中最缺少的两个领域。如果不仔细计划,它们也是最可能遇到的并可能会绊住您的两个领域。 在下面的篇幅中,您将读到八位程序员的记述,这些教训都来自他们的痛苦经历。每个故事都是真实的,但为了保护无辜者,名字都已隐去。我的目的是,通过这些真实的 COM 故事,使您不再重蹈其他 COM 程序员
阅读全文
摘要:(1) COM组件实际上是一个C++类,而接口都是纯虚类。组件从接口派生而来。我们可以简单的用纯粹的C++的语法形式来描述COM是个什么东西: class IObject { public: virtual Function1(...) = 0; virtual Function2(...) = 0; .... }; class MyObject : public IObject { public: virtual Function1(...){...} virtual Function2(...){...}.... }; IObject就是我们
阅读全文
摘要:1、COM对象的理解 COM对象类似于C++语言中类的概念,类的每个实例代表一个COM对象,它也包括属性(即状态)和方法(即操作),状态反映对象的存在,方法就是接口。2、COM对象的标识-CLSIDGUID是一个128位的随机数,重复概率极低。它的值来源于两部分:空间值(网卡地址或随机数)和时间值。获得GUID值可以使用VC++提供的工具:GUIDGen.exe 和 UUIDGen.exe。或者使用COM库的API函数CoCreatGuid()。3、COM对象与C++对象的比较COM对象将数据完全封装在对象的内部。C++对象的封装是在语义上的封装,通过不同的数据类型实现数据的封装。COM对象的
阅读全文
摘要:1、ActiveX控制 ActiveX控制是Microsoft提供的功能强大的程序设计和开发技术。ActiveX控制既是一个自动化对象(当然也是一个标准的COM对象),也是一个界面元素,如同Windows的普通控制一样。 ActiveX控制是一门综合技术,它涉及到COM和OLE的许多技术精华,同时也与Windows操作系统紧密结合起来,它可作为Windows标准控制的一种扩充机制。 Microsoft把这种在Internet上使用的控制与OCX一起统称为ActiveX控制,并且把所有建立在COM和OLE基础上以及与Internet有关的技术统称为ActiveX技术。2、ActiveX控制的技术
阅读全文
摘要:本文为刚刚接触COM的程序员提供编程指南,解释COM服务器内幕以及如何用C++编写自己的接口。继上一篇COM编程入门之后,本文将讨论有关 COM服务器的内容,解释编写自己的COM接口和COM服务器所需要的步骤和知识,以及详细讨论当COM库对COM服务器进行调用时,COM服务器运行的 内部机制。 如果你读过上一篇文章。应该很熟悉COM客户端是怎么会事了。本文将讨论COM的另一端——COM服务器。内容包括如何用C++编写一个简单的不涉及 类库的COM服务器。深入到创建COM服务器的内部过程,毫无遮掩地研究那些库代码是充分理解COM服务器内部机制的最好方法。本文假设你精通C++并掌握了上一篇文章所
阅读全文
摘要:VC操作Windows快捷方式(自己总结)二个操作:新建和解析主要用到的是COM组件。IShellLink和IPersistFile需要添加的头函数shobjidl.hIPersistFile主要用到两个成员函数:1、Save。保存内容到文件中去2、Load。读取Load的函数原型HRESULT Load(LPCOLSTR pszFileName, //快捷方式的文件名,应该是ANSI字符DWORD dwMode//读取方式);dwMode可取如下值:STGM_READ:只读 STGM_WRITE:只写 STGM_READWRITE:读写IShellLink主要成员:1、GetArgume
阅读全文
摘要:本文的目的是为刚刚接触COM的程序员提供编程指南,并帮助他们理解COM的基本概念。内容包括COM规范简介,重要的COM术语以及如何重用现有的COM组件。本文不包括如何编写自己的COM对象和接口。 COM即组件对象模型,是Component Object Model 取前三个字母的缩写,这三个字母在当今Windows的世界中随处可见。随时涌现出来的大把大把的新技术都以COM为基础。各种文档中也充斥着诸如COM 对象、接口、服务器之类的术语。因此,对于一个程序员来说,不仅要掌握使用COM的方法,而且还要彻底熟悉COM的所有一切。 本文由浅入深描述COM的内在运行机制,教你如何使用第三方提供的C
阅读全文
摘要:大家都知道设置WINDOWS桌面墙纸的WIN32 API是SystemParametersInfo, 使用SPI_SETDESKWALLPAPER参数便能设置墙纸: ::SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "C:\\ABitmap.bmp", SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE); 但问题并没有解决,因为这个WIN32 API有很大的局限性 1. 无法把jpeg, gif等其他非位图格式的图片设为墙纸。 2. 无法调整墙纸的式样,即无法设置墙纸为居中,平铺或拉伸。(当然我们可以通过
阅读全文
摘要:Step by Step COM TutorialContentsIntroductionInterfacesStep 1:Create the IDL fileStep 2:Generating the type libraryStep 3:Derive from IAddStep 4:Implement the methods of IAddStep 5:Implementing IUnkownStep 6:FactoryStep 7:Implementing the methods of IClassFactoryStep 8:Implementing DllGetClassObject
阅读全文
摘要:http://old.blog.edu.cn/user2/60478/archives/2006/1211462.shtml
阅读全文
摘要:把二进制数当成数组进行左移运算的,没隔四位要输出一个空格,我在这里看到此题:一个给定的数值由左边开始升位到右边第N位,如 00101 == 0100 或者 0001 00114 == 0011 0000 请用C或者C++或者其他X86上能运行的程序实现。题目要求是可以对带格式的(4位一空格)二进制数进行位操作。接收带有空格的输入可以用cin.getline()函数,要求一个字符数组作为参数,以及最多能接收的长度和以及一个表示结尾的字符。此题没有什么特别之处,就是记住在输出的时候每四位一个空格,并且要忽略输入行中的空格。我的算法复杂度为O(n):Code highlighting pro
阅读全文
摘要:题目在:http://post.baidu.com/f?kz=70481398统计字母个数:程序输入一个字符串(长度不超过100),全是小写字母.统计小写字母出现的次数,并用要求的图表示出来.测试数据:Input:sadjhasdhqwpopeepomcxnnbladkjkfjasjasOutput:@@ @ @@ @ @ @ @@ @ @ @ @ @ @ @ @ @@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @a b c d e f g h i j k l m n o p q r s t u v w x y z注意:在字符串中每个小写字母的个数不会超过20个.编程语言
阅读全文
摘要:题目出处:http://blog.rainbud.net/article/entry20050928-014721给定一单链表的表头指针和指向其中一个节点的指针,要求以该指针为头将原链表逆序排列,例如:1. N1-N2-N3-N4-N5-NULL pHEAD = N1,pSTART = N3,返回N3-N2-N1-N5-N4-NULL2. N1-N2-N3-N4-N5-NULL pHEAD = N1,pSTART = N5,返回N5-N4-N3-N2-N1-NULL3. N1-N2-N3-N4-N5-NULL pHEAD = N1,pSTART
阅读全文
摘要:试题3:写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。另外,当你写下面的代码时会发生什么事?least = MIN(*p++, b); 解答:#define MIN(A,B) ((A) = (B) ? (A) : (B)) MIN(*p++, b)会产生宏的副作用剖析:这个面试题主要考查面试者对宏定义的使用,宏定义可以实现类似于函数的功能,但是它终归不是函数,而宏定义中括弧中的“参数”也不是真的参数,在宏展开的时候对“参数”进行的是一对一的替换。程序员对宏定义的使用要非常小心,特别要注意两个问题:(1) 谨慎地将宏定义中的“参数”和整个宏用用括弧括起来。所以,严格地讲,下述解答
阅读全文
摘要:1、将一整数逆序后放入一数组中(要求递归实现)void convert(int *result, int n) {if(n=10)convert(result+1, n/10);*result = n%10; }int main(int argc, char* argv[]) {int n = 123456789, result[20]={};convert(result, n);printf("%d:", n);for(int i=0; i9; i++)printf("%d", result[i]);}2、求高于平均分的学生学号及成绩(学号和成绩人工输入)double find(int
阅读全文
摘要:1.有A、B、C、D四个人,要在夜里过一座桥。他们通过这座桥分别需要耗时1、2、5、10分钟,只有一支手电,并且同时最多只能两个人一起过桥。请问,如何安排,能够在17分钟内这四个人都过桥?//-------------------------------------------------答案:第一步:A(1)和B(2)过桥,A(1)返回 Cost:1+2 第二步: C(5)和D(10)过桥,B(2)返回 Cost:10+2 第三步: A(1)和B(2)过桥 Cost:22.有一个埃及人拾到一枚标有“公元前3世纪”的金币,他问一个考古学家,考古学家说是假币,问为什么? 因为在那个时候没有公元(
阅读全文
摘要:1. 引用与指针有什么区别? 1) 引用必须被初始化,指针不必。 2) 引用初始化以后不能被改变,指针可以改变所指的对象。 3) 不存在指向空值的引用,但是存在指向空值的指针。2. 堆栈溢出一般是由什么原因导致的? 没有回收垃圾资源。3. 什么函数不能声明为虚函数? constructor函数不能声明为虚函数。4. 写出float x 与“零值”比较的if语句。 if(x0.000001&&x-0.000001)5. 不能做switch()的参数类型是: switch的参数不能为实型6. 头文件中的 ifndef/define/endif干什么用? 预处理答:防止头文件被重复引用7. #i
阅读全文
摘要:1. 找错试题1:Void test1(){char string[10];char* str1="0123456789";strcpy(string, str1);}试题2:Void test2(){char string[10], str1[10];for(I=0; I10;I++){str1[i] ='a';}strcpy(string, str1);}试题3:Void test3(char* str1){char string[10];if(strlen(str1) = 10){strcpy(string, str1);}}在swap函数中,p是一个“野”指针,有可能指向系统区,导
阅读全文
摘要:3.技巧题试题1:请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1解答: int checkCPU(){ { union w { int a; char b; } c; c.a = 1; return (c.b == 1); }}剖析: 嵌入式系统开发者应该对Little-endian和Big-endian模式非常了解。采用Little-endian模式的CPU对操作数的存放方 式是从低字节到高字节,而Big-endian模式对操作数的存放方式是从高字节到低字节。例如,16bit宽的数0x1234在Little- e
阅读全文
摘要:1.设一棵完全二叉树有700个结点,则在该二叉树中有多少个叶子结点如果一棵具有n个结点的深度为k的二叉树,它的每一个结点都与深度为k的满二叉树中编号为1~n的结点一一对应,这棵二叉树称为完全二叉树。 可以根据公式进行推导,假设n0是度为0的结点总数(即叶子结点数),n1是度为1的结点总数,n2是度为2的结点总数,由二叉树的性质可知:n0=n2+1,则n= n0+n1+n2(其中n为完全二叉树的结点总数),由上述公式把n2消去得:n= 2n0+n1-1,由于完全二叉树中度为1的结点数只有两种可能0或1,由此得到n0=(n+1)/2或n0=n/2,合并成一个公式:n0=(n+1)/2 ,就可根据完
阅读全文
摘要:1、将一个链表逆序 LinkList *reverse(LinkList *head){LinkList *p1,*p2 = NULL,*p3 = NULL;if(head == NULL || head-next == NULL)return head;p1 = head-next;while(p1!=NULL){p3 = p1-next;p1-next = p2;p2 = p1;p1 = p3;}head-next = p2;// head = p2;return head; }2、计算一个字节里(byte)里面有多少bit被置1#include stdio.hint com
阅读全文
摘要:MTK深圳嵌入式软件工程师笔试题(B卷)1.#define pi 3.14#define Area(R) pi*R*Rmain(){int r1=5,r2=2;double s=0;s=Area(r1-r2);printf("The area is %f",s);}求结果: The area is 3.7000002.函数 int compare(int a,int b),定义为该函数的函数指针P:为 int(*p)(int,int);p= compare;3.求输出结果#includestdio.hvoid sub(char*s,int num){int i ,j=num;char t
阅读全文
摘要:选择题 1:设float a=2, b=4, c=3;,以下C语言表达式与代数式 (a+b)+c计算结果不一致的是 A.(a+b)*c/2 B.(1/2)*(a+b)*c C.(a+b)*c*1/2 D.c/2*(a+b) 参考答案:B,因为a,b,c三个变量都是浮点数,所以在B答案中其结果是0,因为在计算1/2是就是0,如果改成1/2.0就正确了。2:为了向二进制文件尾部增加数据,打开文件的方式应采用 A.″ab″ B.″rb+″ C.″wb″ D.″wb+″ 参考答案:D3:下述程序执行后的输出结果是 #include main() { int x='f'; printf("%c\n",'
阅读全文
摘要:二分查找的代码.int bfind(int* a,int len,int val){ int m = len/2; int l = 0; int r = len; while(l!=m && r!= m) { if(a[m] val) { r = m; m = (m+l)/2; } else if(a[m] val) { l = m; m = (m+r)/2; } else return m; } return -1; //没有找到}写出在母串中查找子串出现次数的代码.int count1(char* str,char* s){ char* s1; char* s2; i
阅读全文
摘要:1 读程序段,回答问题int main(int argc,char *argv[]){int c=9,d=0;c=c++%5;d=c;printf("d=%d\n",d);return 0;}a) 写出程序输出b) 在一个可移植的系统中这种表达式是否存在风险?why?#include "stdio.h"int a=0; int b;static char c;int main(int argc,char *argv[]){char d=4;static short e;a++;b=100;c=(char)++a;e=(++d)++;printf("a=%d, b=%d, c=%d, d= %d
阅读全文
摘要:1.用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到几件事情: 1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等) 2). 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。 3). 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。 4). 如果你在你的表达式中用到UL(表示无符号长整
阅读全文
摘要:第1题: 考查对volatile关键字的认识#includesetjmp.hstaticjmp_bufbuf;main(){volatileintb;b=3;if(setjmp(buf)!=0){printf("%d",b);exit(0);}b=5;longjmp(buf,1);}请问, 这段程序的输出是(a) 3(b) 5(c) 0(d) 以上均不是第2题:考查类型转换main(){structnode{inta;intb;intc;};structnodes={3,5,6};structnode*pt=&s;printf("%d",*(int*)pt);}这段程序的输出是:(a) 3
阅读全文
摘要:1.写一个函数,它的原形是int continumax(char *outputstr,char *intputstr)功能: 在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串付给其中一个函数参数outputstr所指内存。例如:"abcd12345ed125ss123456789"的首地址传给intputstr后,函数将返回9,outputstr所指的值为123456789。#include stdio.h#include stdlib.h#include string.hint FindMax_NumStr(char *outputstr,char *i
阅读全文
摘要:1.求组合数: 求n个数(1....n)中k个数的组合.... 如:combination(5,3) 要求输出:543,542,541,532,531,521,432,431,421,321,/*求组合数: 求n个数(1....n)中k个数的组合....如:combination(5,3)要求输出:543,542,541,532,531,521,432,431,421,321,*/#include stdio.h#include error.hint pop(int *);int push(int );void combination(int ,int);int stack[3]={0
阅读全文
摘要:公共部分(50分) 1:作业调度程序从处于(B)状态的队列中选择适当的作业的作业投入运行。(3分) A 运行 B 提交 C 完成 D后备 2:SQL语言中,删除一个表的命令是(B)(3分) A CLEAR TABLE B DROP TABLE C DELETE TABLE D REMOVE TABLE 3:ATM采用的线路复用方式为(C)(3分) A 频分多路复用 B 同步时分多路复用 C 异步时分多路复用 D 独占信道 4:数据库中只存放视图的(C)(3分) A操作 B 对应的数据 C 定义 D 限制 5:什么是虚拟设备?为什么在操作系统中引入虚拟设备?(10
阅读全文
摘要:1.实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数;答://假设线性表的双向链表存储结构typedef struct DulNode{ struct DulNode *prior; //前驱指针 ElemType data; //数据 struct DulNode *next; //后继指针}DulNode,*DuLinkList;//删除操作Status ListDelete_DuL(DuLinkList &L,int i,ElemType &e){ if(!(p=GetElemP_DuL(L,i))) //此处得到i位置的节点指针,如果有需要也得写出具体函数实现 ret
阅读全文
摘要:1.什么是中断?中断发生时cpu做什么工作? 中断是指在计算机执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的时间处理程序。待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程。当外部中断,需要cpu暂停当前的任务,做相应的处理,cpu需要判断中断源,保存现场状态,以便能够处理完后继续执行中断的任务。2.CPU在上电后,进入操作系统的main()之前必须做什么工作? 过程如下: bios自举:检查硬件等读取MBR 转到MBR执行它的代码,它会检测活动分区把活动分区的引导扇区的引导代码装入内存运行引导代码引导代码装入该分区的操
阅读全文
摘要:1.求子数组的最大和题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。 如果不考虑时间复杂度,我们可以枚举出所有子数组并求出他们的和。不过非常遗憾的是,由于长度为n的数组有O(n2),具体是n*(n+1)/2个子数组;而且求一个长度为n的数组的和的时间复杂度为O(n)。因此这种思路的时间是O(n3)。解题思路:很容易理解,当我们加上一个正
阅读全文
摘要:二分查找的代码.int bfind(int* a,int len,int val){ int m = len/2; int l = 0; int r = len; while(l!=m && r!= m) { if(a[m] val) { r = m; m = (m+l)/2; } else if(a[m] val) { l = m; m = (m+r)/2; } else return m; } return -1; //没有找到}写出在母串中查找子串出现次数的代码.int count1(char* str,char* s){ char* s1; char* s2; i
阅读全文
摘要:题目: 已知strcpy函数的原型是: char * strcpy(char * strDest,const char * strSrc); 1.不调用库函数,实现strcpy函数。 2.解释为什么要返回char *。 解说: 1.strcpy的实现代码 char * strcpy(char * strDest,const char * strSrc) { if ((strDest==NULL)||(strSrc==NULL)) //[1] throw "Invalid argument(s)"; //[2] char * strDestCopy=strDe
阅读全文
摘要:(1)统计字符串中出现的子字符串数量#include "stdafx.h"void findcount(char* s1,char *s2);void findcount(char* s1,char *s2){ char * str1 = s1; char * str2 = s2; int count=0; while (*str1!='\0') { if (*str1==*str2&&*str1!='\0'&&*str2!='\0') { str1++; str2++; } else { str2= s2; str1++; } if (*str2=='\0') { count++; str2
阅读全文
摘要:一.输出文件流成员函数1.输出流的open函数要使用一个输出文件流(ofstream),必须在构造函数或open函数中把该流与一个特定的磁盘文件关联起来。在各种情况下,描述文件的参量是相同的。当你打开一个与输出流关联.的文件时,通常指定一个open_mode标志,如下表所示。可以用按位OR(|)运算符组合这些标志,它们作为枚举器定义在ios类中。表输出文件流文件打开模式标志 功 能ios::app 打开一个输出文件用于在文件尾添加数据 ios::ate 打开一个现存文件(用于输入或输出)并查找到结尾ios::in 打开一个输入文件对于一个ofstream文件,使用ios::in作为
阅读全文
摘要:简介 线程之间通信的两个基本问题是互斥和同步。 线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。 线程互斥是指对于共享的操作系统资源(指的是广义的"资源",而不是Windows的.res文件,譬如全局变量就是一种共享资源),在各线程访问时的排它性。当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。 线程互斥是一种特殊的线程同步。 实际上,互斥和同步对应着线程间通信发生的两种情况: (1)当有多个线程访问共享资源而
阅读全文
摘要:4. MFC线程、消息队列与MFC程序的"生死因果" 分析MFC程序的主线程启动及消息队列处理的过程将有助于我们进一步理解UI线程与消息队列的关系,为此我们需要简单地叙述一下MFC程序的"生死因果"(侯捷:《深入浅出MFC》)。 使用VC++ 6.0的向导完成一个最简单的单文档架构MFC应用程序MFCThread: (1) 输入MFC EXE工程名MFCThread; (2) 选择单文档架构,不支持Document/View结构; (3) ActiveX、3D container等其他选项都选择无。 我们来分析这个工程。下面是产生的核心源代码: MFCThread.h 文件clas
阅读全文
摘要:、创建和终止线程 在MFC程序中创建一个线程,宜调用AfxBeginThread函数。该函数因参数不同而具有两种重载版本,分别对应工作者线程和用户接口(UI)线程。 工作者线程CWinThread *AfxBeginThread( AFX_THREADPROC pfnThreadProc, //控制函数 LPVOID pParam, //传递给控制函数的参数 int nPriority = THREAD_PRIORITY_NORMAL, //线程的优先级 UINT nStackSize = 0, //线程的堆栈大小 DWORD dwCreateFlags = 0, //线程的创建标志 LP
阅读全文
摘要:最近,由于需求推动,自己得开始学一下在windows下如何开发驱动程序。 虽然,后来由于其他的原因使得学习没继续下去,但是我还是把一些粗略的学习经历与体会写在这里,方便自己日后卷土重来,也方便其他的对windows开发一窍不通的有志之士参考一下。(一)开发的目的我为什么要学这些知识呢? 原因是想弄远程的硬件控制,用一个简单的例子来说明就是做个软件能使得:我用自己的机子播放音频文件的时候,可在别人的机子上发出声音。一开始的方案是把整个软件划分成3部分:控制端部分、网络部分、受控端部分。 在控制端部分,自己是希望能做成类似total recorder里面的虚拟声卡,播放软件把数据包发给驱动程序后,
阅读全文
摘要:在浅尝boost之timer的post里,我提到boost::timer在linux和windows下的不同表现,并用ACE_OS::gettimeofday做了一个替代方案。不过,为了这个功能把ACE的DLL绑到一起,感觉不是那么愉快。 下面是另一个方案,利用boost::date_time库来解决#includeboost/date_time/posix_time/posix_time.hppclassElapsedTime{public:ElapsedTime():start_time_(boost::posix_time::microsec_clock::local_time())
阅读全文
摘要:我一直是在努力推介boost,因为boost是一块美玉,但,没有什么是完美的。现在,我将暴露出boost的一点瑕疵:boost::timer。虽说是瑕不掩瑜,但瑕疵就是瑕疵。先看一看下面的例子: //win2000中vc7.1编译运行 boost::timert; Sleep(1000); coutt.elapsed()endl; //redhat9中gcc3.2.3编译运行 boost::timert; sleep(1); coutt.elapsed()endl; 他们的结果是一样吗?不同的操作系统,时钟精度是不一样,结果自然不完全一样;但我说的不一样不是这一点小小的差异,
阅读全文
摘要:Table11.5.Erase/Replace Algorithm nameDescriptionFunctionsreplace/erase_firstReplace/Erase the first occurrence of a string in the inputreplace_first() replace_first_copy() ireplace_first() ireplace_first_copy() erase_first() erase_first_copy() ierase_first() ierase_first_copy() replace/erase_lastRe
阅读全文
摘要:Table11.4.Find algorithms Algorithm nameDescriptionFunctionsfind_firstFind the first occurrence of a string in the inputfind_first() ifind_first() find_lastFind the last occurrence of a string in the inputfind_last() ifind_last() find_nthFind the nth (zero-indexed) occurrence of a string in the inpu
阅读全文
摘要:Table11.3.PredicatesAlgorithm nameDescriptionFunctionsstarts_withCheck if a string is a prefix of the other onestarts_with()istarts_with() ends_withCheck if a string is a suffix of the other oneends_with()iends_with() containsCheck if a string is contained of the other onecontains()icontains() equal
阅读全文
摘要:Boost String Algorithms Library 是很有用的一个库,它让C++程序员不用一次又一次的为了字符串的处理制造一些小小的轮子。这里我将逐一用实例详细的说明每一个函数的使用,希望给自己给同道带来方便。 Boost String Algorithms Library 是很有用的一个库,它让C++程序员不用一次又一次的为了字符串的处理制造一些小小的轮子。《浅尝boost之String algorithms library》里我主要介绍了它的Split ,因为这个功能很出彩,其它则一带而过。不过,当多次向朋友推荐这个库后,反馈得到的信息让我觉得详细列出其每一个函数的使用,作为一
阅读全文
摘要:很多时候我都想在自已的代码中全部使用std::string代替MS的CString来保证我的程序在未来易于移植,但老实说CString比std::string好用很多,每每还是被诱惑了;再看看C#的string,用起来感觉更好。不过有了这个库 我可以基本抵制住诱惑了... #includeboost/algorithm/string.hpp 很多时候我都想在自已的代码中全部使用std::string代替MS的CString来保证我的程序在未来易于移植,但老实说CString比std::string好用很多,每每还是被诱惑了;再看看C#的string,用起来感觉更好。不过有了这个库我可以基本
阅读全文
摘要:虽然网上讨论不少Boost正则表达式的问题,推荐用其他正则库,但是还是用了下。[code]#include list#include boost/lexical_cast.hpp#include boost/regex.hpp //使用正则表达式 #include iostream//#include "../PStringConv/PStringConv.h"#include stringusing namespace std;using namespace boost;regex expression("[垃圾文字]{8}"); //模式int main(int arg
阅读全文
摘要:一:编译boost的正则表达式需要编译(如果不需要全部Boost的功能的话,请不要build all boost,那会花掉好几个小时。我推荐仅仅build需要的库就好。)原有的boost 1.33似乎使用vc8编译的时候有问题。下载boost 1.34.1,使用“Visual Studio 2005 Command Prompt”,进入到boost_1_34_1\libs\regex\build:nmake vc8.makOK,生成的文件在vc80下。二:学习正则表达式deelx_zh.rar不错的正则表达式的学习资料,顺便推荐一下:http://www.regexlab.com/ 这个站长还
阅读全文
摘要:boost::algorithm学习#include boost/algorithm/string.hppusing namespace std;using namespace boost; 一:大小写转换1 to_upper() 将字符串转为大写Example:string str1(" hello world! ");to_upper(str1); // str1 == " HELLO WORLD! "2 to_upper_copy() 将字符串转为大写,并且赋值给另一个字符串Example:string str1(" hello world! ");string str2;str2
阅读全文
摘要:一 Boost::bind 在STL中,我们经常需要使用bind1st,bind2st函数绑定器和fun_ptr,mem_fun等函数适配器,这些函数绑定器和函数适配器使用起来比较麻烦,需要根据是全局函数还是类的成员函数,是一个参数还是多个参数等做出不同的选择,而且有些情况使用STL提供的不能满足要求,所以如果可以我们最好使用boost提供的bind,它提供了统一的接口,提供了更多的支持,比如说它增加了shared_ptr,虚函数,类成员的绑定。 二 源码剖析1) bind1st,bind2st函数绑定器,把二元函数对象变为一元函数对象。2) mem_fun,把成员函数变为函数对象。3) f
阅读全文
摘要:一 Boost::array 在以前,如果我们要处理一组数据,我们可能使用一般数组存储,或者需要许多的对数组的数据的操作的时候,我们使用STL容器存储。但是如果我们的需求是,我们能够提前固定一组数据的大小,或提前知道这组数据的大小,但是我们又想这组数据进行一些操作,比如排序。。。显然对这个情况,上面的使用原始数组或STL容器都有点不太合适,因为原始的数组显得笨重,的我们自己实现一些重复的功能,但是如果是使用STL容器的话,有可能会导致空间和性能的下降。 基于上面的情况,所以在Boost中引入Boost::array,也可能会被加入下一代的C++标准中。Boost::array,内部仍然是固
阅读全文
摘要:一 Boost::smart_Ptr 我们学习C++都知道智能指针,例如STL中的std::auto_ptr,但是为什么要使用智能指针,使用它能带给我们什么好处呢?最简单的使用智能指针可以不会因为忘记delete指针而造成内存泄露。还有如果我们开发或者使用第三方的lib中的某些函数需要返回指针,这样的返回的指针被client使用的时候,lib就会失去对返回的指针的控制,这样delete的指针的任务一般就会交给调用方client,但是如果client忘记调用delete或是调用的时机不正确,都有可能导致问题,在这种情况下就最好使用智能指针。还有使用智能指针可以保证异常安全,保证程序在有异常抛出
阅读全文
摘要:Boost::tuple就为我们提供了一种类似于匿名struct的方法为我们解决函数的多个返回值的问题。既增强了代码的可读性有不增加代码量。其实在STL中已经有这样的特例,std::pair其实就是boost::tuple的2个参数的特例 一 Boost::tuple 很多的时候我们经常需要为我们的函数返回多个值,一般的做法是通过传入非常量的指针或引用,但是这样的话可能可读性就要差一些,使用者可能需要确切的文档才能确定到底哪个是返回值,为了更好的可读性,我们可以使用class或struct来封装我们要返回的多个值,然后返回封装struct或class,但是使用这种方法的弊端就是增加的程序的代
阅读全文
摘要:在boost中有boost::Any为我们提供了类似java或.net中的object类型,boost::Any能够代表任意类型,实现任意类型的类型安全存储以及安全的取回,常用在将不同类型的对象存储在标准容器中一 Boost::Any 很多时候我们想有一种可以代表任何类型的类型,比如像纯面向对象语言java或.net中的Object类型,但是对于C++本身并没有这样一个基类,所以我们如果要解决这类问题,首先我们考虑的是使用基类的指针,这能够解决以部分问题,但是更多的我们可以求助于void*,使用void*的缺点就是丢失了类型信息和缺乏类型安全。 幸好的是在boost中有boost::Any为我
阅读全文
摘要:Boost带领你远远地超越了C++标准库,它使得C++编程更优雅、更有活力、更高产。唯一的关于boost的book:Beyond the C++ Standard Library: An Introduction to Boost... 一 BOOSTBoost带领你远远地超越了C++标准库,它使得C++编程更优雅、更有活力、更高产。(引自:Beyond the C++ Standard Library: An Introduction to Boost)(慢慢体会哦!)二 参考主要:boost的在线document:http://boost.org/libs/libraries.htm唯一的
阅读全文
摘要://return CDialog::OnEraseBkgnd(pDC);return TRUE;}接下来是在WM_PAINT的消息处理函数OnPaint()中添加代码。由于当背景位图比较大时,进行区域处理比较耗时,所以只在启动时进行一次处理。一种方法是OnInitDialog()处理,但这样会在从启动程序到窗口出现有相当的延迟,易引起程序尚未启动的误解。再一种方法就是在OnPaint()处理,但为了避免重复处理,可以加上一个判断标志。以下是OnPaint()的代码,正体为AppWizard生成,粗体为自己添加内容。void CTransDlg::OnPaint() {if (IsIconic(
阅读全文
摘要:随着Microsoft凭借Windows在操作系统上取得的巨大成绩,Windows用户界面也日益成为业界标准。统一的界面给广大用户对应用软件的学习与使用带来了很大方便。但每天都面对同一副面孔,日久天长难免会产生一些厌倦,开发一些“离经叛道”,一改Windows应用程序千篇一律的“标准”界面,一定会给你带来一种清新的感觉。标准Windows应用程序窗口一般为带有标题栏的浅灰色矩形外观,因而“异形”对话框/窗口也主要是颜色与外形上动手脚。1:改变背景颜色 改变对话框(窗口)的背景颜色是最简单的改变Windows应用程序外观的方法,根据Windows创建与管理机理,一般有两种方法。一种是处理WM_C
阅读全文
摘要:CreateIC()和CreateDC()都获取设备描述表句柄,但用CreateDC()获取的能够进行绘画,而用CreateIC()获取的设备描述表,你却不能用它往设备上写东西,只能查询获取你所要的信息。测试代码如下: #includewindows.hLRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,PSTRszCmdLine,intiCmdShow){staticTCHARszAppName[]=TEXT("HelloWin
阅读全文
摘要:Builtin\administrators 与 Domain Admins 用户组的来历与区别 什么是builtin\administrators用户组?=====================builtin\administrators用户组是在你安装Windows的时候默认创建的.这个用户组对于这台计算机有完全的, 没有任何限制的权限. 默认情况下, 唯一属于这个用户组的用户是 Administrator 什么是domain admins用户组?=====================Domain Administrators 用户组只在Windows的Domain里出现. 这个用户
阅读全文
摘要:www.en37.com37英语学习网第一章 1.By using various coding techniques, groups of bits can be made to represent not only binary numbers but also other discrete symbols, such as decimal digits or letters of the alphabet. 应用多种编码技术,一组二进制数字不但可以表示二进制数据,而且还可以表示其它的离散符号,如十进制数字或字母表中的字母。 2.System software includes
阅读全文
摘要://for windows Vista or later OS and adminif ( IsVistaorLater() && IsAdmin() ) { // Initialize COM. ::CoInitialize(NULL); // Provides access to the Task Scheduler service for managing registered tasks. CComPtrITaskService pService; HRESULT hr = CoCreateInstance(CLSID_TaskScheduler, NULL, CLSCTX_INP
阅读全文
摘要:COM接口指针很危险,因为使用过程中需要每一个使用者都要严格并且正确的AddRef和Release,一旦出现问题,就会造成对象不能被正常释放,或者对象被重复删除,造成程序崩溃。所以使用COM接口,必须小心翼翼才行。但是,即使所有的代码中,都正确的AddRef和Release,也不一定能保证万无一失,例如:void SomeApp( IHello * pHello ){IHello* pCopy = pHello;pCopy-AddRef(); OtherApp();pCopy-Hello();pCopy-Release();}看起来好像无懈可击,但是假设OtherApp中抛出了异常,那么
阅读全文
摘要:#include atlbase.h#include taskschd.hvoid AddVistaTask() //创建计划任务{CComPtrITaskService service;CComPtrITaskFolder root_folder;CComPtrITaskFolder new_folder;CComPtrIRegisteredTask new_task; CComPtrITaskDefinition task_def;CComPtrIActionCollection actions;CComPtrIAction act1;CComPtrI
阅读全文
摘要:Task Scheduler 在 Windows Vista® 中得到了彻底的革新。尽管有一些相似之处,但新的 Task Scheduler(称为 Task Scheduler 2.0)比原来的工具(自 Windows® 98 起便已存在)要强大许多。它不再仅仅是一个供最终用户使用的工具,而是一个用于设计和管理复杂后台操作的强大平台——甚至在很多情况下,它可以避免对 Windows 服务进行开发。假设您的项目需要自动检查更新。您可以考虑编写一个在后台运行的 Windows 服务,每隔几天就会检查是否有更新。如果服务不是必须全天候运行,那么可以设计一个计划任务,每隔几天才运行一次,检查是否有更新
阅读全文
摘要:怎么设置让一个程序开机启动,并没186秒运行一次?”。看下面几位景友的回复,知道大家可能对于这个windows自带的功能不是太熟悉。下面以“启动运行QQ程序,无限期每186秒一次”为例,演示如何使用计划任务功能。由于本人水平有限,不当之处,敬请指出。1。 可以在计算机-右键-管理,或在控制面板找到 计划任务,或者开始菜单搜索框搜索“计划任务”或“ task schedule”关键字,打开。界面如下。2。 点击右边栏的 “创建任务”,界面如下。我们可以看到包括有5个标签,分别为常规、启动器、动作、环境、设置。3。在各个标签输入指示命令。以“自启动运行QQ程序,无限期每186秒一次”为例,各个标签
阅读全文
摘要:http://msdn.microsoft.com/en-us/library/aa446817(v=VS.85).aspxBoot Trigger Example (C++)This topic contains a C++ code example that shows how to create a task that is scheduled to execute Notepad.exe when the system is started. The task contains a boot trigger that specifies a start boundary and del
阅读全文
摘要:CertGetNameString(pCertContext,CERT_NAME_SIMPLE_DISPLAY_TYPE,0,NULL,pszNameString,128);ProvName=pkeyProvInfo-pwszProvName;ContainerName=pkeyProvInfo-pwszContainerName;ProvType=pkeyProvInfo-dwProvType;CRYPTUI_WIZ_EXPORT_INFO ExportInfo;CRYPTUI_WIZ_EXPORT_CERTCONTEXT_INFO ContextInfo;ZeroMemory(&Ex
阅读全文
摘要:今天,在review 一些代码的时候,看到了strtol()这个函数,由于以前使用它的时候,还没有深刻的了解,这次,我决定探个究竟。网上关于这个函数的资料大都来源于同份资料,linux库函数,讲的不够细致。于是,我花了几个小时,认真地尝试其功能,并整理了这篇文章,希望能对C语言的爱好者一些帮助。希望大家能够将本文中发现的错误及时反馈给我,以便修正。我的信箱是wp.qin@sunmedia.com。+----------------+| strtol |+----------------+i.e. string to longlong int strtol(const char *nptr, c
阅读全文
摘要:1.函数功能 用来读写一个数据块。2.一般调用形式 fread(buffer,size,count,fp); fwrite(buffer,size,count,fp);3.说明 (1)buffer:是一个指针,对fread来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址。 (2)size:要读写的字节数; (3)count:要进行读写多少个size字节的数据项; (4)fp:文件型指针。注意:1 完成次写操(fwrite())作后必须关闭流(fclose());2 完成一次读操作(fread())后,如果没有关闭流(fclose()),则指针(FILE * fp)自动向后移
阅读全文
摘要:输入输出的头文件 iostream string流的头文件 sstream 文件流的头文件 fstream stringstream的用法1.利用输入输出做数据转换2.支持char*的输入和输出3.来存储可变数据的列表
阅读全文
摘要:一般的对于需要删除字符串开始和结尾的空格的代码,经常为Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--1#includeiostream2#includestring3usingnamespacestd;45voidmain()6{7stringstrTest="Hello,world.";89strTest.erase(0,strTest.find_first_not_of(''));10cout"["strTest"]"
阅读全文
摘要:昨天遇到类内静态函数,本想自己整理下,谁知道已经有人整理的很好了,为此就不麻烦了,看了一篇就转贴在自己空间里,以便以后查询。C++的static关键字作者:韩耀旭C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。一、面向过程设计中的static1、静态全局变量在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下: //Example 1#include iostream.hvoid fn();static in
阅读全文
摘要:c与c++ static函数的区别static关键字是C, C++中都存在的关键字, 它主要有三种使用方式, 其中前两种只指在C语言中使用, 第三种在C++中使用(C,C++中具体细微操作不尽相同, 本文以C++为准).(1)局部静态变量(2)外部静态变量/函数(3)静态数据成员/成员函数下面就这三种使用方式及注意事项分别说明一、局部静态变量在C/C++中, 局部变量按照存储形式可分为三种auto, static, register(C语言程序设计(第二版)谭浩强, 第174-175页)与auto类型(普通)局部变量相比, static局部变量有三点不同1. 存储空间分配不同auto类型分
阅读全文
摘要:const类型定义:指明变量或对象的值是不能被更新,引入目的是为了取代预编译指令 **************常量必须被初始化*************************cons的作用 (1)可以定义const常量 例如: const int Max=100; int Array[Max]; (2)便于进行类型检查 例如: void f(const int i) { .........} 编译器就会知道i是一个常量,不允许修改; (3)可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。 还是上面的例子,如果在函数体内修改了i,编译器就会报错; 例如: void f(const in
阅读全文
摘要:C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。 声明为explicit的构造函数不能在隐式转换中使用。 C++中, 一个参数的构造函数, 承担了两个角色。 1 是个构造器 2 是个默认且隐含的类型转换操作符。 所以, 有时候在我们写下如 AAA = XXX, 这样的代码, 且恰好XXX的类型正好是AAA单参数构造器的参数类型, 这时候编译...
阅读全文
摘要:Boost 中文站 Boost库是一个经过千锤百炼、可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一。 Boost库由C++标准委员会库工作组成员发起,在C++社区中影响甚大,其成员已近2000人。 Boost库为我们带来了最新、最酷、最实用的技术,是不折不扣的“准”标准库。本站主要介绍Boost相关的中文技术文档。 Boost 入门 C++ Boost 学习资源列表 boost库简介 Windows和Solaris上Boost安装和编译 走进Boost(Boost使用入门) Boost 编程技术 Boost中的智能指针 C++ Boost Thread线程编程指
阅读全文
摘要:(1) 在实际的程序中,引用主要被用做函数的形式参数--通常将类对象传递给一个函数.引用必须初始化. 但是用对象的地址初始化引用是错误的,我们可以定义一个指针引用。1 int ival = 1092;2 int &re = ival; //ok3 int &re2 = &ival; //错误4 int *pi = &ival;5 int *&pi2 = pi; //ok(2) 一旦引用已经定义,它就不能再指向其他的对象.这就是为什么它要被初始化的原因。(3) const引用可以用不同类型的对象初始化(只要能从一种类型转换到另一种类型即可),也可以是不可寻址的值,如文字常量。例如double d
阅读全文
摘要:今天打算给自己的笔记本装个Visual Studio 2005,结果装到一半的时候,安装程序提示此版本与VISTA系统有兼容性的问题,于是退出了安装,程序也友好的提示可能有部分组件已经安装,于是又手动的卸载了已安装的组件,但Microsoft .NET Compact Framework不知道怎么卸载,也就没管他了! 结果在运行别的程序时,突然弹出“Visual Studio Just-In-Time Debugger” 对话框,内容是:‘An unhanled win32 exception occurred in explorer.exe[2548]. just-in-time debue
阅读全文
摘要:1、注册表位置 Windows7 64bit系统的注册表分32 位注册表项和64位注册表项两部分。在64bit系统下,通过regedit中查看到指定路径下的注册表项均为64位注册表项,而32位注册表项被重定位到:HKEY_LOCAL_MACHINE\Software\WOW6432Node。应用程序操作注册表的时候也分32bit方式和64bit方式。运行于64bit系统下的32bit应用程序默认操作32位注册表项(即被重定向到WOW6432Node下的子项);而64bit应用程序才是操作的直观子项。比如,同在64bit系统下,使用如下代码访问注册表:::RegOpenKeyEx(HKEY_LO
阅读全文
摘要:http://zh.highscore.de/cpp/boost/
阅读全文