【问题标题】:Program doesn't run - it opens and closes程序不运行 - 它打开和关闭
【发布时间】:2014-03-12 23:02:05
【问题描述】:

我的主程序有问题,在我运行程序后进行的所有调用之后,它只是打开然后关闭。它在我的代码或任何东西中没有发现任何错误,所以我尝试创建一个新项目,它执行相同的操作,没有错误。

我什至尝试了示例代码:

int APIENTRY WinMain (HINSTANCE ...)
    ShellExecute(NULL, (LPCWSTR)"open", (LPCWSTR)"cmd.exe", NULL, NULL, SW_SHOW);

它仍然只是打开和关闭。这里有什么问题?如有必要,我可以提供输出日志,但我不知道。

【问题讨论】:

  • 程序运行,并在完成所有指令后关闭。您能否展示完整的程序并说明您认为它应该保持开放时间更长的原因。
  • 至于问题中的代码,是相当错误的。将 const char* 转换为 const wchar_t* 并没有做到这一点。每次使用演员表时,您都应该担心。您需要使用宽文本:L"open"。您还声称没有错误。但我没有看到您检查错误的任何证据。
  • @DavidHeffernan 执行时不应该打开 cmd.exe 吗?它不这样做,那么这意味着它如何编译?当我从发行版执行应用程序时,它应该执行 cmd.exe - 不是吗?我的意思是这就是我促使它做的事情。

标签: c++ c visual-studio winapi


【解决方案1】:

我不确定我是否理解您所说的打开和关闭是什么意思。但是这段代码非常错误:

ShellExecute(NULL, (LPCWSTR)"open", (LPCWSTR)"cmd.exe", 
    NULL, NULL, SW_SHOW);

演员阵容不好。这两个字符串文字是指向 char 数组的指针,将它们转换为 const wchar_t* 不会改变它们的本质。它只是要求编译器相信你比它更了解。你没有。他们真的不是const wchar_t*。您的所有演员都可以让您打破类型安全并将信息丰富的编译时错误转换为神秘的运行时故障。在您对语言有深入的了解之前,您应该避免强制转换。

你需要使用宽字面量:

ShellExecute(NULL, L"open", L"cmd.exe", NULL, NULL, SW_SHOW);

您似乎也没有进行错误检查。 ShellExecute 很难做到这一点。请尝试 ShellExecuteEx 并注意它返回的值。

【讨论】:

  • ShellExecuteEx 在使用 OllyDbg 调试时向我展示了我的错误 -> 它帮助我理解...谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-12
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多