摘要:读取USB设备失败可能的原因:1.GUID不对,使用HidD_GetHidGuid获取HID的GUID。2.参数索引没有赋值。3.SP_INTERFACE_DEVICE_DATA变量没有初始化4.PSP_INTERFACE_DEVICE_DETAIL_DATA 变量没有初始化。下面是完整的打开设备代码:代码Code highlighting produced by Actipro CodeHigh...
阅读全文
随笔分类 - 編程原理
摘要:命名管道更加高级。它由一个名字来标识,以使得客户端和服务端应用程序可以通过它进行彼此通信。而且win32命名管道甚至可以在不同系统的进程间使用。命名管道有时候也被称为fifo。有了命名管道后。一个进程可以把数据放到管道中。另一个知道管道名字的进程把数据取走。命名管道与其他交换数据方式不同的地方在于。如果进程不知道这个管道的名字就不可能把数据取走。管道实际是用于进程间通信的一段共享内存。创建管道的进...
阅读全文
摘要:1:采用自定义信息发端:(1)UpdateData();(2)查找对象句柄 CWnd *pWnd = CWnd::FindWindow(NULL,_T("DataRecv1"));(3)自定义消息WM_Comm1:#define WM_COMM1 WM_USER+101, (4) 发送UINT uMsg; uMsg = atoi(m_StrMes); pWnd->SendMessage(WM...
阅读全文
摘要:1:窗口的显示与更新CMyWinApp theApp___AfxWinInit___pApp->Initapplication____pApp->InitInstance____m_pMainWnd=new CMyFramWnd()____CMyFramewnd中Create(NULL,"fds",....);____m_pMainWnd->showWindow(m_nCmdSh...
阅读全文
摘要:1:在D/v结构中, 数据都放在一份document中。我们只要把其中的成员变量依次写进文件即可。成员变量很可能是一个对象。而面向对象,我们首先应该记载其类名称,然后才是对象中的数据。读档就有点麻烦了。档程序从文件中读到一个类名称时,它如何实现一个对象,这需要动态创建技术。mfc有一套Serialize机制。目的在于把文件名的选择。文件的开关。缓存区的建立。数据的读写,提取运算符,插入运算符的重载...
阅读全文
摘要:1:PS88:MFC的类层次结构<1>CObject<2>CCmdTarget,CDocument<3>CCmdTarget_CWinThread_CWinAppCCmdTarget_CWnd_CViewCCmdTarget_CWnd_CFrameWndC++规定,全局对象的构建将比程序进入点更早。所以theApp的构造函数将更早与main。2:RTTI(运行时...
阅读全文
摘要:1:pg17图1-2windows程序的本体与操作系统间的关系2:_stdcall,_pascal,_cdecl,参数进入堆栈的次序。处理堆栈的责任归属3:PG27":对话框函数。通过只处理wm_initdialog和wm_command两个消息。对话框的各个控件也都是小小窗口,各有自己的窗口函数。它们以消息与其管理者(父窗口)沟通。而所有的控件传来的消息都是wm_command,再由其参数分辨哪...
阅读全文
摘要:“信号量内核对象”用于对资源进行计数。 在信号量内核对象内部,和其他内核对象一样,有一个使用计数,该使用计数表示信号量内核对象被打开的次数。 信号量内核对象中还有两个比较重要的数据,分别表示最大资源数和当前资源数。最大资源数表示能够管理的资源的总数,当前资源数表示目前可以被使用的资源数量。 可以使用CreateSeamphore函数来创建一个信号量内核对象,该函数成...
阅读全文
摘要:NOTE0——何为上下文切换每一个线程都有一个上下文。后者保存在线程的内核对象中。这个上下文反映了线程上一次执行时cpu寄存器的状态。大约每隔20ms(GetSystemTimeAdjustMent函数第二个参数的返回值),windows都会查看所有当前存在的线程内核对象,这些对象中只有一些是认为可以调度的。window在可调度的线程内核对象中选择一个,并将上次保存在线程上...
阅读全文
摘要:Note 0:了进程实际是由两个组件组成的:一个进程内核对象和一个地址空间.类似地,线程也由两个组件组成:一个是线程的内核对象,操作系统用它管理线程.内核对象还是系统用来存放线程统计信息的地方.一个线程堆栈,用于维护线程执行时所需的所有函数参数和局部变量.Note 1:进程是有惰性的.进程从来不执行任何东西,它只是一个线程的容器.线程必然是在某个进程的上下文中创建的,而且会在这个进程内部"终其一生...
阅读全文
摘要:Note 0:Windows提供了一个作业(job)内核对象,它允许你将进程组合在一起并创建一个"沙箱"来限制进程能够做什么.最好将作业对象想象成一个进程容器.但是,即使作业中只包含一个进程,也是非常有用的,因为这样可以对进程施加平时不能施加的限制.Note 1:以下的StartRestrictedProcess函数将一个进程放入一个作业中,以限制此进程具体能够做哪些事情,如下所示:void St...
阅读全文
摘要:Note 1:在Windows Vista中,系统DLLs是在进程地址空间的随机地址加载的.所以,不要像在Windows XP中那样将PEB的地址硬编码为0x7ffdf000.相反,你需要调用NtQueryInformationProcess,并传递ProcessBasicInformation作为参数.别忘了,在一个版本的Windows中发现的未文档化的细节可能在下一个版本中发生改变.Note ...
阅读全文
摘要:Note 1:一个线程可以调用以下两个函数来获取和设置其进程的当前驱动器和目录:DWORD GetCurrentDirectory(DWORD cchCurDir,PTSTR pszCurDir);BOOL SetCurrentDirectory(PCTSTR pszCurDir);注意WinDef.h文件中被定义为260的常量MAX_PATH是目录名称或文件名称的最大字符数.所以在调用GetCu...
阅读全文
摘要:Note 1:以前版本的Windows设计的一些应用程序之所以在Windows Vista上不能正常工作,就是因为在实现这些程序时,没有充分考虑安全性.假定一个应用程序在启动时要从一个注册表子项中读取一些数据.正确的做法是调用RegOpenKeyEx,向其传入KEY_QUERY_VALUE,从而指定查询子项数据的权限.然而许多应用程序对安全性没有任何考虑.有的软件开发人员还是按照老习惯,在调用Re...
阅读全文
摘要:最理想的比较字符串函数是CompareString(Ex)和CompareStringOrdinal。对于需要以符合用户语言习惯的方式向用户显示的字符串,请用CompareString(Ex)进行比较。CompareString函数的原型如下:int CompareString(LCID locale, //LCID GetThreadLocale();DWORD dwCmdFlags,PCTST...
阅读全文