Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16497198
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 20:54:23

下载本文示例代码
  有的应用程序希望控制程序运行唯一的实例。比如最常用的mp3播放软件Winamp,需要独占音频设备,因此只允许自身运行唯一的例程。在VC6.0 的开发实践中,16位的Windows系统下,hPrevInstance句柄保存了应用程序上一个运行的实例,可以用来检查是否有实例运行;在32位Windows系统下,这个值总是NULL。对于具有窗口的应用程序,可以用静态函数CWnd::FindWindow查找具有窗口的实例,判断程序是否已经运行,但对于无窗口的应用程序却无能为力。实际上,通过动态连接库DLL,可以实现更通用的控制方法,其过程如下:  1.在MFC应用程序中加入一个MFC Extension DLL  选择Project|Add To Project|New...菜单对话框中的Projects标签,点中MFC AppWizard(dll),取名为Single,其余默认。在MFC AppWizard-Step 1 of 1对话框中,选择MFC Extension DLL(using shared MFC DLL)。通过下面的步骤实现这个DLL。  2.实现共享数据和导出函数  用#pragma data_seg指令实现共享数据段。在Single.cpp包含头文件的语句后添加下列语句: #pragma data_seg(".SharedData")long m_nRun=-1;#pragma data_seg( )  其中,.SharedData就是我们实现的共享数据段的名称。这个数据段只包含一个变量long m_nRun,初始值为-1。  下面在Single.def文件中使用SECTIONS语句设置该共享数据段的属性: SECTIONS.SharedData READ WRITE SHARED  这样就使得使用这个DLL的应用程序能以读写方式共享.SharedData中定义的变量。  然后设计检查程序已运行实例个数的函数并导出,仍然使用def文件: EXPORTS; Explicit exports can go hereJudgeNo @1  所要添加的只是JudgeNo @1这一条语句,意思是JudgeNo是第一个输出函数,如果需要,还可以添加其他函数。JudgeNo的实现是在Single.cpp中。 long JudgeNo( ){return m_nRun;}  这里只是简单的返回了m_nRun的值,因为这个函数是供应用程序调用的。同时还要在Single.cpp的入口点函数DllMain返回成功值的语句前添加语句m_nRun ,意思是在应用程序启动连接DLL成功时对已经运行的实例进行计数。这里需要强调的是DLL共享数据的概念,它指的是多进程调用DLL时内存中只保存数据的一个副本供它们共同拥有,因此这里的变量m_nRun可以起到为程序所有运行的实例计数的作用。  3.应用程序调用JudgeNo( )  我们先在DLL中添加一个类,这样应用程序通过包含这个类的头文件就可以调用JudgeNo( )。选择Insert|New Class…菜单,弹出对话框后,在Class Type中选择Generic Class,新创建一个无任何基类的Cout类,默认的文件名是Out.h和Out.cpp,由VC 自动生成。在Out.h的类成员声明之前加上语句long JudgeNo()即可。完成之后将Out.h拷贝到应用程序的工程目录下。  选择Project|Dependencies…菜单,将应用程序的工程设置为依赖于Single工程。在应用程序应用类的实现文件中添加#include "Out.h"。然后在InitInstance( )函数的开头添加如下代码: if(JudgeNo()){AfxMessageBox("程序已执行!",MB_OK|MB_ICONINFORMATION);return FALSE;}  编译后将生成的Single.dll拷贝到Windows安装目录的System子目录下,该目录存放有系统所有的DLL文件。运行程序,如果是第二次运行,则会弹出对话框显示"程序已执行!"。说明DLL实现了对程序运行实例的计数。  本例中通过使用DLL完成了控制应用程序运行唯一实例,同时也能使初学者对DLL编程的关键技术有一个初步的体会。   有的应用程序希望控制程序运行唯一的实例。比如最常用的mp3播放软件Winamp,需要独占音频设备,因此只允许自身运行唯一的例程。在VC6.0 的开发实践中,16位的Windows系统下,hPrevInstance句柄保存了应用程序上一个运行的实例,可以用来检查是否有实例运行;在32位Windows系统下,这个值总是NULL。对于具有窗口的应用程序,可以用静态函数CWnd::FindWindow查找具有窗口的实例,判断程序是否已经运行,但对于无窗口的应用程序却无能为力。实际上,通过动态连接库DLL,可以实现更通用的控制方法,其过程如下:  1.在MFC应用程序中加入一个MFC Extension DLL  选择Project|Add To Project|New...菜单对话框中的Projects标签,点中MFC AppWizard(dll),取名为Single,其余默认。在MFC AppWizard-Step 1 of 1对话框中,选择MFC Extension DLL(using shared MFC DLL)。通过下面的步骤实现这个DLL。  2.实现共享数据和导出函数  用#pragma data_seg指令实现共享数据段。在Single.cpp包含头文件的语句后添加下列语句: #pragma data_seg(".SharedData")long m_nRun=-1;#pragma data_seg( )  其中,.SharedData就是我们实现的共享数据段的名称。这个数据段只包含一个变量long m_nRun,初始值为-1。  下面在Single.def文件中使用SECTIONS语句设置该共享数据段的属性: SECTIONS.SharedData READ WRITE SHARED  这样就使得使用这个DLL的应用程序能以读写方式共享.SharedData中定义的变量。  然后设计检查程序已运行实例个数的函数并导出,仍然使用def文件: EXPORTS; Explicit exports can go hereJudgeNo @1  所要添加的只是JudgeNo @1这一条语句,意思是JudgeNo是第一个输出函数,如果需要,还可以添加其他函数。JudgeNo的实现是在Single.cpp中。 long JudgeNo( ){return m_nRun;}  这里只是简单的返回了m_nRun的值,因为这个函数是供应用程序调用的。同时还要在Single.cpp的入口点函数DllMain返回成功值的语句前添加语句m_nRun ,意思是在应用程序启动连接DLL成功时对已经运行的实例进行计数。这里需要强调的是DLL共享数据的概念,它指的是多进程调用DLL时内存中只保存数据的一个副本供它们共同拥有,因此这里的变量m_nRun可以起到为程序所有运行的实例计数的作用。  3.应用程序调用JudgeNo( )  我们先在DLL中添加一个类,这样应用程序通过包含这个类的头文件就可以调用JudgeNo( )。选择Insert|New Class…菜单,弹出对话框后,在Class Type中选择Generic Class,新创建一个无任何基类的Cout类,默认的文件名是Out.h和Out.cpp,由VC 自动生成。在Out.h的类成员声明之前加上语句long JudgeNo()即可。完成之后将Out.h拷贝到应用程序的工程目录下。  选择Project|Dependencies…菜单,将应用程序的工程设置为依赖于Single工程。在应用程序应用类的实现文件中添加#include "Out.h"。然后在InitInstance( )函数的开头添加如下代码: if(JudgeNo()){AfxMessageBox("程序已执行!",MB_OK|MB_ICONINFORMATION);return FALSE;}  编译后将生成的Single.dll拷贝到Windows安装目录的System子目录下,该目录存放有系统所有的DLL文件。运行程序,如果是第二次运行,则会弹出对话框显示"程序已执行!"。说明DLL实现了对程序运行实例的计数。  本例中通过使用DLL完成了控制应用程序运行唯一实例,同时也能使初学者对DLL编程的关键技术有一个初步的体会。 下载本文示例代码


VC 6.0中控制运行唯一实例VC 6.0中控制运行唯一实例VC 6.0中控制运行唯一实例VC 6.0中控制运行唯一实例VC 6.0中控制运行唯一实例VC 6.0中控制运行唯一实例VC 6.0中控制运行唯一实例VC 6.0中控制运行唯一实例VC 6.0中控制运行唯一实例VC 6.0中控制运行唯一实例VC 6.0中控制运行唯一实例VC 6.0中控制运行唯一实例VC 6.0中控制运行唯一实例VC 6.0中控制运行唯一实例VC 6.0中控制运行唯一实例
阅读(85) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~