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

2016-01-29 12:42 39 1 收藏

VC++6.0中控制运行唯一实例,VC++6.0中控制运行唯一实例

【 tulaoshi.com - C语言心得技巧 】

  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 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( )。选择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编程的关键技术有一个初步的体会。


来源:http://www.tulaoshi.com/n/20160129/1487289.html

延伸阅读
Windows7系统不兼容VC++6.0的问题解决方案   运行setup.exe安装程序,会弹出如下的的程序兼容性助手提示:此程序存在已知的兼容性问题,tuLaoShi.com这个是Win7在警告用户VC++6.0存在兼容性问题:此程序存在已知的兼容性问题。如下图,选中不再显示此消息,点运行程序,之后再有遇到此程序存在已知的兼容性问题的提示时候,也按这个做...
标签: 服务器
VC6.0 使用教程 你首先要打开 VC6.0 界面,一般用得较多的是Win32控制台应用程序(源程序,扩展名.cpp), 步骤是:(先工程后文件编译连接---运行) 1,建立一个工程,文件新建,出现下面界面:     选择Win32ConsoleApplication(控制台应用程序,左边倒数第三个),命名工程名称,选...
_heap_alloc_debug 会使程序崩溃调。所有版本的VC++6.0。 new中调用了._malloc_dbg(), 和_heap_alloc_dbg(). 在_heap_alloc_dbg()中有个静态的long 型计数器, _lRequestCurr (Microsoft visual StudioVC98CrtSrcdbgheap.c),初始化为1。 每次new()或 malloc()调用,这个计数器加1,当你的程序运行到足够时间,这个值会在 -2,147,483,648 to 2,...
标签: windows系统
Win8.1怎么运行VC6.0工具 Win8/8.1不能运行VC6的解决办法介绍   有些同学想学习编程,可能会选择vc,但是不少朋友可能会遇到vc6.0在win8/8.1上不能运行,一般会提示:Microsoft(R)Developer Studio已停止工作,出现这一个问题,导致程序停止正常工作,如果有可用的解决方法,Windwos将关闭程序并通知你。这里网管之家图老师小编给出...
GDI+图形函数,一个组在.net环境下提供的以取代GDI图形函数的类,将来会逐渐取代GDI图形函数. 如果在vc6.0中使用gdi+图形函数,那么请按以下步骤操作: 1.下载下面的rar文件将其中的Includes和Lib中的文件拷到vc目录下的Includes和Lib文件夹中. 2新建一个工程(以winsdk框架为例mfc也相同) 将以下代码加入StdAfx.h头文件中 //加入的头文件 #i...

经验教程

389

收藏

48
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部