Windows 已在 XXXX.exe 中触发一个断点。 其原因可能是堆被损坏,这说明 XXXX.exe 中或它所加载的任何 DLL 中有 Bug
INT CComManager::EnumSerialPortFromDevice(LPCTSTR pStrSpecificPort,std::vector<CString>& vSerialPort)
{
std::vector<LPCTSTR> vData;
vSerialPort.clear();
INT nCount = m_pCommunication->EnumSpecificSerialPortFromDevice( pStrSpecificPort, vData );//此函数是在dll中调用的
for( int i = 0; i < nCount; i++ )
{
vSerialPort.push_back( vData[i] );
}
return nCount;
}
//dll中EnumSpecificSerialPortFromDevice函数的实现如下
INT CCommunication::EnumSpecificSerialPortFromDevice( LPCTSTR pStrSpecificPort, std::vector<LPCTSTR>& vSerialPort )
{
int nSpecificPortNumber = 0;
m_vSerailPort.clear();
int nAllPortNumber = EnumSerialPortFromDevice( m_vSerailPort );
CString strTmp = pStrSpecificPort;
for( int i = 0; i < nAllPortNumber; i++ )
{
if( m_vSerailPort[i].Find( strTmp ) >= 0 /*|| m_vSerailPort[i].Find( L"Prolific" ) >= 0 || m_vSerailPort[i].Find( L"CP210x" ) >= 0*/ )
{
vSerialPort.push_back( m_vSerailPort[i].GetString() );
nSpecificPortNumber ++;
}
}
return nSpecificPortNumber;
}调用完EnumSerialPortFromDevice函数在return nCount的时候就报了标题所示的错误,经过调试跟进,发现应该是调用那个dll函数导致的问题,但是具体不知道哪块写的有问题;而且,将主程序改成在共享dll中使用mfc就没有这个错误。
期待各位的帮助;
相关推荐
将EXE加载为DLL:可能执行任务
将一个EXE文件作为DLL加载到另一个EXE文件中并执行功能
Windows资源管理器崩溃原因与修复方案详解
Windows文件资源管理器(explorer.exe)是操作系统的核心组件,负责管理桌面、任务栏和文件系统界面。其崩溃通常由Shell扩展冲突、显卡驱动异常或系统文件损坏引发,表现为进程终止或界面卡死。通过系统内置工具如DISM和SFC可以修复大部分问题,而高级排查方法包括纯净环境测试和事件查看器分析。合理管理驱动和Shell扩展能有效预防崩溃,确保系统稳定运行。本文深入解析崩溃原因,并提供从基础到高级的全面修复方案。
解决Windows无法启动提示hal.dll损坏或丢失的方法.docx
解决Windows无法启动提示hal.dll损坏或丢失的方法.docx
DLL或EXE位数分析工具x86 X64
打开Depends.exe软件,将DLL或者exe文件拖动到软件内进行分析。可协助解决VS2013 VS2015应用程序无法正常启动0xc000007b的问题
动态加载EXE和DLL
程序中加载了一个DLL文件,但生成的EXE在脱离了DLL文件后仍然可以 单独使用,这是动态加载DLL技术。即:调用资源中的DLL。 此技术的好处:EXE可以使用DLL中的函数,但不会额外增加一 个DLL文件,在使用DLL文件的时候不需要先把DLL释放到硬盘。 在动态加载的这个DLL中定义了一个函数MRun,该函数可以动态执行一 个EXE,即:调用资源中的EXE文件或TMemoryStream中被载入的EXE流。 此技术的好处:直接把资源中的EXE加载到内存中执行,使用程序自 身嵌入的EXE文件的时候不需要先把EXE释放到硬盘上就可以直接执行。 对保密EXE文件很有用。例如:我编写的程序是A.exe,它在运行后需要 使用B.exe,而B.exe是别人编写的我没有源码,但我必须又要在我的程 序中用B.exe,这时我就把它包含到我的A.exe中,这个非常容易做到, 但是,程序A.exe在使用程序B.exe的时候按照常理必须先把B.exe释放 到硬盘上才可以用WinExec或ShellExecute等函数调用它,但你在释放 到硬盘上的时候容易被别人直接复制走,而你只想让别人用你的A.exe不 想让别人直接用B.exe(因为B.exe是别人写的等原因),此时如何保密 B.exe呢?这时只要用到上面所说的MRun函数就可以了,程序A.exe在执 行B.exe的时候不需要释放到硬盘上就可以直接执行B.exe啦,是不是很爽? 说一下MRun的调用方式: MRun(流,参数,进程id); 调用成功返回True,失败返回False,三个参数解释如下: 第一个参数:一个载入了EXE的资源流或者内存流等流类型。 第二个参数:传递调用EXE的参数。如果EXE调用不需要参数,可设置为空串。 第三个参数:如果调用成功,则返回被调用的EXE对应的进程ID。 细节性问题,请直接双击Project1.dpr文件进入演示代码,了解更多。演示代 码中动态加载了MemRun.dll文件,动态调用了5555044.exe文件,如果你想更换 动态调用的EXE文件,只需要用其它EXE覆盖5555044.exe文件并双击Clear.bat 文件后,在Delphi中按F9重新编译运行即可。


