Visual C++ сообщает, что недопустимый параметр был передан fclose
, причем этот параметр является FILE*
возвращаемым freopen_s:
#include <WinSock2.h>
#include <iostream>
int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) {
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(nCmdShow);
#ifdef _DEBUG
AllocConsole();
#else
AttachConsole(ATTACH_PARENT_PROCESS);
#endif
FILE* pCout;
freopen_s(&pCout, "conout$", "w", stdout); //returns 0
fclose(pCout);
#ifdef _DEBUG
system("pause");
#endif
FreeConsole();
return 0;
}
Должен ли я не пытаться закрыть conout $ в конце программы? Исключено ли исключение, поскольку указатель файла разделяется между процессами для всех консольных выходов?
Вызов fclose
не работает, потому что вы передаете пустой FILE*
. FILE*
имеет значение null, поскольку вызов freopen_s
завершается с ошибкой. Этот вызов завершается с ошибкой, потому что в процессе нет консоли, которую нужно открыть.
Ваша программа работает в отладочных сборках, потому что вы вызываете AllocConsole
для выделения консоли для вашего процесса. Ваша программа не работает в сборках релизов, потому что вы не вызываете AllocConsole
; вы вызываете AttachConsole
, который не будет работать (и не имеет эффекта), если родительский процесс не имеет консоли.
freopen_s
? (Если вы собираетесь вызвать_s
вариант, вам нужно проверить возвращенный статус.)