我有一个程序我已经工作了几个星期,在过去的几天里我做了一些大的改变,现在我不明白为什么这个程序在 VC++2010 环境之外不起作用.
当我打开项目时,程序完美运行,从解决方案配置下拉菜单中选择发布或调试,然后按 F5。但是,当我从 Release/Debug 文件夹中获取可执行文件时,将其放在可以访问我正在使用的 Assets 的位置,然后运行它,它会加载几秒钟,然后显示这个可爱的错误“Project.exe has停止工作 - Windows 正在检查问题的解决方案......”当然,像往常一样,Windows 无法找到问题的解决方案。
在阅读所有这些代码之前快速免责声明:虽然错误是由代码更改引起的,但不确定是哪个更改引起的,因为我一次更改了一些东西 - 我知道这很愚蠢,但它发生了.我已经从最可能的错误来源发布了代码。如果您相信我的编码习惯,请滚动到“我的第二个想法:”。
我最近所做的最大更改涉及我的输入处理程序,并通过函数指针集成键绑定(bind)(我没有任何经验)。我在 RawInput
中定义了一个函数指针数组像这样上课:
typedef void (Application::*AppFunc)(void);
typedef void (Application::*AppFuncDelta)(int delta);
AppFunc onKeyPress[256];
AppFunc onKeyRelease[256];
AppFunc onMouseButtonPress[5];
AppFunc onMouseButtonRelease[5];
AppFuncDelta onMouseMove[3];
我已通知
RawInput
类到 Application
通过直接在其自己的类定义上方声明原型(prototype)来类,如下所示:class Application;
我在
Application::Initialize()
中像这样填充这些数组(我定义了很多键,所以这里是一个摘录):m_RawInput->onMouseMove[0] = &Application::mouseMoveX;
m_RawInput->onMouseMove[1] = &Application::mouseMoveY;
哪里
Application::mouseMoveX
和 Application::mouseMoveY
采用 int
的函数参数并且不返回值。这些函数在
RawInput::Interpret(LPARAM lParam)
内部调用像这样:if (raw->data.keyboard.Flags & RI_KEY_BREAK) //key released
{
if (onKeyRelease[raw->data.keyboard.VKey] && g_app) (g_app->*onKeyRelease[raw->data.keyboard.VKey])();
return;
}
else //key pressed down
{
if (onKeyPress[raw->data.keyboard.VKey] && g_app) (g_app->*onKeyPress[raw->data.keyboard.VKey])();
return;
}
g_app
在 input.cpp
中定义如 extern Application *g_app
.我用过 g_app
既然方案的构思,也绝对不是问题。我在这个更新中遇到的第一个问题在于一个空函数指针,但现在我运行检查指定函数的有效性和
g_app
的有效性。在调用任何函数之前。无论如何,这个错误会在 VC++ 环境内部和外部发生,我怀疑这不是问题。在我自己询问之前,我搜索了一段时间并找到了这个 nearly identical question也在 Stack Overflow 上。对我来说可悲的是,它仍然没有答案。
我也发现了this tool (称为dependency walker),它遍历可执行文件的所有依赖项,并让您知道是否找不到其中的某些依赖项。它找不到(我也找不到最终版本)这些 DLL:
API-MS-WIN-APPMODEL-RUNTIME-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-ERROR-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-ROBUFFER-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-STRING-L1-1-0.DLL
API-MS-WIN-SHCORE-SCALING-L1-1-1.DLL
DCOMP.DLL
GPSVC.DLL
IESHIMS.DLL
我的两个想法之一是
RawInput
不能调用它不知道的函数 - 并且它不知道 Application
中的任何函数.但是我现在的#include
层次结构使 RawInput
变得非常困难了解这些功能。我的第二个想法:
当程序在 IDE 内部或外部运行时,只有 3 件事(根据 Vivian De Smedt )会发生变化:
1.) 传递给程序的参数。
//perhaps
2.) 应用程序的工作目录。
//has not changed
3.) 如果在启动 Visual Studio 后更改环境变量(或者如果使用此类启动器,则在启动启动器后更改它们:例如:Explorer++)
//I suspect this to be the problem. Ideas?
我完全迷失在这个问题上,我花了大量时间来提出这个问题。任何建议都非常感谢。我会在 15 分钟内,所以如果我在任何地方失去了你,请要求澄清:)
最佳答案
xP 抱歉浪费你的时间,伙计们。我完全把你引向了错误的方向。除以 0 是由于 %
两个未初始化变量中间的运算符。
对于任何阅读此内容的人来说,这只是一种有趣的事情:uninitialized_variable1 % uninitialized_variable2
是一个没有附加调试器的错误,而它在调试器的环境中评估为零。
关于c++ - 在 VC++2010 环境之外运行时程序立即崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20872122/