Visual studio 2010 为什么我可以用c++/CLI? 我一直在努力编写一个解决方案,从C++ Wi32控制台和C++ DLL中退出。我最终设法让它们在没有链接器错误的情况下进行对话(因此我假设两者都是完全受管理的c++/CLI项目),但是当我运行控制台时,我得到了以下错误

Visual studio 2010 为什么我可以用c++/CLI? 我一直在努力编写一个解决方案,从C++ Wi32控制台和C++ DLL中退出。我最终设法让它们在没有链接器错误的情况下进行对话(因此我假设两者都是完全受管理的c++/CLI项目),但是当我运行控制台时,我得到了以下错误,visual-studio-2010,visual-c++,c++-cli,tchar,Visual Studio 2010,Visual C++,C++ Cli,Tchar,中0x03f71849处的未处理异常 Company.Pins.Bank.Win32Console.exe: 0xC0000005:访问冲突写入 位置0x00000001 控制台还显示以下内容 未处理的异常: System.NullReferenceException:对象 引用未设置为的实例 对象在c:…\win32console.cpp:line中的wmain处 20 at wmainCRTStartup() 但我假设这是因为未处理的异常 跟踪此错误以及我可以在下面的代码块中执行返回时发生的

中0x03f71849处的未处理异常 Company.Pins.Bank.Win32Console.exe: 0xC0000005:访问冲突写入 位置0x00000001

控制台还显示以下内容

未处理的异常: System.NullReferenceException:对象 引用未设置为的实例 对象在c:…\win32console.cpp:line中的wmain处 20 at wmainCRTStartup()

但我假设这是因为未处理的异常

跟踪此错误以及我可以在下面的代码块中执行返回时发生的错误。(由返回链接的方法似乎一步到位,就在返回时它似乎变差了。)如果您没有注意到,我没有自己编写下面的代码,它是由visual studio生成的。

#ifdef WPRFLAG
int wmainCRTStartup(
#else  /* WPRFLAG */
int mainCRTStartup(
#endif  /* WPRFLAG */

#endif  /* _WINMAIN_ */
        void
        )
{
        /*
         * The /GS security cookie must be initialized before any exception
         * handling targetting the current image is registered.  No function
         * using exception handling can be called in the current image until
         * after __security_init_cookie has been called.
         */
        __security_init_cookie();

        return __tmainCRTStartup();
}

#include "stdafx.h"
#include "UInstruction.h"

#define DllExport  __declspec(dllexport)
#define DllImport  __declspec(dllimport)

using namespace System;
编辑:下面是win32console.cpp代码

//int main(array<System::String ^> ^args)
int _tmain(int argc, _TCHAR* argv[])
{
    auto P2 = (TCHAR *)"3 Barrowstead";
    TCHAR* P3 = (TCHAR *)"3 Barrowstead";
    double* P1;
    P1[0] = 13;

    UserInstruction(P1, P2, P3);
}
//int main(数组^args)
int _tmain(int argc,_TCHAR*argv[]
{
自动P2=(TCHAR*)“3巴洛斯梯德”;
TCHAR*P3=(TCHAR*)“3巴洛斯泰德”;
双*P1;
P1[0]=13;
用户指令(P1、P2、P3);
}

您声明了一个指针,但没有初始化它,因此它不会指向对象(它包含一些垃圾地址):

然后尝试写入此未初始化指针指向的任何位置:

P1[0] = 13;
不能使用未初始化的变量。您需要初始化
P1
以指向某个对象,然后才能取消引用它

double* P1;
未初始化。然后尝试将其第一个条目设置为13。爆炸、访问冲突或更糟的情况

这些代码段中的任何一个都可以工作:

double P1;
P1 = 13;
UserInstruction(&P1, P2, P3);


将字符串文字转换为
TCHAR*
是未定义的行为,就好像定义了UNICODE,那么
TCHAR*
将变成
wchar\u t*
,而字符串文字不是
wchar\u t*
,并且此指针转换是未定义的。

使用UNICODE构建时,以下语句也是错误的:

  auto P2 = (TCHAR *)"3 Barrowstead";
  TCHAR* P3 = (TCHAR *)"3 Barrowstead"; 
因为您正在将普通(char)数组强制转换为wchar\t指针

如果使用UNICODE进行构建,则应在以下方面进行更改:

  LPCTSTR P2 = _T("3 Barrowstead");
  LPCTSTR P3 = _T("Barrowstead"); 

我通过以下方式找到了错误:

  • 错误不是在这一行突然出现的
  • 它实际上是在我记忆中的最后一个位置
我已使用以下方法复制向量:

memcpy(&pined_ptr[0],&unmanagedvector[0],sizeofunmanagedvector);
问题是
pine\u PRT SIZE
!愚蠢的错误

这打乱了所有的托管内存,后来又扩展了几行和函数


如何在代码中查找:禁用代码范围,直到代码不崩溃。

您是否介意共享
win32console.cpp
?我添加了代码,但它从未在断点处到达。这可能意味着我为了让它工作而弄坏了什么东西。
  auto P2 = (TCHAR *)"3 Barrowstead";
  TCHAR* P3 = (TCHAR *)"3 Barrowstead"; 
  LPCTSTR P2 = _T("3 Barrowstead");
  LPCTSTR P3 = _T("Barrowstead"); 
memcpy(&pined_ptr[0],&unmanagedvector[0],sizeofunmanagedvector);