选择显示字体大小

vc++6.0中控制运行唯一实例


  有的应用程序希望控制程序运行唯一的实例。比如最常用的mp3播放软件winamp,需要独占音频设备,因此只允许自身运行唯一的例程。 在vc6.0++的开发实践中,16位的windows系统下,hprevinstance句柄保存了应用程序上一个运行的实例,可以用来检查是否有实例运行;在32位windows系统下,这个值总是null。对于具有窗口的应用程序,可以用静态函数cwnd::findwindow查找具有窗口的实例,判断程序是否已经运行,但对于无窗口的应用程序却无能为力。实际上,通过动态连接库dll,可以实现更通用的控制方法,其过程如下:

  1.在mfc应用程序中加入一个mfc extension dll

  选择projectadd to projectnew...菜单对话框中的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 here
judgeno @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( )。选择insertnew class…菜单,弹出对话框后,在class type中选择generic class,新创建一个无任何基类的cout类,默认的文件名是out.h和out.cpp,由vc++自动生成。在out.h的类成员声明之前加上语句long judgeno()即可。完成之后将out.h拷贝到应用程序的工程目录下。

  选择projectdependencies…菜单,将应用程序的工程设置为依赖于single工程。在应用程序应用类的实现文件中添加#include "out.h"。然后在initinstance( )函数的开头添加如下代码:

if(judgeno())
{
afxmessagebox("程序已执行!",mb_okmb_iconinformation);
return false;
}

  编译后将生成的single.dll拷贝到windows安装目录的system子目录下,该目录存放有系统所有的dll文件。运行程序,如果是第二次运行,则会弹出对话框显示"程序已执行!"。说明dll实现了对程序运行实例的计数。

  本例中通过使用dll完成了控制应用程序运行唯一实例,同时也能使初学者对dll编程的关键技术有一个初步的体会。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons