2024年10月createmutex函数头文件win10(pdf打开显示 createmutex failure是什么问题)

 更新时间:2024-10-12

  ⑴createmutex函数头文件win(pdf打开显示createmutexfailure是什么问题

  ⑵pdf打开显示createmutexfailure是什么问题

  ⑶createmutexfailure说明程度错误了,建议重新安装。作用找出当前系统是否已经存在指定进程的实例。如果没有则创建一个互斥体。CreateMutex()函数可用来创建一个有名或无名的互斥量对象,其函数原型为:VB声明DeclareFunctionCreateMutexLib“kernel“Alias“CreateMutexA“(lpMutexAttributesAsSECURITY_ATTRIBUTES,ByValbInitialOwnerAsLong,ByVallpNameAsString)AsLongVC声明HANDLECreateMutex(LPSECURITY_ATTRIBUTESlpMutexAttributes,//指向安全属性的指针BOOLbInitialOwner,//初始化互斥对象的所有者LPCTSTRlpName//指向互斥对象名的指针);

  ⑷CreateMutex()函数是什么意思

  ⑸CreateMutex()CreateSemaphore()是系统提供的API,包含Windows.h就可以。是应用在同步的处理中。冒号是域操作符,这里的意思是访问系统的APISleep,目的是区别调用,比如你也实现了Sleep,那么此处加冒号是调用系统的Sleep

  ⑹CreateMutex()、OpenMutex()和CloseHandle()如何配对

  ⑺分类:电脑/网络》》程序设计》》其他编程语言问题描述:我将Mutex用于多进程同步。可是感到迷茫,不知这三个函数该如何配对?显然第一次CreateMutex()之后最终要CloseHandle(),但中间使用OpenMutex()后是否要CloseHandle()?有时出现第二次使用CreateMutex()代替OpenMutex()的情况,不知这是否也要CloseHandle()?请给出个试验代码说明问题好吗?解析:需要的HANDLEhMutex=CreateMutex(...“mymutex“);HANDLEhMutex=OpenMutex(..“mymutex“);CloseHandle(hMutex);CloseHandle(hMutex);

  ⑻windows多线程问题用windowsapi提供的函数创建个线程并用WaitForMultipleObjects但结果有问题

  ⑼#include《windows.h》#include《fstream.h》#include《stdio.h》#include《string》#include《conio.h》//定义一些常量;//本程序允许的最大临界区数;#defineMAX_BUFFER_NUM//秒到微秒的乘法因子;#defineINTE_PER_SEC//本程序允许的生产和消费线程的总数;#defineMAX_THREAD_NUM//定义一个结构,记录在测试文件中指定的每一个线程的参数structThreadInfo{intserial;//线程序列号charentity;//是P还是Cdoubledelay;//线程延迟intthread_request;//线程请求队列intn_request;//请求个数};//全局变量的定义//临界区对象的声明,用于管理缓冲区的互斥访问;CRITICAL_SECTIONPC_Critical;intBuffer_Critical;//缓冲区声明,用于存放产品;HANDLEh_Thread;//用于存储每个线程句柄的数组;ThreadInfoThread_Info;//线程信息数组;HANDLEempty_semaphore;//一个信号量;HANDLEh_mutex;//一个互斥量;DWORDn_Thread=;//实际的线程的数目;DWORDn_Buffer_or_Critical;//实际的缓冲区或者临界区的数目;HANDLEh_Semaphore;//生产者允许消费者开始消费的信号量;//生产消费及辅助函数的声明voidProduce(void*p);voidConsume(void*p);boolIfInOtherRequest(int);intFindProducePositon();intFindBufferPosition(int);intmain(void){//声明所需变量;DWORDwait_for_all;ifstreaminFile;//初始化缓冲区;for(inti=;i《MAX_BUFFER_NUM;i++)Buffer_Critical=-;//初始化每个线程的请求队列;for(intj=;j《MAX_THREAD_NUM;j++){for(intk=;k《MAX_THREAD_NUM;k++)Thread_Info=-;Thread_Info.n_request=;}//初始化临界区;for(i=;i《MAX_BUFFER_NUM;i++)InitializeCriticalSection(&PC_Critical);//打开输入文件,按照规定的格式提取线程等信息;inFile.open(“test.txt“);//从文件中获得实际的缓冲区的数目;inFile》》n_Buffer_or_Critical;inFile.get();printf(“输入文件是:

  ⑽“);//回显获得的缓冲区的数目信息;printf(“%d

  ⑾“,(int)n_Buffer_or_Critical);//提取每个线程的信息到相应数据结构中;while(inFile){inFile》》Thread_Info.serial;inFile》》Thread_Info.entity;inFile》》Thread_Info.delay;charc;inFile.get(c);while(c!=’

  ⑿’&&!inFile.eof()){inFile》》Thread_Info;inFile.get(c);}n_Thread++;}//回显获得的线程信息,便于确认正确性;for(j=;j《(int)n_Thread;j++){intTemp_serial=Thread_Info.serial;charTemp_entity=Thread_Info.entity;doubleTemp_delay=Thread_Info.delay;printf(“

  ⒀thread%d%c%f“,Temp_serial,Temp_entity,Temp_delay);intTemp_request=Thread_Info.n_request;for(intk=;k《Temp_request;k++)printf(“%d“,Thread_Info);cout《《endl;}printf(“

  ⒁“);//创建在模拟过程中几个必要的信号量empty_semaphore=CreateSemaphore(NULL,n_Buffer_or_Critical,n_Buffer_or_Critical,“semaphore_for_empty“);h_mutex=CreateMutex(NULL,FALSE,“mutex_for_update“);//下面这个循环用线程的ID号来为相应生产线程的产品读写时所//使用的同步信号量命名;for(j=;j《(int)n_Thread;j++){std::stringlp=“semaphore_for_produce_“;inttemp=j;while(temp){charc=(char)(temp%);lp+=c;temp/=;}h_Semaphore=CreateSemaphore(NULL,,n_Thread,lp.c_str());}//创建生产者和消费者线程;for(i=;i《(int)n_Thread;i++){if(Thread_Info.entity==’P’)h_Thread=CreateThread(NULL,,(LPTHREAD_START_ROUTINE)(Produce),&(Thread_Info),,NULL);elseh_Thread=CreateThread(NULL,,(LPTHREAD_START_ROUTINE)(Consume),&(Thread_Info),,NULL);}//主程序等待各个线程的动作结束;wait_for_all=WaitForMultipleObjects(n_Thread,h_Thread,TRUE,-);printf(“

  ⒂ALLProducerandconsumerhavefinishedtheirwork.

  ⒃“);printf(“Pressanykeytoquit!

  ⒄“);_getch();return;}//确认是否还有对同一产品的消费请求未执行;boolIfInOtherRequest(intreq){for(inti=;i《n_Thread;i++)for(intj=;j《Thread_Info.n_request;j++)if(Thread_Info==req)returnTRUE;returnFALSE;}//找出当前可以进行产品生产的空缓冲区位置;intFindProducePosition(){intEmptyPosition;for(inti=;i《n_Buffer_or_Critical;i++)if(Buffer_Critical==-){EmptyPosition=i;//用下面这个特殊值表示本缓冲区正处于被写状态;Buffer_Critical=-;break;}returnEmptyPosition;}//找出当前所需生产者生产的产品的位置;intFindBufferPosition(intProPos){intTempPos;for(inti=;i《n_Buffer_or_Critical;i++)if(Buffer_Critical==ProPos){TempPos=i;break;}returnTempPos;}//生产者进程voidProduce(void*p){//局部变量声明;DWORDwait_for_semaphore,wait_for_mutex,m_delay;intm_serial;//获得本线程的信息;m_serial=((ThreadInfo*)(p))-》serial;m_delay=(DWORD)(((ThreadInfo*)(p))-》delay*INTE_PER_SEC);Sleep(m_delay);//开始请求生产printf(“Producer%dsendstheproducerequire.

  ⒅“,m_serial);//确认有空缓冲区可供生产,同时将空位置数empty减;用于生产者和消费者的同步;wait_for_semaphore=WaitForSingleObject(empty_semaphore,-);//互斥访问下一个可用于生产的空临界区,实现写写互斥;wait_for_mutex=WaitForSingleObject(h_mutex,-);intProducePos=FindProducePosition();ReleaseMutex(h_mutex);//生产者在获得自己的空位置并做上标记后,以下的写操作在生产者之间可以并发;//核心生产步骤中,程序将生产者的ID作为产品编号放入,方便消费者识别;printf(“Producer%dbegintoproduceatposition%d.

  ⒆“,m_serial,ProducePos);Buffer_Critical=m_serial;printf(“Producer%dfinishproducing:

  ⒇“,m_serial);printf(“position);//使生产者写的缓冲区可以被多个消费者使用,实现读写同步;ReleaseSemaphore(h_Semaphore,n_Thread,NULL);}//消费者进程voidConsume(void*p){//局部变量声明;DWORDwait_for_semaphore,m_delay;intm_serial,m_requestNum;//消费者的序列号和请求的数目;intm_thread_request;//本消费线程的请求队列;//提取本线程的信息到本地;m_serial=((ThreadInfo*)(p))-》serial;m_delay=(DWORD)(((ThreadInfo*)(p))-》delay*INTE_PER_SEC);m_requestNum=((ThreadInfo*)(p))-》n_request;for(inti=;i《m_requestNum;i++)m_thread_request;Sleep(m_delay);//循环进行所需产品的消费for(i=;i《m_requestNum;i++){//请求消费下一个产品printf(“Consumer%drequesttoconsume%dproduct

  ⒈“,m_serial,m_thread_request);//如果对应生产者没有生产,则等待;如果生产了,允许的消费者数目-;实现了读写同步;wait_for_semaphore=WaitForSingleObject(h_Semaphore,-);//查询所需产品放到缓冲区的号intBufferPos=FindBufferPosition(m_thread_request);//开始进行具体缓冲区的消费处理,读和读在该缓冲区上仍然是互斥的;//进入临界区后执行消费动作;并在完成此次请求后,通知另外的消费者本处请求已//经满足;同时如果对应的产品使用完毕,就做相应处理;并给出相应动作的界面提//示;该相应处理指将相应缓冲区清空,并增加代表空缓冲区的信号量;EnterCriticalSection(&PC_Critical);printf(“Consumer%dbegintoconsume%dproduct

  ⒉“,m_serial,m_thread_request);((ThreadInfo*)(p))-》thread_request=-;if(!IfInOtherRequest(m_thread_request)){Buffer_Critical=-;//标记缓冲区为空;printf(“Consumer%dfinishconsuming%d:

  ⒊“,m_serial,m_thread_request);printf(“position);ReleaseSemaphore(empty_semaphore,,NULL);}else{printf(“Consumer%dfinishconsumingproduct%d

  ⒋“,m_serial,m_thread_request);}//离开临界区LeaveCriticalSection(&PC_Critical);}}看函数就行

  ⒌关于VC++互斥体中ReleaseMutex函数的问题

  ⒍一个线程可以重复占有mutex,占有几次资源,就要释放几次资源,不然别的线程没法获得mutexmain()线程在CreateMutex(TRUE)的时候已经占用资源,在WaitForSingleObject(hMutex)再次占用,他需要释放两次

  ⒎怎么修改互斥信号量名称

  ⒏做这个至少要有点编程基础,禁双开的方法不止一种,不过一般利用Mutex的多一些,但如果游戏还有另外的验证措施,修改也不一定能成功:给你来个例子:QQ堂多开补丁的制作方法--原理篇+视频教程经常有会员提出想知道QQT多开补丁的修改方法,今天心情不错,嘿嘿,就有了这篇文章。:OllyDbgV.(免费软件,点击下载UltraEdit(点击下载.BetaBuild(注意,这个教程只针对旧版的,对新版不适用)先说一说windows系统下,程序防止多开的几种常见方法:)使用FindWindowAPI函数。通过查找窗口标题(或/和类名)来判断程序是否正在运行。如果找到了,表明程序正在运行,这时可退出程序,达到不重复运行的效果;反之表明程序是第一次运行。这种方法不适用于以下情况,程序的标题是动态变化的、系统中运行了相同标题(或/和类名的程序)Mutex/Event/Semaphore通过互斥对象/信号量/事件等线程同步对象来确定程序是否已经运行。最常用的函数如:CreateMutexA(注意:QQ堂、QQ游戏大厅就是采用这样方法来限制程序多开的)内存映射文件(FileMapping)通过把程序实例信息放到跨进程的内存映射文件中,也可以控制程序多开。)DLL全局共享区DLL全局共享区在映射到各个进程的地址空间时仅被初始化一次,且是在第一次被windows加载时,所以利用该区数据就能对程序进行多开限制。)全局Atom将某个特定字符串通过GlobalAddAtom加入全局原子表(GlobalAtomTable),程序运行时检查该串是否存在来限制程序多开。(该Atom不会自动释放,程序退出前必须调用GlobalDeleteAtom来释放Atom))检查窗口属性将某些数据通过SetProp加入到指定窗口的propertylist,程序运行时枚举窗口并检查这些数据是否存在来限制多开。以上只列举了最常见的几种方法,具体应用中可以有n种选择,或综合运用多种方法来限制。上面说过,QQT采用CreateMutex函数来限制多开,那么我怎么知道是使用这个函数来限制的呢?答案就是跟踪程序,查找程序是使用哪种方法来限制的。比如先看看是否使用CreateMutex来限制,如果不是,再看看是不是使用FindWindow,以此类推,直到找到方法为止。当然,有些程序也会综合使用多种方法来限制多开,方法也是一样的,只是麻烦点而已。下面讲一讲使用CreateMutex函数来限制多开的方法:CreateMutex函数声明如下(具体请查阅相关资料,如MSDNHANDLECreateMutex(LPSECURITY_ATTRIBUTESlpMutexAttributes,//pointertosecurityattributesBOOLbInitialOwner,//flagforinitialownershipLPCTSTRlpName//pointertomutex-objectname);以下是使用CreateMutex函数来限制多开的典型delphi代码hMutex:=CreateMutex(nil,TRUE,’qqtang’);//建立互斥量//调用失败?已经存在?if(hMutex=)or(GetLastError=ERROR_ALREADY_EXISTS)thenbegin//程序第二(或以上)次运行时,GetLastError会返回ERROR_ALREADY_EXISTS,表明互斥量已存在//可以在这里编写退出代码end;该段代码首先调用CreateMutex函数创建一名为qqtang的互斥对象,如果调用CreateMutex函数失败(hMutex=nil或互斥对象早已存在(GetLastError=ERROR_ALREADY_EXISTS,则退出程序。好了,明白上面的内容后,我们进入修改实战:下载OllyDbgV.,解压到任何目录即可使用。启动OllyDbg,打开QQT目录下的Core.dll文件,按载入DLL文件。按Ctrl+N打开API调用列表,找到CreateMutexA后按回车,在弹出的窗口里双击第一行来到CPU窗口,反汇编代码如下:FB.pushecx;/MutexName=“qqtang“FBA.Apush;|InitialOwner=TRUEFBC.Apush;|pSecurity=NULLFBE.FFEcalldwordptr;CreateMutexA建立互斥量FC.BDFEFFFFmovedx,dwordptrFCA.movdwordptr,eaxF.BDFEFFFFmoveax,dwordptrFD.cmpdwordptr,;检查CreateMutexA函数是否调用失败FD.FCDjeCore.A;把je改为jmp即可FDB.FFCEcalldwordptr;[GetLastErrorFE.DBcmpeax,B;检查对象是否已存在FE.FBCjnzCore.A;(也可以在这里把jnz改为jmp)FEC.BDDFEFFFFmovecx,dwordptrFF.Cmovdwordptr,FF.Apush;/Title=NULLFFA.pushCore.;|Class=“QQTangWinClass“FFF.Apush;|hAfterWnd=NULL.Apush;|hParent=NULL.FFEcalldwordptr;FindWindowExA查找QQT窗口选中这行:FD.FCDjeCore.A然后按空格,在弹出的窗口中把“jeA”修改为“jmpA”,按。右键单击CPU窗口,在弹出菜单中选“复制到可执行文件”-》“所有改动”,选。右键单击弹出的窗口,选“保存文件”保存即可。是否觉得上面的修改比较麻烦呢?呵呵,授人于鱼不如授人于渔,上面是告诉你为什么要这样修改,修改的原理是什么,你明白修改原理后,有新版本时你就可以自己修改了。下面是简单的修改方法:用UltraEdit打开Core.dll文件,按Ctrl+G,输入xFD按,把F改为E即可。由于作者水平有限,如有错漏,敬请指出-----------------------------------------------------一个费劲点的法子。。。先运行游戏,然后可以利用一些软件找到这个游戏调用了哪些文件,例如安全卫士,看游戏那个进程里加载了哪些模块,一般都是dll文件类型的,是带路径的,不用管windows系统自带的那些,只看哪几个是游戏里的文件;再加上游戏的exe文件,需要修改的内容应该只在这些里面;

  ⒐CreateMutex()、OpenMutex()和CloseHandle()如何配对

  ⒑需要的HANDLEhMutex=CreateMutex(...“mymutex“);HANDLEhMutex=OpenMutex(..“mymutex“);CloseHandle(hMutex);CloseHandle(hMutex);

  ⒒HANDLEobj;obj=CreateMutex(NULL,FALSE,NULL)对应的linux下如何改写,返回值也要是obj类型

  ⒓你用的MFC还是???Linux下面当然有mutex,线程中是pthread_muxtex前缀的一系列函数,进程中用的是mutex前缀的一系列函数,你执行man-kmutex查询下就知道了,包括初始化和锁定解锁等操作。不过返回值肯定不是HANDLE了,HANDLE是WINDOWS里面才有的数据结构吧...不知道你做的是什么,不过建议你把整个程序都修改了吧,只改这个API恐怕没用。

您可能感兴趣的文章:

相关文章