首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

GetModuleFileNameEx返回0,而GetLastError返回溢出错误。我做错了什么?

根据提供的问答内容,你遇到的问题是调用GetModuleFileNameEx函数返回0,而GetLastError函数返回溢出错误。这种情况通常表示你在调用GetModuleFileNameEx函数时出现了错误。下面是一些可能的原因和解决方法:

  1. 参数错误:请确保你正确地传递了函数所需的参数。GetModuleFileNameEx函数需要传递进程句柄、模块句柄和缓冲区大小等参数。请检查你传递的参数是否正确。
  2. 缓冲区大小不足:如果传递给GetModuleFileNameEx函数的缓冲区大小不足以容纳模块文件名,函数将返回溢出错误。你可以尝试增加缓冲区大小,或者使用动态分配内存的方式来确保缓冲区足够大。
  3. 权限问题:如果你尝试获取其他进程的模块文件名,可能会遇到权限问题。请确保你有足够的权限来获取目标进程的模块信息。
  4. 模块句柄错误:请确保你传递给GetModuleFileNameEx函数的模块句柄是有效的。你可以使用EnumProcessModules函数来获取进程的模块句柄列表,并确保你选择了正确的模块句柄。
  5. 兼容性问题:某些操作系统版本可能不支持GetModuleFileNameEx函数或者某些参数。请确保你的操作系统版本符合函数的要求,并查阅相关文档以获取更多信息。

总结起来,你需要仔细检查你调用GetModuleFileNameEx函数时的参数、缓冲区大小、权限、模块句柄等方面是否正确,并确保你的操作系统版本支持该函数。如果问题仍然存在,你可以参考相关文档或搜索引擎来获取更多关于GetModuleFileNameEx函数的信息和解决方法。

注意:由于要求不能提及特定的云计算品牌商,我无法为你提供腾讯云相关产品和产品介绍链接地址。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

windows错误处理

在调用windows API时函数会首先对我们传入的参数进行校验,然后执行,如果出现什么情况导致函数执行出错,有的函数可以通过返回值来判断函数是否出错,比如对于返回句柄的函数如果返回NULL 或者INVALID_HANDLE_VALUE,则函数出错,对于返回指针的函数来说如果返回NULL则函数出错,但是对于有的函数从返回值来看根本不知道是否成功,或者为什么失败,对此windows提供了一大堆的错误码,用于标识API函数是否出错以及出错原因。 在windows中为每个线程准备了一个存储区,专门用来存储当前API执行的错误码,想要获取这个错误码可以通过函数GetLastError。在这需要注意的是当前API执行返回的错误码会覆盖之前API返回的错误码,所以在调用API结束后需要立马调用GetLastError来获取该函数返回的错误码。但是windows中的错误码实在太多,有的时候错误码并不直观,windows为每个错误码都关联了一个错误信息的文本,想要通过错误码获取对应的文本信息,可以通过函数FormatMessage来获取。 下面是一个具体的例子:

02

使用FormatMessage函数编写一个内核错误码查看器

在编写驱动程序的时候,常用的一个结构是NTSTATUS,它来表示操作是否成功,但是对于失败的情况它的返回码过多,不可能记住所有的情况,应用层有一个GetLastError函数,根据这个函数的返回值可以通过错误查看器来查看具体的错误原因,但是内核中就没有这么方便了,我之前在网上找资料的时候发现很多人都是把错误码和它的具体原因都列举出来,然后人工进行对照查找,这样很不方便,有没有类似于应用层上错误码查看工具的东西呢?终于皇天不负有心人,我在微软官网上找到了FormatMessage的说明,自己实现了这个功能,现在讲这个部分记录下来,以供大家参考

02

CreateMutex、WaitForSingleObject、ReleaseMutex——创建互斥对象

CreateMutex CreateMutex作用是找出当前系统是否已经存在指定进程的实例。如果没有则创建一个互斥体。 互斥对象是系统内核维护的一种数据结构,它保证了对象对单个线程的访问权 互斥对象的结构:包含了一个使用数量,一个线程ID,一个计数器 使用数量是指有多少个线程在调用该对象,线程ID是指互斥对象维护的线程的ID 计数器表示当前线程调用该对象的次数 声明 HANDLE CreateMutex( LPSECURITY_ATTRIBUTESlpMutexAttributes, // 指向安全属性的指针 BOOLbInitialOwner, // 初始化互斥对象的所有者 LPCTSTRlpName // 指向互斥对象名的指针 ); 说明 创建一个互斥体(MUTEX) 返回值 Long,如执行成功,就返回互斥体对象的句柄;零表示出错。会设置GetLastError。即使返回的是一个有效句柄,但倘若指定的名字已经存在,GetLastError也会设为ERROR_ALREADY_EXISTS 参数表 参数 类型及说明lpMutexAttributes SECURITY_ATTRIBUTES,指定一个SECURITY_ATTRIBUTES结构,或传递零值(将参数声明为ByVal As Long,并传递零值),表示使用不允许继承的默认描述符 bInitialOwner Long,如创建进程希望立即拥有互斥体,则设为TRUE。一个互斥体同时只能由一个线程拥有 lpName String,指定互斥体对象的名字。用vbNullString创建一个未命名的互斥体对象。如已经存在拥有这个名字的一个事件,则打开现有的已命名互斥体。这个名字可能不与现有的事件、信号机、可等待计时器或文件映射相符它的具体作用是每调用它一次将互斥对象的计数器减一,直到减到零为止,此时释放互斥对象,并将互斥对象中的线程id 置零。 它的使用条件是,互斥对象在哪个线程中被创建,就在哪个线程里面释放。因为调用的时候会检查当前线程的id是不是与互斥对象中保存的id一致,若一致,则此次操作有效,不一致,则无效。 注解编辑 一旦不再需要,注意必须用CloseHandle函数将互斥体句柄关闭。从属于它的所有句柄都被关闭后,就会删除对象线程中止前,一定要调用ReleaseMutex释放互斥体,如不慎未采取这个措施,就会将这个互斥体标记为废弃(下一个释放的等待函数会返回WAIT_ABANDONED),并自动释放所有权。共享这个互斥体的其他应用程序也许仍 然能够用它,但会接收到一个废弃状态信息,指出上一个所有进程未能正常关闭。这种状况是否会造成影响取决于涉及到的具体应用程序。在Windows系统中,线程可以在等待函数中指定一个此线程已经拥有的互斥体,由于Windows的防死锁机制,这种做法不会阻止此线程的运行。 使用例子编辑 常用操作mutex的函数还有:ReleaseMutex/OpenMutex/WaitForSingleObject/WaitForMultipleObjects。 创建互斥体 h_mutex1=CreateMutex(NULL,FALSE,”mutex_for_readcount”);//创建一个互斥体 检查错误代码 #include <stdio.h> #include <windows.h> …… // main function HANDLE m_hMutex = CreateMutex(NULL, FALSE, “Sample07”);// 检查错误代码 if (GetLastError() == ERROR_ALREADY_EXISTS) { // 如果已有互斥量存在则释放句柄并复位互斥量 CloseHandle(m_hMutex); m_hMutex = NULL; // 程序退出 return FALSE; };//上面这段代码演示了有名互斥量在进程互斥中的用法。代码的核心是CreateMutex()对有名互斥量的创建。CreateMutex() 用于有独占要求的程序 (在其进程运行期间不允许其他使用此端口设备的程序运行,或不允许同名程序运行)。 详细例子 下面这段代码详细介绍了CreateMutex函数的使用方法: #include “stdafx.h”#include “windows.h”int main(int argc, char* argv[]){ HANDLE m_hMutex = CreateMutex(NULL,TRUE,”cplusplus_me”); DWORD dwRet = GetLastError(); if (m_hMutex) { if (ERROR_ALREADY_EXISTS == dwRe

01

全错位排列组合公式_无顺序排列组合公式

大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了! 做好“一件”事情尚且不易,若想永远成功而总从不失败,那更是难上加难了,就像花钱总是比挣钱容易的道理一样。 话虽这样说,我还是要告诉大家,要想失败到一定程度也是不容易的。比如,我高中的时候,就有一个神奇的女生,在英语考试的时候,竟然把40个单项选择题全部做错了!大家都学过概率论,应该知道出现这种情况的概率,所以至今我都觉得这是一件神奇的事情。如果套用一句经典的评语,我们可以这样总结:一个人做错一道选择题并不难,难的是全部做错,一个不对。

02

关于程序多开的尝试。CreateMutex,OpenMuxtex,ReleaseMutex「建议收藏」

因为偶尔会遇到对那些不能支持双开的程序进行多开。。 根据前一阵转的一篇文件了解到,现在大多程序都用CreateMutex方式来限制多开, 于是有个想法:它Create了,我Release它,然后不就可以多开了吗? 然而。。。经过一些小程序的验证及网上的搜索,我失败了。 原因是:对于一个Mutex来说,只有Create它的进程才可以Release它。所以想用这种方式是不可能了。 不过并不是没有收获,经过这次“失败”的试验对Mutex的认识也增加了一些。基本的用法也了解了~ 一些小总结: CreateMutex和OpenMutex在该Mutex已存在时,结果一样,都会返回一个副本HANDLE。 当该Muxtex不存在时,OpenMutex会返回0出错,并可用GetLastError得到错误信息。 ReleaseMutex只能由创建该Mutex的进程执行,不然总是返回错误。 用CloseHandle来释放Mutex时,只是释放当前进程获得的副本句柄,而不会删除该Mutex内核对象。

01
领券