【发布时间】:2012-03-03 21:10:22
【问题描述】:
我以前从未做过任何 C++/COM 工作,所以我试图劫持现有的解决方案并根据我的需要对其进行更改。该项目是使用 VC 6 编写并成功编译的,我现在正尝试在 2010 年使用它。我不得不更改一些引用以使其编译,但由于某种原因,我生成的 dll 导致异常我的系统(原来的工作正常)。对错误进行一些研究,当我尝试声明一个 char 数组时,我似乎遇到了缓冲区溢出。
bool CFile::simpleWrite(char* cData)
{
try{
// temp result variable
BOOL bResult = 0;
// file handle
HANDLE hFile = INVALID_HANDLE_VALUE;
// get the CMain singleton
CMain* m_pMain = CMain::GetInstance();
// this point gets synchronization to ensure we get unique file name...
char cDirFilename[MAX_PATH + 1];
GetLogFileName(cDirFilename, MAX_PATH);
// sanity check
if(strcmp(cDirFilename, "c:\\") == 0) assert(0);
// try and create a file
hFile = CreateFile( cDirFilename, GENERIC_WRITE, FILE_SHARE_READ,NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
// if have a good file handle
if(hFile != INVALID_HANDLE_VALUE){
size_t lenFileData = strlen(cData) + 72;
char* cFileData = new char[lenFileData];
_snprintf(cFileData, lenFileData, "<?xml version=\"1.0\"?>\r\n<RootElement>\r\n%s</RootElement>\r\n\0", cData);
...
这是 cData 的声明/赋值(调用方法中的 cXML)。
char cXML[EVENT_LOG_MAX_MESSAGE];
// get the CMain singleton
CMain* pMain = CMain::GetInstance();
long lThreadID = GetCurrentThreadId();
// put the parameters into XML format
pMain->BuildXML(cXML, EVENT_LOG_MAX_MESSAGE,errLogLevel,userActivityID,methodName,lineNumber,className,AppID,errorDescription,errorID,lThreadID);
// write the data to file
if(!simpleWrite(cXML))
...
BuildXML 正在对 cXML 执行 _snprintf 并返回它。
这是从我的调用到一些 VC 文件的堆栈跟踪。
Test.dll!_heap_alloc_base(unsigned int size) Line 55 C
Test.dll!_heap_alloc_dbg_impl(unsigned int nSize, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp) Line 431 + 0x9 bytes C++
Test.dll!_nh_malloc_dbg_impl(unsigned int nSize, int nhFlag, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp) Line 239 + 0x19 bytes C++
Test.dll!_nh_malloc_dbg(unsigned int nSize, int nhFlag, int nBlockUse, const char * szFileName, int nLine) Line 302 + 0x1d bytes C++
Test.dll!malloc(unsigned int nSize) Line 56 + 0x15 bytes C++
Test.dll!operator new(unsigned int size) Line 59 + 0x9 bytes C++
Test.dll!operator new[](unsigned int count) Line 6 + 0x9 bytes C++
Test.dll!CFile::simpleWrite(char * cData) Line 87 + 0xc bytes C++
我确定存在一些愚蠢的基本错误,但我似乎无法弄清楚。
【问题讨论】:
-
你能提供更多关于
cData的信息吗? -
72 是一个英文数字。程序员用256,sn-p这个代码当然完全没有意义。
-
我添加了一些关于 cData 的更多细节,但只是想提醒一下,这个项目在 VS 6 中编译和运行良好。这段代码已经使用了几年,没有修改过自 2007 年以来。
标签: visual-c++ dll com