【问题标题】:Visual Studio Release Mode causes unexpected errorVisual Studio 发布模式导致意外错误
【发布时间】:2019-03-06 10:38:05
【问题描述】:

我必须使用 Visual Studio 使用 Windows API 制作一个简单的程序。我的代码在调试模式下运行良好,但是在发布模式下运行不佳,我不知道为什么。我剪切并粘贴了我的程序崩溃的部分。这是那部分。

#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#include <windows.h> 

int _tmain(int argc, TCHAR * argv[])
{
    TCHAR cmdString[] = "notepad.exe";
    STARTUPINFO si = { 0, };
    PROCESS_INFORMATION pi;

    si.cb = sizeof(si);

    BOOL ret = TRUE;
    CreateProcess(NULL, cmdString, NULL, NULL, TRUE,
        CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);

    _tprintf(_T("Error = {%d}\n", GetLastError()));

    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);

    system("pause");

    return 0;

}

打开notepad.exe的简单程序,对吧?在调试模式下运行良好,但在发布模式下无法打开记事本(程序在未打开 notepad.exe 的情况下结束)。

我试图在 S.O 中找到解决方案,例如 this link,但这对我没有多大帮助。

为什么 CreateProcess() 在发布模式下不能正常工作?

【问题讨论】:

  • 当你说“在发布模式下不起作用”时,你的意思是编译器在构建时给你一个错误吗?如果是这样,您是否显示了完整完整复制粘贴输出的消息?否则,你的意思是你运行程序的时候报错了吗?
  • 这看起来更像是一个调试器诊断,表明启用优化的变量已被优化掉并且不可检查。
  • 你已经知道isRun的值了。永远,永远不要写“它不起作用”的错误消息。绝对最小值是使用 GetLastError()。
  • 编辑后的代码完全没有错误处理...
  • @TonyAhn 那么GetLastEror() 返回的错误号是多少?

标签: c windows visual-studio release-mode


【解决方案1】:

我的猜测是,这完全是关于编译器优化,因为 this post 可以告诉你比我更好的方式。

因为 CreateProcess 正在返回(成功时)非零值。

尝试这样使用它:

BOOL ret = TRUE;
if(!CreateProcess(NULL, cmdString, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi))
      printf("Error = {%d}", GetLastError());
      ret = FALSE;

您甚至可以获得有关错误的一些详细信息。

【讨论】:

  • 感谢您的回答。顺便说一句,当我调试程序时,它只是绕过了'if'语句,即使我尝试了'step into'。所以我删除了 'if' 语句,只使用 printf 来获取错误代码。
  • @TonyAhn GetError() 返回的值只有在CreateProcess 返回FALSE 时才有意义。
  • 是的,你完全正确。但是如果CreateProcess 返回TRUE,那么notepad.exe 应该会打开,对吗?奇怪的是 CreateProcess 返回 TRUE 而 notepad.exe 不会打开。 (仅在发布模式下。在调试模式下正常工作)
  • GetLastError 在成功时返回 0。另一件事,对于 TCHAR : TCHAR cmdString[] = L"notepad.exe";你没有忘记 L 在你的 litteralS StringS 之前吗? (如果您使用 _tprintf,则错误相同)
猜你喜欢
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多