在VC ++ 2010环境之外运行时,程序立即崩溃

我有一个程序,我一直在努力了好几个星期,我在过去几天做了一些重大的改变,现在我不知道为什么该程序无法在VC ++ 2010环境之外工作。

当我打开项目时,程序运行完美,从Solution Configurations下拉列表中selectRelease或Debug,然后按F5。 但是,当我从Release / Debug文件夹中获取可执行文件时,将其放在可以访问我正在使用的资源的位置,然后运行它,加载几秒钟,然后显示这个可爱的错误“Project.exe has停止工作 – Windows正在检查问题的解决scheme…“当然,像往常一样,Windows无法find解决问题的办法。

在阅读所有这些代码之前,快速免责声明:虽然错误是由代码的变化引起的,但是由于我一次更改了几件事情,导致它的变化是值得怀疑的 – 我知道这是愚蠢的,但是它发生了。 我已经发布了最可能的错误来源的代码。 滚动到“我的第二个想法:”如果你相信我的编码习惯。


我所做的最近的最新变化涉及我的input处理程序,并通过函数指针(我没有任何经验)整合keybinds。 我在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类,如下所示:

class Application;

我在Application::Initialize()填充这些数组(这里我定义了很多键,所以这里是摘录):

 m_RawInput->onMouseMove[0] = &Application::mouseMoveX; m_RawInput->onMouseMove[1] = &Application::mouseMoveY; 

Application::mouseMoveXApplication::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_appg_app中定义为extern Application *g_app 。 自从程序的概念以来,我使用了g_app ,这绝对不是问题。

我在这个更新中遇到的第一个问题是空函数指针,但是现在我在调用任何函数之前先检查指定函数的有效性和g_app的有效性。 无论如何,这个错误会发生在VC ++环境之外,我怀疑这不是问题。


我search了一会儿,然后问自己,发现堆栈溢出几乎相同的问题 。 可悲的是,它仍然没有答案。


我也发现了这个工具 (称为依赖walker),它经历了一个可执行文件的所有依赖关系,并让你知道是否有一些没有find。 它无法find(我无法find一个明确的版本)这些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很难知道这些函数。

我的第二个想法:

根据Vivian De Smedt的说法,只有3件事情在IDE内部或外部运行时发生变化:

1.)传递给程序的参数。 //perhaps

2.)应用程序的工作目录。 //has not changed

3.)如果您在启动Visual Studio之后更改了环境variables(或者如果您使用此类启动程序启动启动程序后:例如:Explorer ++) //I suspect this to be the problem. Ideas? //I suspect this to be the problem. Ideas?


我在这个问题上彻底失败了,而且我花了大量的时间来撰写这个问题。 任何build议,非常感谢。 我会在15分钟左右,所以请要求澄清,如果我失去了你的任何地方:)

对不起,浪费你的时间,伙计们。 我完全把你带向了错误的方向。 除以0是由于两个未初始化变量中间的%操作符。

对于读这个的人来说,这只是一个有趣的事情:

uninitialized_variable1 % uninitialized_variable2是在调试器环境下计算为零时没有附加调试器的错误。

做这个。 让我们假装你EXE被命名为Foo.exe。

  1. 做一个完整的干净版本的项目,并建立一个新的调试版本。

  2. 将您的Foo.exeFoo.pdb的Debug版本复制到您无法运行的其他目录中。

  3. 启动Visual Studio,但没有打开项目。

  4. 从文件菜单中,选择文件 – >打开项目/解决方案。

  5. 浏览Open Project director到您复制二进制文件的目录。

  6. 选择Foo.exe作为项目。 这将启动您编译的二进制文件的调试项目。

  7. 现在就像平常一样开始调试(例如按F11 – Step Into)。 如果一切顺利,你将有一个调试会话被分解成main或WinMain的第一行。 您可能会被提示输入源目录的位置,但除此之外,您应该可以像调试项目放置目录一样调试项目。 (根据情况设置断点,继续,进入,观察变量等)。