未处理的异常 - 如果 /SUBSYSTEM 参数更改,则访问冲突
Posted
技术标签:
【中文标题】未处理的异常 - 如果 /SUBSYSTEM 参数更改,则访问冲突【英文标题】:Unhandled Exception - Access violation if /SUBSYSTEM parameter is changed 【发布时间】:2014-04-10 07:02:42 【问题描述】:我有一个应用程序,在其中我使用console
来查看正在输出的一些值。现在一些要求已经改变,我在运行时不再需要console
。
我尝试通过将Project Properties->Linker->System->Subsystem
下的Project Properties->Linker->System->Subsystem
参数从Console
切换到Windows
来改变这一点,就像我在之前的事情上所做的那样,它已经奏效了。
在这种情况下,它在mfc110u.dll
中给了我一个未处理的异常,因为无法实例化该对象。
为什么会出现这个异常,还有什么方法可以关闭正在运行的程序的console
?我使用VS2012
作为开发环境。
【问题讨论】:
根据我的经验,当您在 mfc110u.dll 中遇到异常时,错误是在其他地方生成的。 是的,我很确定它不在MFC
中,如果 Subsystem 参数是“Console”,该项目可以正常工作,但如果我将其更改为“Windows”则无法正常工作。我想知道是什么,如果有的话,可能会导致这种情况。根据我的阅读,这会影响程序的入口点,并且在 DLL 中也有所反映,因为对象没有被实例化。那么该怎么办..
只要使用调试器!你甚至可以调试发布程序
是的,这就是问题所在。它编译,但运行失败,因为有一个未处理的异常,因为一个对象没有被实例化。 MFC
在 CreateInstance()
调用中失败,或者在附近。这可能是非常愚蠢的事情,但我不希望控制台在应用程序运行时出现。通过将参数从Windows
切换到Console
,我曾通过另一个应用程序调出控制台一次。我认为如果我不想要它,同样可以反过来工作。但它给出了未处理的异常。
【参考方案1】:
如果您不需要控制台,请声明一个 winmain。这是非unicode版本
#include <windows.h>
#include <iostream>
#include <cstdio>
int main (int, char**);
// If we just start with main, we will always get a console window
int WINAPI WinMain (
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
int argc = __argc;
char** argv = __argv;
#ifdef DEBUG
// If we are running in debug mode, open a console window
AllocConsole();
freopen("conin$", "r", stdin);
freopen("conout$", "w", stdout);
freopen("conout$", "w", stderr);
#endif
return main (argc, argv);
int main (
int argc,
char** argv
)
MessageBox(NULL, "Whoo hoo", "It Works!!!", MB_OK);
return 0;
【讨论】:
这应该是解决方案:Windows 程序有不同的入口点,称为 WinMain。如果您使用 FrameWork,例如 MFC,则它嵌套在某处。 啊,好的。我不明白这个机制。现在明白了。非常感谢。以上是关于未处理的异常 - 如果 /SUBSYSTEM 参数更改,则访问冲突的主要内容,如果未能解决你的问题,请参考以下文章
应用程序引发了未处理的异常。 System.ArgumentNullException:值不能为空。 (参数'uriString')
未处理的异常:将无效参数传递给认为无效参数致命的函数。在插入排序中[重复]
`未处理的异常:无效的参数:'_$_Category'的实例`在将数据发送到firestore时形成一个冻结的生成类
获得未处理的异常:System.ArgumentNullException