我有一个我已经工作了几个星期的程序,过去几天我做了一些很大的改动,我现在无法弄清楚为什么程序不能在VC +之外工作+2010环境。
当我打开项目时,程序运行完美,从Solution Configurations下拉列表中选择Release或Debug,然后点击F5。但是当我从Release / Debug文件夹中获取可执行文件时,将其放在可以访问我正在使用的资源的位置,然后运行它,它会加载几秒钟,然后显示这个可爱的错误“Project.exe has停止工作 - Windows正在检查问题的解决方案......“当然,像往常一样,Windows无法找到问题的解决方案。
在您阅读所有这些代码之前的快速免责声明:虽然错误是由代码更改引起的,但是由于我一次更改了一些内容而导致它的变化是值得怀疑的 - 我知道这是愚蠢的,但它发生了。我发布了最可能的错误来源的代码。如果您信任我的编码习惯,请滚动到“我的第二个想法:”。
我最近做出的最大改变涉及我的输入处理程序,并通过函数指针集成了键绑定(我没有任何经验)。我在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::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 ++环境内外,我怀疑它不是问题。
我在自己询问之前搜索了一会儿,并在Stack Overflow上发现了这个nearly identical question。对我来说可悲的是,它仍然没有答案。
我还发现了this tool(称为依赖性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
很难了解这些功能。
我的第二个想法:
只有3件事(根据Vivian De Smedt)在IDE内部或外部运行时会发生变化:
1。)传递给程序的参数。 //perhaps
2。)应用程序的工作目录。 //has not changed
3。)环境变量,如果你在启动Visual Studio之后更改了它们(或者如果你使用这样的启动器启动了启动器之后:例如:Explorer ++)//I suspect this to be the problem. Ideas?
我在这个问题上彻底迷失了,我花了很多时间来撰写这个问题。任何建议都非常感谢。我会在15分钟左右,所以如果我在任何地方失去你,请要求澄清:)
答案 0 :(得分:2)
xP抱歉浪费你的时间,伙计们。我完全带领你走错了方向。除以0是由于%
运算符位于两个未初始化变量的中间。
对于阅读此内容的人来说,这是一件有趣的事情:
uninitialized_variable1 % uninitialized_variable2
是一个没有附加调试器的错误,而它在调试器的环境中评估为零。
答案 1 :(得分:0)
这样做。让我们假装您将EXE命名为Foo.exe。
执行项目的完整清理构建并进行新的Debug构建。
将 Foo.exe 和 Foo.pdb 的Debug版本复制到您无法运行的其他目录。
< / LI>启动Visual Studio,但没有打开任何项目。
从“文件”菜单中选择“文件” - &gt;打开项目/解决方案。
将Open Project控制器导航到您将二进制文件复制到的目录。
选择Foo.exe作为项目。这将为您编译的二进制文件启动一个调试项目。
现在按照惯例开始调试(例如按F11 - Step Into)。如果一切顺利,您将调试会话分为main或WinMain的第一行。系统可能会提示您输入源目录的位置,但是您应该能够以与项目放置目录不足相同的方式调试项目。 (根据需要设置断点,继续,单步执行,观察变量等。)