当由vs2012构建的exe使用时,由vc6构建的DLL转向错误

时间:2014-03-01 08:39:45

标签: c++ visual-studio-2012 dll vc6

我有一个由vs2012构建的exe,它可以成功运行链接到vs2012构建的dll,而链接到vc6构建的同一个dll时会出现以下错误。 (表达式:_CrtIsValidHeapPointer(pUserData))

enter image description here

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。

1 个答案:

答案 0 :(得分:1)

要清楚,您是将使用VS2012构建的EXE与使用VC6构建的DLL混合使用?如果是这样,您正在混合C运行时库版本。虽然这是可能的,但您必须小心不要混合堆分配。例如,如果DLL分配内存并返回指针,并且EXE尝试释放指针,则可能导致您看到的错误。

使用相同的编译器编译DLL和EXE,或者在DLL中编写一个释放指针的函数,并使用该函数将分配的指针传递回DLL,以便由分配它的C运行时释放。