2016-01-12 4 views
0

Я относительно новичок в программировании Windows и этом форуме. Как говорится в заголовке, я получаю эту ошибку, когда я пытаюсь запустить определенную программу на C, которую я написал. Программа скомпилирована как x64, работающая на 64-битной машине. Изменить: после того, как я нажму кнопку ОК во всплывающем окне, я получаю сообщение «Отказано в доступе». Код, который я не думаю, что не имеет ничего общего с этой проблемой следующим образом:получение ошибки во время выполнения: «program.exe недействительное приложение win32»

// 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 или с определенным сторонним .exe. Если это дублированный вопрос, пожалуйста, дайте мне знать. Несколько советов, которые я пробовал, заключались в том, чтобы закрыть Visual Studio и перезапустить его, а также закрыть и перезагрузить ПК. Один ответ указал на эту ссылку: https://superuser.com/questions/358434/how-to-check-if-a-binary-is-32-or-64-bit-on-windows. В соответствии с ответом .exe компилируется как приложение x86. Однако в верхней части экрана VS отображается x64, а также в Property-> Configuration Manager. Это обновление Visual Studio-2015 Community Edition 1.

Я получил исходную программу, хотя исходный код остался прежним. Но та же самая ошибка возникла в другой программе на C. Я попытался переустановить VS, но получил ошибку, когда попытался это сделать, поэтому я несколько застрял.

Есть ли способ устранить эту проблему?

+1

Unrelated к вашей проблеме, но спецификация C говорит, что 'main' должен быть объявлен в одном из двух способов, либо как функция, принимающая' void' и возвращает 'int', или принимает аргумент' int' и 'char * []' и возвращает 'int'. Если ваша функция 'main' не делает этого, то это технически неверная программа. –

+0

Спасибо за подсказку. Я внес изменения, и, как вы сказали, это не имело никакого значения. –

+1

@JoachimPileborg Это зависит от того, какой стандарт C используется. Что правильно в текущем стандарте, никто не знает, потому что в нем есть неопределенное выражение «... или каким-то другим способом, определенным реализацией». [См. Это] (http://stackoverflow.com/a/31263079/584518) ниже «C99 размещенная среда», со ссылками на обоснование C и другие части стандарта. Сам комитет, похоже, довольно смущен. – Lundin

ответ

0

этот заголовочный файл: #include «stdafx.h» на самом деле является составным скомпилированным заголовком всех файлов заголовков из этого исходного файла (и их зависимостей).

Если вы удаляли инструкции #include во время редактирования, визуальная студия могла удалить этот составной файл заголовка.

все операторы #include должны быть в исходном файле.

Существует несколько способов заставить визуальную студию удалить скомпилированный файл заголовка. Один из способов - прокомментировать утверждения #include.

+0

Как это относится к вопросу? –

+0

вопрос: почему «не действительный 32-битный исполняемый файл. Наиболее вероятной причиной является то, что файл фактически не компилируется. отсутствие доступных заголовочных файлов #include является наиболее вероятной причиной. Компиляция с включенными предупреждениями, а затем исправление этих предупреждений – user3629249

+0

также связано с тем, что вопрос говорит о его «про C», но имя файла «CrtFil2.cpp» говорит о «C++».Два совершенно разных языка. Существует большая вероятность того, что визуальная студия использует имя файла и пытается скомпилировать для C++, когда фактический код равен C. Учитывая ошибку с именем файла, мне также может возникнуть вопрос, был ли проект обозначен как «консольное» приложение или что-то еще. – user3629249

0

Лучше всего писать переносимый код, даже если он будет запускаться только в окнах.

так настоятельно рекомендую писать свои функции 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; 
} 
+0

Просто любопытно. В директивах компилятора, что проверяет '#if 0'? –

+0

'#if 0'' # else' и '# endif' являются препроцессорными директивами. Любая вещь, следующая за '#if 0', будет проигнорирована до тех пор, пока вы не захотите прочитать' # else' или '# endif': для получения дополнительной информации об этих (и других) предпроцессорных директивах – user3629249

+0

Спасибо за подсказку. –

Смежные вопросы