VC中只允许一个程序实例运行的几种简单实现方式 详细�0�3

VC中只允许一个程序实例运行的几种简单实现方式 详细�0�3,第1张

在许多的应用程序中,有时候只能允许一个程序实例运行,当发现一个程序

实例已经运行给出提示或者激活前面运行的实例,下面针对以上情况,给出

几种简单实现方式。

// 方法一:API

if ( ::FindWindow(NULL,”您主窗口的标题”) ){::MessageBox(NULL,"程序已经运行!",

g_strTitleText,MB_OK | MB_ICONEXCLAMATION)

return FALSE}

// 方法二:互斥对象

HANDLE handle = NULL

CString strtemp = _T("")

strtemp += g_strTitleText// g_strTitleText 窗口的标题

strtemp += _T("_HOMIVIS")// 再加一些自己的信息以免冲突,这样更加安全

handle = CreateMutex(NULL,TRUE,(LPCSTR)strtemp)

if (handle != NULL){if (::GetLastError() == ERROR_ALREADY_EXISTS ){::MessageBox(NULL,"程序已经运行!",g_strTitleText,

MB_OK | MB_ICONEXCLAMATION)

return FALSE}}

其实方法还有很多,以上两种是比较简单的,只是起到抛砖引玉的作用。在VC++ 中实现如下:

打开VC++6.0,按左上角菜单栏的“文件”-->“新建”,打开如下界面

在左边的列表中选择“Win32 Console Application”,即win32控制台工程,控制台就类似windows中的cmd窗口,刚开始编程,选择创建这个工程就可以了。在右边输入工程名称,我在这里输入“FirstProgram”,位置选择一个存放该工程的文件夹,如果不放在默认的路径下,则点击右边的那个显示为“...”的按钮,然后自定义选择路径,我选择的路径是F:\Cpp。

然后点击确定,在接下来出现的对话框中选择“一个空工程”,点击完成即可,在后续的出现的窗口中点击“确定”。

这个时候一个空工程就创建完成了,我们的源代码文件将包含在这个工程中。我们现在开始创建源代码文件,点击软件左上角的“文件”-->“新建”,然后出现刚才见到过的对话框,先选择上面标签中的“文件”,然后再选择下面列表中的“C++ Source File”,文件名输入hello.cpp,然后点击“确定”。

确定完后,右边的编辑区就会自动打开空白的hello.cpp文件,左边的工作区也可以看到整个工程的组织结构

接下来我们写一个简单的程序,在屏幕上显示“hello world!”,最经典的程序

#include<iostream>

using namespace std

int main()

{

cout<<"hello world!\n"

return 0

}

然后按编辑区上方的按钮进行编译、链接,然后执行,具体如下图所示

执行结果如下图所示,我们用vc++6.0写的一个小程序就执行成功了

这是一个采用winapi编写的socket网络聊天通讯程序,该段代码为服务器端,使用udp通讯协议

#include <Winsock2.h>

#include <stdio.h>

void main()

{

WORD wVersionRequested

WSADATA wsaData

int err

wVersionRequested = MAKEWORD( 1, 1 )

//初始化winsocket

err = WSAStartup( wVersionRequested, &wsaData )

if ( err != 0 ) {

return

}

如果本地windows系统地socket库版本号不是1.1,则退出

if ( LOBYTE( wsaData.wVersion ) != 1 ||

HIBYTE( wsaData.wVersion ) != 1 ) {

WSACleanup( )

return

}

//创建socket服务,使用udp协议

SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0)

SOCKADDR_IN addrSrv

//本地服务地址为192.168.1.107,端口号为6000

addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.1.107")

addrSrv.sin_family=AF_INET

addrSrv.sin_port=htons(6000)

char recvBuf[100]//接收数据包

char sendBuf[100]//发送数据包

char tempBuf[200]//临时存储区

int len=sizeof(SOCKADDR)

while(1)

{

printf("Please input data:\n")

//用户输入一串字符串

gets(sendBuf)

//向客户端提交字符串数据包

sendto(sockClient,sendBuf,strlen(sendBuf)+1,0,

(SOCKADDR*)&addrSrv,len)

//从客户端接收应答消息

recvfrom(sockClient,recvBuf,100,0,(SOCKADDR*)&addrSrv,&len)

//如果接收的应答字符串首位字符为“q”,则告知对方对话结束

if('q'==recvBuf[0])

{

sendto(sockClient,"q",strlen("q")+1,0,

(SOCKADDR*)&addrSrv,len)

printf("Chat end!\n")

break

}

//打印出对方聊天的ip和聊天内容

sprintf(tempBuf,"%s say : %s",inet_ntoa(addrSrv.sin_addr),recvBuf)

printf("%s\n",tempBuf)

}

//关闭socket服务

closesocket(sockClient)

WSACleanup()

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/10964274.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-12
下一篇 2023-05-12

发表评论

登录后才能评论

评论列表(0条)

保存