将无效参数传递给将无效参数视为致命的函数

An invalid parameter was passed to a function that considers invalid parameters fatal

本文关键字:无效 函数 参数传递 参数      更新时间:2023-10-16

我希望你能帮助我。我有这个函数,我用来保存位图图像,但我在文件名方面遇到了问题。我想在文件名上保存带有当前日期的图像,但我目前的做法是它给了我"将无效参数传递给认为无效参数致命的函数"错误,程序崩溃。

这是从主程序获取名称的函数:

void DoSave(char *Name)
{
    time_t rawTime;
    struct tm *timeInfo;
    char buffer[100];
    string date;
    time(&rawTime);
    timeInfo = localtime(&rawTime);
    strftime(buffer, 100, " %c", timeInfo);
    date = buffer;
    string url("Images/");
    string name(Name);
    string extension(".bmp");
    string path = url + name + date + extension;
    // Open the file for writing
    FILE *f = fopen((const char*)&path, "wb");
    // Save the image as bmp file
    BmpHelper::SaveTo8bppBmpFile(f, (LONG)m_ImageSizeX, (LONG)m_ImageSizeY, (unsigned char*)videoImage);
    fclose(f);
}

这是保存位图的函数

void BmpHelper::SaveTo8bppBmpFile(FILE *output, LONG width, LONG height, unsigned char *buffer)
{
    f8bppHeader_.bfSize = (DWORD)(s8bppHeader_ + width * height);
    i8bppHeader_.biWidth = (LONG)width;
    i8bppHeader_.biHeight = -(LONG)height;
    fwrite(&f8bppHeader_, sizeof(BITMAPFILEHEADER), 1, output);
    fwrite(&i8bppHeader_, sizeof(BITMAPINFOHEADER), 1, output); // I get the error in this line
    fwrite(p8bpp, sizeof(RGBQUAD), 256, output);
    fwrite(buffer, width, height, output);
}

不确定您是否需要这一点,但我也会添加它。

void BmpHelper::Init8bppHeaders()
{
    f8bppHeader_.bfType = 'MB'; // Will be inverted during the fwrite
    s8bppHeader_ = (DWORD)(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD) + 256 * sizeof(RGBQUAD));
    f8bppHeader_.bfReserved1 = 0;
    f8bppHeader_.bfReserved2 = 0;
    f8bppHeader_.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD);
    i8bppHeader_.biSize = sizeof(BITMAPINFOHEADER);
    i8bppHeader_.biPlanes = 1;
    i8bppHeader_.biBitCount = 8;
    i8bppHeader_.biCompression = BI_RGB;
    i8bppHeader_.biSizeImage = 0;
    i8bppHeader_.biXPelsPerMeter = 0;
    i8bppHeader_.biYPelsPerMeter = 0;
    i8bppHeader_.biClrUsed = 0;
    i8bppHeader_.biClrImportant = 0;
    for (size_t index = 0; index < 256; ++index)
    {
        p8bpp[index].rgbBlue = (BYTE)index;
        p8bpp[index].rgbGreen = (BYTE)index;
        p8bpp[index].rgbRed = (BYTE)index;
        p8bpp[index].rgbReserved = 0;
    }
}

如果我从路径中删除日期,它可以正常工作,但它只保存带有 url + 名称和文件格式的文件。我需要日期来区分文件。你们能发现代码有什么问题吗?提前谢谢。

日期/时间字符串包含:个字符。Windows 文件名不接受这些字符中的任何一个/:*?"<>|。您必须将:替换为不同的字符。

此外,您的代码不考虑位图填充。仅当位图宽度(以字节为单位(是 4 的倍数时,它才有效。使用以下公式计算size(而不是width * height(:

int size = ((width * bpp + 31) / 32) * 4 * height;

s8bppHeader_ = (DWORD)...是一个错字! bfSize计算不正确。

您可以使用C++函数std::fstream而不是混合使用 C++ 和 C

例:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <ctime>
#include <windows.h>
...
std::time_t t = std::time(nullptr);
char date[100];
std::strftime(date, sizeof(date), " %c", std::localtime(&t));
for(size_t i = 0, len = strlen(date); i < len; i++)
    if(date[i] == ':')
        date[i] = ','; //use a different character
char *Name = "_abc";
string url("c:\test\");
string name(Name);
string extension(".bmp");
string path = url + name + date + extension;
int width = i8bppHeader_.biWidth;
int height = i8bppHeader_.biHeight;
int bpp = i8bppHeader_.biBitCount;
int size = ((width * bpp + 31) / 32) * 4 * height;
f8bppHeader_.bfType = 'MB'; // Will be inverted during the fwrite
f8bppHeader_.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
    + 256 * sizeof(RGBQUAD) + size;
f8bppHeader_.bfReserved1 = 0;
f8bppHeader_.bfReserved2 = 0;
f8bppHeader_.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
    + 256 * sizeof(RGBQUAD);
ofstream fout(path, ios::binary);
fout.write((char*)&f8bppHeader_, sizeof(f8bppHeader_));
fout.write((char*)&i8bppHeader_, sizeof(i8bppHeader_));
fout.write((char*)p8bpp, 256 * sizeof(RGBQUAD));
fout.write((char*)buffer, size);