void add_log(const char* format, ...)
{
HANDLE filehandle;
DWORD dwReadBytes;
char buffer[2048];
char writebuffer[2048];
va_list args;
va_start(args, format);
vsprintf_s(buffer, format, args);
filehandle = CreateFile("C:\\Log.txt", GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0, 0);
SetFilePointer(filehandle, 0, 0, FILE_END);
time_t ltime;
ltime = time(NULL);
//sprintf_s(writebuffer, 2048, "%s: %s\n", asctime(localtime(<ime)), buffer);
sprintf_s(writebuffer, 2048, "%s", buffer);
WriteFile(filehandle, writebuffer, strlen(writebuffer), &dwReadBytes, 0);
CloseHandle(filehandle);
}
我有一个朋友介绍了这段代码,我已经在多个版本中使用了它。我主要用它来调试某些函数,但开始将它用作内部记录某些内容的常规方式,但我觉得它在某些情况下会导致问题,例如当我在经常调用的线程或函数中使用它们时。这个功能的工作原理有什么不安全的地方吗?
CreateFile()
失败并返回 NULL
,那么该函数将在不久之后尝试取消引用 NULL
文件句柄指针而崩溃。CreateFile()
失败和/或文件中的数据出现乱码(取决于文件系统如何优雅地处理对文件的不同步写入)相同的文件)sprintf_s()
或 vsprintf_s()
将调用 Win32 运行时的 invalid-parameter-handling function,默认情况下,该函数会中止您的程序并显示错误消息 - 可能不会你想要什么。