出现运行时错误:“program.exe 不是有效的 win32 应用程序”

Posted

技术标签:

【中文标题】出现运行时错误:“program.exe 不是有效的 win32 应用程序”【英文标题】:getting runtime error: "program.exe not a valid win32 application" 【发布时间】:2016-01-12 12:20:42 【问题描述】:

我对 Windows 编程和这个论坛比较陌生。正如标题所说,每当我尝试运行我编写的特定 C 程序时,都会收到此错误。该程序被编译为在 64 位机器上运行的 x64。编辑:按弹出窗口上的确定按钮后,我收到“访问被拒绝”消息。我认为与问题无关的代码如下:

// CrtFil2.cpp : Defines the entry point for the console application.
//


#include "stdafx.h"
#include "string.h"

//#include BasInc2.c
//#include FilMst2.c

FILE * Opn(char PthNam[], char OpnMod[]);


void main()

    FILE    * FilMstFilPtr = NULL;

    FilMstFilPtr = Opn("\\temp\\test.file", "wb");
    printf("filptr=0x%p\n", FilMstFilPtr);
    return;


//******************************************************************************
//  Open a file.
//******************************************************************************
FILE * Opn(char PthNam[], char OpnMod[])

    FILE    * FilPtr = NULL;

    errno = fopen_s(&FilPtr, PthNam, OpnMod);
    if (errno != 0) 
        printf("%s\n", PthNam);
        perror("Could not open file");
        return NULL;
    
    printf("file opened for mode %s\n", OpnMod);
    return FilPtr;

我在构建中得到以下输出:

1>------ Build started: Project: CrtFil2, Configuration: Debug x64 ------ 1> CrtFil2.cpp 1> CrtFil2.vcxproj -> C:\$SmpSysLib\$QsysS\CrtFil2\x64\Debug\CrtFil2.exe ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

这一直有效到大约一个小时前。然后我评论了一些行,它停止工作了。我查看了搜索中提供的前 50 个答案,其中大多数涉及在 XP 或特定的第 3 方 .exe 上运行。如果这是一个重复的问题,请告诉我。我尝试过的几个建议是关闭 Visual Studio 并重新启动它,以及关闭并重新启动 PC。一个答案指向此链接:https://superuser.com/questions/358434/how-to-check-if-a-binary-is-32-or-64-bit-on-windows。根据答案,.exe 被编译为 x86 应用程序。然而,在 VS 显示的顶部,它显示 x64 以及属性-> 配置管理器。这是在 Visual Studio-2015 社区版更新 1 上。

即使源代码保持不变,我的原始程序也能正常工作。但同样的错误出现在不同的 C 程序上。我尝试重新安装 VS,但尝试执行此操作时出错,所以我有点卡住了。

有没有办法解决这个问题?

【问题讨论】:

与您的问题无关,但 C 规范说 main 必须以两种方式之一声明,或者作为接受 void 参数并返回 int 的函数,或者采用intchar *[] 参数并返回 int。如果你的 main 函数没有做任何这些,那么它在技术上是一个无效的程序。 感谢您的提示。我进行了更改,正如您所建议的那样,它没有任何区别。 @JoachimPileborg 这取决于使用的 C 标准。当前标准中什么是正确的,没有人真正知道,因为它有模糊的“......或以其他一些实现定义的方式”的句子。 See this 在“C99 托管环境”下方,参考了 C 基本原理和标准的其他部分。委员会自己似乎对此感到很困惑。 @Lundin 这不像我的床头柜上有说明书并在床上阅读(尽管快速入睡会很好)所以我不知道。我同意,“..或以其他一些实现定义的方式”是非常含糊的,真的不应该出现在这样的正式规范中。 @Lundin:只有一个 C 标准:C11。其中包含一个脚注:port70.net/~nsz/c/c11/n1570.html#note10(C99 包含相同的脚注)。 【参考方案1】:

此头文件:#include "stdafx.h" 实际上是该源文件(及其依赖项)中所有头文件的复合编译头。

如果您在编辑期间删除了#include 语句,Visual Studio 可能已删除该复合头文件。

所有#include 语句都必须在源文件中。

有几种方法可以使 Visual Studio 删除已编译的头文件。一种方法是注释掉#include 语句。

【讨论】:

这与问题有什么关系? 问题是:为什么'不是有效的 32 位可执行文件。最可能的原因是该文件实际上并未完全编译。最可能的原因是没有可用的#include 头文件。在启用所有警告的情况下编译,然后修复这些警告 同样相关的是问题说它是关于 C 的,但文件名 CrtFil2.cpp 说它是关于 C++ 的。两种截然不同的语言。当实际代码为 C 时,Visual Studio 很可能正在使用该文件名并尝试为 C++ 编译。鉴于文件名错误,我可能还想知道该项目是否被指定为 console 应用程序或完全不同的东西。 @user3629249:在 Visual Studio 中,源代码始终以 CPP 形式出现,但 C 代码编译得很好。编译没有问题,只是在尝试运行时出现此错误。【参考方案2】:

最好编写可移植的代码,即使只在 Windows 上运行。

强烈建议您像这样编写 C 函数:

#define _CRT_SECURE_NO_DEPRECATE
//#include "stdafx.h
#include <stdio.h>
#include <string.h>
#include <errno.h>


FILE * Opn(char PthNam[], char OpnMod[]);


int main( void )

    FILE    * FilMstFilPtr = NULL;

    FilMstFilPtr = Opn("\\temp\\test.file", "wb");
    printf("filptr=0x%p\n", (void*)FilMstFilPtr);
    return 0;


//*****************************************************************
//  Open a file.
//*****************************************************************
FILE * Opn(char PthNam[], char OpnMod[])

    FILE    * FilPtr = NULL;

    #if 0
    errno = fopen_s(&FilPtr, PthNam, OpnMod);
    if (errno != 0) 
        printf("%s\n", PthNam);
        perror("Could not open file");
        return NULL;
    
    #else
    if( NULL == (FilPtr = fopen( PthNam, OpnMod ) ) )
    
        fprintf( stderr, "fopen failed for %s with mode: %s due to: %s\n", 
                 PthNam, OpnMod, strerror( errno ) );
    
    else
        printf("file opened for mode %s\n", OpnMod);
    #endif
    return FilPtr;

【讨论】:

只是好奇。在编译器指令中,#if 0 检查什么? #if 0 #else#endif 是预处理器指令。在#else#endif 您可能想阅读之前,#if 0 之后的任何内容都将被忽略:fresh2refresh.com/c-programming/c-preprocessor-directives> 了解有关这些(和其他)预处理器指令的更多详细信息

以上是关于出现运行时错误:“program.exe 不是有效的 win32 应用程序”的主要内容,如果未能解决你的问题,请参考以下文章

在颤振上运行构建运行程序时,出现以下错误

运行程序时,出现错误:应用程序运行失败 [关闭]

当我尝试运行此代码时,出现以下错误

excel运行VBA,出现1004错误

代码中出现运行时 1004 错误

运行php代码时,出现错误提示