二)、初识main函数
我相信您一定写过C程序,那您一定知道C程序的main函数,我也绝对相信你写的main函数不是int main() 就是 void main(),也就是没有参数,可是真正的main函数是有参数的,原型是:int main(int argc,char *argv[],char *envp[]),不知道吧,呵呵,下面来看看这些参数吧。
Argc:命令行参数个数
Argv:命令行参数
Envp:环境变量
为什么要有这些参数呢,又为什么我们的C程序没有这些参数呢?
我们知道main函数作为应用程序的入口点,它为操作系统访问提供了一个渠道,main函数肯定是由操作系统调用的,其他用户程序是没有资格的,当操作系统打开应用程序时,它并不是马上去访问main函数,而是要进行多步的准备工作,首先它会分配空间,然后创建主进程,根据用户访问方式确定命令行,确定环境变量,最后查找main函数,什么是命令行?举个例子吧。如果您的PC是win 7或win vista,现在不妨按照我下面的步骤走一遍:
在桌面上右击鼠标,选择个性化,点击屏幕保护程序,此时您在下拉列表框内选择一项屏保,该屏保会在小窗口内显示,如果点击预览,会在整个桌面内显示, 这两种不同的结果,在windows内部其实是通过命令行实现的,要知道GUI程序是基于消息的,而用户的鼠标点击是响应命令的,我曾经参考过一些网上资料写了一个屏保程序,其实,屏保的命令行是“\t”,其他命令行可以参考网上资料,google是很强大的,尽管它的服务器不是很稳定。
现在解释下什么是环境变量。如果您写过java程序,那么您一定听过环境变量这个名词,因为java 有个jdk,您写java程序就必须安装它,这时就要设置环境变量,现在来看看在哪设置吧:(win 7 /win vista)在您PC上的的计算机图标上右击鼠标,选择属性->高级系统设置->环境变量,这时你就会发现环境变量,其实环境变量就是一组路径,应用程序启动,其实关联着一个环境块,这个环境块就是程序运行查找资源(包括.dll,.xml,声音资源,图片资源等)的路径,一般地,操作系统查找原则是这样的:
1. SYSTEM32目录
2. Windows目录
3. 可执行文件运行当前目录
4. 环境变量
如果您还是不相信,您可以更改您的电脑上的小游戏的一些资源文件名(假设您有绝对权限可以更改,关于权限的问题,可以参考《windows核心编程》),再次运行游戏,看看结果怎样。
好了现在来讲讲winmain函数吧(GUI)
Winmain 函数原型:
Int winapi winmain(HINSTANCE hInstance , HINSTANCEhPrevInstance,PTSTR pszComandline,INT nCmdShow);
hInstance:实例句柄
hPrevInstance:上一个实例句柄
pszComandline:命令行
nCmdShow:窗口显示标志
参数解释:
hInstance:实例句柄
hPrevInstance:上一个实例句柄
这两个参数的解释,用个例子说明:
我相信您一定上过网,那么您现在打开百度网页,再次打开百度网页,重复多次,现在打开资源管理器(三种方法:1.在任务栏点击鼠标右键选择“启动资源管理器”,2.同时按下ctrl+alt+del 3.同时按下shift+ctrl+Esc),会看见有多个百度网页任务,这就是实例,一个任务是一个实例,您可以点击PC 上其他软件,启动它,再次双击,再次启动它(有些程序只支持一个实例,这里不论,下面再论),这些都是实例,而参数hPrevInstance就是您当前实例的上一个实例,懂了吧。
只能运行一个实例问题:
您玩过DNF(地下城与勇士)吗?你玩过诛仙吗?如果玩过,您将会明白一切。
DNF 只支持一个实例,诛仙可支持多个实例
我写过一个程序,就是只支持一个实例,现在告诉你核心代码:
进入 winmain 函数就要执行它:
HANDLEh=CreateMutex(NULL,FALSE,TEXT("zhengjinwei-zjw-tiance"));
if(GetLastError()==ERROR_ALREADY_EXISTS)
{
MessageBox(NULL,TEXT("当前已有Music Test实例在运行!\n郑金玮"),TEXT("天策提示"),MB_ICONINFORMATION);
CloseHandle(h);
return0;
}
好了其他两个参数可以参考上面对main 函数的解释。