博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

2013年5月24日

摘要: 正常情况下,一个进程的运行一般是不会影响到其他正在运行的进程的。但是对于某些有特殊要求的如以独占方式使用串行口等硬件设备的程序就要求在其进程运行期间不允许其他试图使用此端口设备的程序运行的,而且此类程序通常也不允许运行同一个程序的多个实例。这就引出了进程互斥的问题。 实现进程互斥的核心思想比较简单:进程在启动时首先检查当前系统是否已经存在有此进程的实例,如果没有,进程将成功创建并设置标识实例已经存在的标记。此后再创建进程时将会通过该标记而知晓其实例已经存在,从而保证进程在系统中只能存在一个实例。具体可以采取内存映射文件、有名事件量、有名互斥量以及全局共享变量等多种方法来实现。下面就分别对... 阅读全文

posted @ 2013-05-24 17:21 Taoyz 阅读(315) 评论(0) 推荐(0)

2013年5月20日

摘要: 1 typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); 2 LPFN_ISWOW64PROCESS fnIsWow64Process; 3 BOOL bIsWow64 = FALSE; 4 fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress( GetModuleHandle(_T("kernel32")),"IsWow64Process"); 5 if (NULL != fnIsWow64Process) 6 { 7 ... 阅读全文

posted @ 2013-05-20 17:36 Taoyz 阅读(126) 评论(0) 推荐(0)

摘要: 在函数调用过程中,会使用栈。__stdcall与__cdecl是两种不同的函数调用约定,定义了函数参数入栈的顺序,由调用函数还是被调用函数将参数弹出栈,以及产生函数修饰名的方法。对于参数个数可变的函数,例如printf,使用的是__cdecl调用约定Win32的API函数都遵循__stdcall调用约定在VC++开发环境中,默认的编译选项是__cdecl,对于那些需要__stdcall调用约定的函数,在声明时必须显式地加上__stdcall。在Windows程序中,回调函数必须遵循__stdcall调用约定,所以我们在声明回调函数时要使用CALLBACK。使用CALLBACK而不是__stdc 阅读全文

posted @ 2013-05-20 17:34 Taoyz 阅读(302) 评论(0) 推荐(0)

摘要: 窗口类对象与窗口并不是一回事它们之间惟一的关系是窗口类对象内部定义了一个窗口句柄变量保存了与这个窗口类对象相关的那个窗口的句柄窗口销毁时,与之对应的窗口类对象销毁与否,要看其生命周期是否结束窗口类对象销毁时,与之相关的窗口也将销毁 阅读全文

posted @ 2013-05-20 17:31 Taoyz 阅读(138) 评论(0) 推荐(0)

摘要: 分步骤如下:1,定义用户消息1 #define WM_TRAY_NOTIFY (WM_USER + 8118)2,添加托盘图标 1 NOTIFYICONDATA data; 2 memset(&data, 0, sizeof(data)); 3 // the basic functions need only V1 4 #ifdef NOTIFYICONDATA_V1_SIZE 5 data.cbSize = NOTIFYICONDATA_V1_SIZE; 6 #else 7 data.cbSize = sizeof(data); 8 #endif 9 data.hWnd = ... 阅读全文

posted @ 2013-05-20 17:30 Taoyz 阅读(193) 评论(0) 推荐(0)

摘要: 窗口对象使用完毕,应该销毁。在MFC下,一个窗口对象的销毁包括HWND窗口对象的销毁和MFC窗口对象的销毁。一般情况下,MFC编程框架自动地处理了这些。(1)对CFrameWnd和CView的派生类这些窗口的关闭导致销毁窗口的函数DestroyWindow被调用。销毁Windows窗口时,MFC框架调用的最后一个成员函数是OnNcDestroy函数,该函数负责Windows清理工作,并在最后调用虚拟成员函数PostNcDestroy。CFrameWnd和CView的PostNcDestroy调用delete this删除自身这个MFC窗口对象。所以,对这些窗口,如前所述,应在堆(Heap)中分 阅读全文

posted @ 2013-05-20 17:16 Taoyz 阅读(374) 评论(0) 推荐(0)

摘要: PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的通过重载这个函数,我们可以改变MFC的消息控制流程,甚至可以作一个全新的控制流出来只有穿过消息队列的消息才受PreTranslateMessage()影响采用SendMessage()或其他类似的方式向窗口直接发送的而不经过消息队列的消息根本不会理睬PreTranslateMessage()的存在。如果该函数返回TRUE,则不会把该消息分发给窗口函数处理。传给PreTranslateMessage()的消息是未经翻译过的消息,它没有经过TranslateMessage()处理可以在该函数中使用(p 阅读全文

posted @ 2013-05-20 17:14 Taoyz 阅读(375) 评论(0) 推荐(0)

摘要: 从消息的发送途径上看,消息分两种:队列消息和非队列消息。队列消息送到系统消息队列,然后到线程消息队列非队列消息直接送给目的窗口过程。Windows维护一个系统消息队列(System message queue),每个GUI线程有一个线程消息队列(Thread message queue)。鼠标、键盘事件由鼠标或键盘驱动程序转换成输入消息并把消息放进系统消息队列,例如WM_MOUSEMOVE、WM_LBUTTONUP、WM_KEYDOWN、WM_CHAR等等。Windows每次从系统消息队列移走一个消息,确定它是送给哪个窗口的和这个窗口是由哪个线程创建的,然后,把它放进窗口创建线程的线程消息队列 阅读全文

posted @ 2013-05-20 17:08 Taoyz 阅读(170) 评论(0) 推荐(0)