Visual studio 2010 VS2008到VS2010-配置和升级有问题-新手

Visual studio 2010 VS2008到VS2010-配置和升级有问题-新手,visual-studio-2010,debugging,upgrade,Visual Studio 2010,Debugging,Upgrade,我在下面的开头用一个执行摘要更新了这个问题。然后,如果需要的话,会有大量的细节。谢谢你的建议 执行摘要: 我是VS的新手。我对一些继承的代码有问题。代码在VS2008(XP64)上构建和执行良好。使用VS2008和/或VS2010在XP64或W7上生成和不运行相同的代码,或者生成失败。在更改了一些编译器选项之后,我设法让它在XP64上的VS2010上运行而没有问题;然而,在W7,没有运气 我最终发现堆正在被破坏 ae312i3.3.exe中0x76e540f2(ntdll.dll)处未处理的异常

我在下面的开头用一个执行摘要更新了这个问题。然后,如果需要的话,会有大量的细节。谢谢你的建议

执行摘要: 我是VS的新手。我对一些继承的代码有问题。代码在VS2008(XP64)上构建和执行良好。使用VS2008和/或VS2010在XP64或W7上生成和不运行相同的代码,或者生成失败。在更改了一些编译器选项之后,我设法让它在XP64上的VS2010上运行而没有问题;然而,在W7,没有运气

我最终发现堆正在被破坏

ae312i3.3.exe中0x76e540f2(ntdll.dll)处未处理的异常:0xC0000374:堆已损坏

我不熟悉如何考虑解决堆问题;可能现有代码中指向另一个线程或程序正在使用的内存的指针存在问题,ntdll.dll文件损坏,其他

重新启动电脑检查ntdll.dll是否已损坏没有帮助。已更改调试设置,并收到以下反馈:

堆[ae312i3.3.exe]:为RtlSizeHeap指定的地址无效(0000000000 220000,00000000 2BC8BE58) Windows已在ae312i3.3.exe中触发断点

这可能是由于堆损坏,这表明ae312i3.3.exe或其加载的任何DLL中存在错误。这也可能是由于ae312i3.3.exe具有焦点时用户按F12造成的

<强>当崩溃时,C++将布尔变量返回到窗体>/P>的表达式

While(myQueryFcn(inputvars))

  • 问题:
<>所以,它不是将C++布尔返回到VB布尔吗?我确实相信这两种表示法是不同的(一种使用真/假,另一种使用整数?),这会是一个问题吗?如果是,为什么在VB2008中它不是一个问题**

< > >或者,也许是C++代码已经写入分配的内存,当返回到VB时,它崩溃了??< /强> < /p> **我最近学习了“Insure++”,并将尝试使用它来跟踪问题。对它的使用有什么建议吗?还有其他可能的见解吗**

如果有任何建议,我将不胜感激。再次感谢

。 . . .

导致上述总结的详细信息(如下):

我是VS2010的新手;熟悉工程应用程序(Python,FORTRAN)编程,但自从我广泛使用C++以来,已经有几十年了,但不是专业程序员。 我有一个由多个项目组成的解决方案,都在VS2008中。项目包括: 阅读器(C++项目;利用第三方DLL) 查询(C++项目;取决于读者) Main(VB;取决于读取器和查询)

以下内容适用于XP64操作系统。 解决方案和项目是由我以外的人编写、构建和发布的。 我已经取得了现有的文件,并制作了一份副本,放在我选择的目录中,然后简单地在VS2010中打开(我的电脑上没有安装VS2008)。我能够成功地构建(尽管有很多警告——稍后会有更多的警告);但是当我运行可执行文件时,它会到达一个点并崩溃。经过多次尝试和错误,我发现修改编译器设置对我来说解决了以下问题:

它将在调试配置中构建和执行,但在发行版中没有。我发现,在查询Project Projage属性页/配置属性/C++ +优化/优化>释放(X64)配置中使用“最大速度(/O2)”,而调试使用“禁用(/OD)”->因此,我切换到“禁用(/OD)”。 此外,查询的项目属性页/配置属性/常规/整个程序优化-->需要设置为“使用链接时代码生成”

在VS2010的XP64上成功运行了上述构建。

接下来,我只是简单地复制了文件,并将副本放在带有VS2010的W7机器上。通过2010打开了解决方案,它自动“升级”了文件。当我启动VS2010时,它会自动显示以下4个警告。它们是:

  • 用于运算符“&”的对象类型的操作数;可能发生运行时错误。在文件“CobraIFile.vb”第1845行第37列中
  • 完全相同的错误
  • 通过实例访问共享成员、常量成员、枚举成员或嵌套类型;将不计算限定表达式。在文件“FileWriter.vb”第341行第51列中
  • 用于运算符“=”的对象类型的操作数;使用“Is”运算符测试对象标识。在“FormMain.vb”文件中;第4173行,第32列
  • 1和2中的警告代码如下所示 ValueStr=String.Empty 对于iCols=0到DGrid.Columns.Count-1 ValueStr&=DGrid.Item(iCols,iRows).Value&“;”//这是警告线!!! 下一个

    警告3的代码:

        With FormMain
            WriteComment("")
            WriteComment("Generated by :")
            WriteComment("")
            WriteComment("  Program         : " & .PROGRAM.ToUpper) // THIS IS WARNING LINE!!!
    
    警告4的代码:

        ' Compare material against the material table
        For iRowMat As Integer = 0 To matCount - 1
            ' Ignore new row
            If Not .Rows(iRowMat).IsNewRow Then
                ' Check material description
                // LINE BELOW IS WARNING LINE!!!
                If .Item("ColMatDesc", iRowMat).Value = matDesc Then
                    DataGridMatProp.Item("ColMatIdx", iRow).Value = .Item("ColMatFile", iRowMat).Value
                    Exit For
                End If ' Check description
            End If ' Check new row
        Next iRowMat
    
    当我构建解决方案时,它将成功构建,没有错误(但有许多警告),当我运行可执行文件时,它成功加载GUI,但在执行查询或读取器项目(使用GUI按钮执行操作后)时(在执行以下信息后)会崩溃:

        C:\Users\mcgrete\AppData\Local\Temp\WER5D31.tmp.WERInternalMetadata.xml
        C:\Users\mcgrete\AppData\Local\Temp\WER68E6.tmp.appcompat.txt
        C:\Users\mcgrete\AppData\Local\Temp\WER722A.tmp.mdmp
    
    我无法利用上面三个文件中的信息(不知如何考虑)。 我在W7中收到的警告与XP64中的警告非常相似/如果不完全相同的话;它们大致有以下几种类型,有1600多种。将上面列出的4个原始警告添加到下面的警告类型中。由于我成功地在XP64上运行,而不是在W7上运行,我假设/希望这些问题不需要单独解决,而只是警告

  • 警告C4267:“参数”:从“size\u t”转换为“int”,可能会丢失数据。C:\Users\mcgrete\Documents\iCOBRA\pts\p312\exec\win64\6111\include\atr\St
    OdbQueryGetIncrement(str_out, vec_ptr)
    
        //Gets the next item in a list.
        // Returns false if there is the vector is empty.
        // NOTE: Once an element is returned it is removed from the list.
        bool __stdcall OdbQueryGetItem(
                        char* &str_out,  // RETURN Next item in list.
                void * vec_ptr, // Pointer to the vector of pointers.
                int index)  // Index of pointers vector to return next item of.
        {
            // Cast the point into an array of pointers
            std::vector<std::string>* *vec_temp = (std::vector<std::string>* *) vec_ptr;
            bool bool_out = false;
    
            char vectempsize[1000];
            int TEM1;
            char temp[1000];
            TEM1 = vec_temp[index]->size();
            // Check vector is valid
            if (vec_temp) {
                if(vec_temp[index]->size() >= index)
                {
                    sprintf(temp,"value: %d\n",(int)bool_out);
                    ::MessageBoxA(0, (LPCSTR) temp, (LPCSTR) "OdbQuery.dll - bool_out", MB_ICONINFORMATION);
                    sprintf(temp,"value: %d\n",(int)index);
                    ::MessageBoxA(0, (LPCSTR) temp, (LPCSTR) "OdbQuery.dll - index", MB_ICONINFORMATION);
                    sprintf(vectempsize,"value: %d\n",(int)TEM1);
                    ::MessageBoxA(0, (LPCSTR) temp, (LPCSTR) "OdbQuery.dll - index", MB_ICONINFORMATION);
                }
    
                if (!vec_temp[index]->empty()) {
                    // Get the next item in the list
                    std::string item = vec_temp[index]->front();
                    // Initialise ouput string
                    str_out = (char*)malloc( item.size()*sizeof(char) );
                    sprintf(str_out, "%s", item.c_str());
    
                    ::MessageBoxA(0,(LPCSTR) str_out, (LPCSTR) "hello", 0);
                    // Remove first item from the vector
                    vec_temp[index]->erase(vec_temp[index]->begin());
                    bool_out = true;
                }
            }
    
          sprintf(temp,"value: %d\n",(int)bool_out);
          ::MessageBoxA(0, (LPCSTR) temp, (LPCSTR) "OdbQuery.dll - bool_out", MB_ICONINFORMATION);
          return bool_out;
        }
    
    str_out=(char*)malloc( (item.size()+1)*sizeof(char) );