我有一个由vs2012构建的exe,它可以成功运行链接到vs2012构建的dll,而链接到vc6构建的同一个dll时会出现以下错误。 (表达式:_CrtIsValidHeapPointer(pUserData))
vc6和vs2012的dll项目之间的唯一区别是vc6无法#include“SDKDDKVer.h”
这是dll
的导出功能的代码extern "C" _declspec(dllexport) RobotAI_Interface* Export()
{
return (RobotAI_Interface*)new RobotAI();
}
extern "C" _declspec(dllexport) void FreeRobotAIPointer(RobotAI_Interface* p)
{
delete p;
}
当debuging(系统代码)时,程序在这个特定点断开:
extern "C" _CRTIMP int __cdecl _CrtIsValidHeapPointer(const void * pUserData)
{
if (!pUserData)
return FALSE;
if (!_CrtIsValidPointer(pHdr(pUserData), sizeof(_CrtMemBlockHeader), FALSE))
return FALSE;
return HeapValidate( _crtheap, 0, pHdr(pUserData) );
->}
箭头是它破碎的地方。
以下是我破解的代码:
void CArmorClientDlg::AddToList(CString file_path_name)
{
pAIManager->Add(file_path_name);
string dll_name=pAIManager->GetAI_RobotName(pAIManager->GetAINum()-1);
CListBox* pList=static_cast<CListBox*>(GetDlgItem(IDC_LIST_AI));
pList->AddString((CString)dll_name.c_str());
->}
箭头是它打破的地方。与dll相关的所有操作都在“Add(file_path_name)”
中完成我对dll事情知之甚少......如何解决问题? 谢谢!
提示:我必须支持vc6 dll的原因是该项目是AI竞赛,dll是由不同的contastents构建的AI程序。我学校的大多数学生只能使用vc6。
答案 0 :(得分:1)
要清楚,您是将使用VS2012构建的EXE与使用VC6构建的DLL混合使用?如果是这样,您正在混合C运行时库版本。虽然这是可能的,但您必须小心不要混合堆分配。例如,如果DLL分配内存并返回指针,并且EXE尝试释放指针,则可能导致您看到的错误。
使用相同的编译器编译DLL和EXE,或者在DLL中编写一个释放指针的函数,并使用该函数将分配的指针传递回DLL,以便由分配它的C运行时释放。