出现运行时错误:“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
的函数,或者采用int
和 char *[]
参数并返回 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 应用程序”的主要内容,如果未能解决你的问题,请参考以下文章