您当前的位置:首页 > 精选知识 > 正文

createmutex(winmain函数用法)

本文目录

  • winmain函数用法
  • C#程序多开器
  • CreateMutex能用CreateSemaphore替代吗

winmain函数用法

函数原型int WINAPI WinMain  (  HINSTANCE hInstance,  HINSTANCE hPrevInstance,  LPSTR lpCmdLine,  int nCmdShow  );参数hInstance:应用程序当前实例的句柄。  hPrevlnstance:应用程序的先前实例的句柄。对于同一个程序打开两次,出现两个窗口第一次打开的窗口就是先前实例的窗口。对于一个32位程序,该参数总为NULL。  如果需要检测另外一个实例是否已经存在,则使用CreateMutex函数创建一个独一无二的名字。即使互斥名已经存在,CreateMutex函数也是成功的,但是GetLastError函数将返回 ERROR_ALREADY_EXISTS,这就表明应用程序有另外一个实例存在,因为它首先创建了互斥名。  lpCmdLine:指向应用程序命令行的字符串的指针,不包括执行文件名。获得整个命令行,参看GetCommandLine。  第三个参数lpCmdLine是一个以空终止的字符串,指定传递给应用程序的命令行参数。例如:在D盘下有一个sunxin.txt文件,当我们用鼠标双击这个文件时将启动记事本程序(notepad.exe),此时系统会将D:\sunxin.txt作为命令行参数传递给记事本程序的WinMain函数,记事本程序在得到这个文件的全路径名后,就在窗口中显示该文件的内容。要在VC++开发环境中向应用程序传递参数,可以单击菜单【Project】→【Settings】,选择“Debug”选项卡,在“Program arguments”编辑框中输入你想传递给应用程序的参数。  nCmdShow:指明窗口如何显示。该参数可以是下列值之一:  SW_HIDE:隐藏窗口并且激活另外一个窗口。  SW_MINIMIZE:最小化指定的窗口,并且激活在系统表中的顶层窗口。  SW_RESTORE:激活并显示窗口。如果窗口已经最小化或最大化,系统将以恢复到原来的尺寸和位置显示窗口(与SW_SHOWNORMAL相同)。  SW_SHOW:激活一个窗口并以原来的尺寸和位置显示窗口。  SW_SHOWMAXIMIZED:激活窗口并且将其最大化。  SW_SHOWMINIMIZED:激活窗口并将其最小化(以图标显示)。  SW_SHOWMINNOACTIVE:将一个窗口显示为图标。激活窗口维持活动状态。  SW_SHOWNA:以窗口的当前状态显示窗口。激活窗口保持活动状态。  SW_SHOWNOACTIVATE:以窗口的最近一次的尺寸和位置显示窗口。激活窗口维持激活状态。  SW_SHOWNORMAL:激活并显示窗口。如果窗口最大化或最小化,系统将其恢复到原来的尺寸和位置(与SW_RESTORE相同)。返回值如果函数成功,当它接收到一个WM_QUIT消息时就中止,函数应该返回在该消息的wParam参数的退出值。如果函数在进入消息循环时退出,应该返回零。

C#程序多开器

只让同时开一个?比如飞信是吗? 那种的不行,就可以一个,我也不知道C#如何实现QQ那类就可以多开 如果你说的是你自己的程序应该就可以多开 windows系统下,程序防止多开的几种常见方法: 1)使用FindWindow API函数。 通过查找窗口标题(或/和类名)来判断程序是否正在运行。如果找到了,表明程序正在运行,这时可退出程序,达到不重复运行的效果;反之表明程序是第一次运行。 这种方法不适用于以下情况,程序的标题是动态变化的、系统中运行了相同标题(或/和类名)的程序 2)Mutex/Event/Semaphore 通过互斥对象/信号量/事件等线程同步对象来确定程序是否已经运行。最常用的函数如:CreateMutexA(注意:QQ堂、QQ游戏大厅就是采用这样方法来限制程序多开的) 3)内存映射文件(File Mapping) 通过把程序实例信息放到跨进程的内存映射文件中,也可以控制程序多开。 4)DLL全局共享区 DLL全局共享区在映射到各个进程的地址空间时仅被初始化一次,且是在第一次被windows加载时,所以利用该区数据就能对程序进行多开限制。 5)全局Atom 将某个特定字符串通过GlobalAddAtom加入全局原子表(Global Atom Table),程序运行时检查该串是否存在来限制程序多开。(该Atom不会自动释放,程序退出前必须调用GlobalDeleteAtom来释放Atom) 6)检查窗口属性 将某些数据通过SetProp加入到指定窗口的property list,程序运行时枚举窗口并检查这些数据是否存在来限制多开。 以上只列举了最常见的几种方法,具体应用中可以有n种选择,或综合运用多种方法来限制。 上面说过,QQT采用CreateMutex函数来限制多开,那么我怎么知道是使用这个函数来限制的呢? 答案就是跟踪程序,查找程序是使用哪种方法来限制的。比如先看看是否使用CreateMutex来限制,如果不是,再看看是不是使用FindWindow,以此类推,直到找到方法为止。当然,有些程序也会综合使用多种方法来限制多开,方法也是一样的,只是麻烦点而已。 下面讲一讲使用CreateMutex函数来限制多开的方法: CreateMutex函数声明如下(具体请查阅相关资料,如MSDN) HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes,// pointer to security attributes BOOL bInitialOwner, // flag for initial ownership LPCTSTR lpName// pointer to mutex-object name ); 以下是使用CreateMutex函数来限制多开的典型delphi代码 hMutex:=CreateMutex(nil,TRUE,’qqtang’);//建立互斥量 // 调用失败? 已经存在? if(hMutex=0) or (GetLastError=ERROR_ALREADY_EXISTS)then begin //程序第二(或以上)次运行时,GetLastError会返回ERROR_ALREADY_EXISTS,表明互斥量已存在 //可以在这里编写退出代码 end; 该段代码首先调用CreateMutex函数创建一名为 qqtang 的互斥对象,如果调用CreateMutex函数失败(hMutex=nil)或互斥对象早已存在(GetLastError=ERROR_ALREADY_EXISTS),则退出程序。 好了,明白上面的内容后,我们进入修改实战: 下载OllyDbg V1.1,解压到任何目录即可使用。 启动OllyDbg,打开QQT目录下的Core.dll文件,按[是]载入DLL文件。 按Ctrl+N打开API调用列表,找到CreateMutexA后按回车,在弹出的窗口里双击第一行来到CPU窗口,反汇编代码如下: 10002FB9 . 51 push ecx ; /MutexName = “qqtang“ 10002FBA . 6A 01 push 1 ; |InitialOwner = TRUE 10002FBC . 6A 00 push 0 ; |pSecurity = NULL 10002FBE . FF15 60E40010 call dword ptr [《&KERNEL32.CreateMutexA》] ; \CreateMutexA 建立互斥量 10002FC4 . 8B95 D4FEFFFF mov edx,dword ptr [ebp-12C] 10002FCA . 8902 mov dword ptr [edx],eax 10002FCC . 8B85 D4FEFFFF mov eax,dword ptr [ebp-12C] 10002FD2 . 8338 00 cmp dword ptr [eax],0 ; 检查CreateMutexA函数是否调用失败 10002FD5 . 0F84 CD000000 je Core.100030A8 ; 把je改为jmp即可 10002FDB . FF15 5CE40010 call dword ptr [《&KERNEL32.GetLastError》] ; [GetLastError 10002FE1 . 3D B7000000 cmp eax,0B7 ; 检查对象是否已存在 10002FE6 . 0F85 BC000000 jnz Core.100030A8 ; (也可以在这里把jnz改为jmp) 10002FEC . 8B8D D4FEFFFF mov ecx,dword ptr [ebp-12C] 10002FF2 . C701 00000000 mov dword ptr [ecx],0 10002FF8 . 6A 00 push 0 ; /Title = NULL 10002FFA . 68 5CC60010 push Core.1000C65C ; |Class = “QQTangWinClass“ 10002FFF . 6A 00 push 0 ; |hAfterWnd = NULL 10003001 . 6A 00 push 0 ; |hParent = NULL 10003003 . FF15 40E70010 call dword ptr [《&USER32.FindWindowExA》] ; \FindWindowExA 查找QQT窗口 选中这行: 10002FD5 . 0F84 CD000000 je Core.100030A8 然后按空格,在弹出的窗口中把“je 100030A8”修改为“jmp 100030A8”,按[汇编]。 右键单击CPU窗口,在弹出菜单中选“复制到可执行文件”-》“所有改动”,选[全部复制]。右键单击弹出的窗口,选“保存文件”保存即可。 是否觉得上面的修改比较麻烦呢?呵呵,授人于鱼不如授人于渔,上面是告诉你为什么要这样修改,修改的原理是什么,你明白修改原理后,有新版本时你就可以自己修改了。

CreateMutex能用CreateSemaphore替代吗

HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, LPCTSTR lpName ); 将第二个和第三个参数都置为1,这样计数为1的信号量就可以当做互斥体用啦,


声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢。

上一篇: 公务员政审个人小结,公务员政审近三年个人总结(什么是技术指标)

下一篇: 360浏览器收藏夹路径在哪里?win10的收藏夹在哪个文件夹



推荐阅读