使用libjpeg发出打开的JPEG文件:可能的fopen失败?

时间:2016-09-03 06:44:03

标签: c++ fopen libjpeg

我尝试用jpeglib打开一个jpeg文件,在读取jpeg文件头时出现运行时错误。在进一步检查时,我开始怀疑fopen之后的FILE *可能无效。

我正在从较旧的旧版Windows服务中删除GDI +,该服务从文件夹中抓取图像并将其打印到本地打印机。此服务在Windows Server 2012上失败,并且Windows服务中不支持GDI +:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms533798(v=VS.85).aspx "不支持在Windows服务中使用GDI +函​​数和类。"

我成功用Win32 API打印函数替换了GDI +调用,下面的函数试图用jpeglib打开JPEG图像。

HBITMAP LoadJpegAsBitmap(LPCSTR pszFileName)
{ // Function copied fom http://katahiromz.web.fc2.com/win32/loadjpeg.html

    FILE *fp;
    struct jpeg_decompress_struct decomp;
    struct jpeg_error_mgr jerror;
    BITMAPINFO bi;
    LPBYTE lpBuf, pb;
    HBITMAP hbm;
    JSAMPARRAY buffer;
    INT row;

    fp = fopen(pszFileName, "rb");
    if (fp == NULL)  //<- fp is not NULL, but suspect...
        return NULL;

    decomp.err = jpeg_std_error(&jerror);
    jpeg_create_decompress(&decomp);
    jpeg_stdio_src(&decomp, fp);
    jpeg_read_header(&decomp, TRUE); //<- RUNTIME CRASH
    jpeg_start_decompress(&decomp);

    //... ... ...
    //... ..
}

在&#34; if(fp == NULL)&#34;之后调用fopen指针的值类似于0x5fa97350,因此在NULL检查后函数不会返回。 Visual Studio运行时检查显示FILE *成员变量在该阶段为null,如下所示:

fp->
        __ptr = 0x00000000 (NULL)
        _cnt = 0
        _base = 0x00000000 (NULL)
        _flag = 1
        _file = 3
        _charbuf = 0
        _bufsiz = 0
        _tmpfname = 0x00000000 (NULL)

nulls让我怀疑文件没有正确打开。 为了测试,我在nullptr检查之后插入了下面的代码: char c = getc(fp);

while (c != EOF) // file is EOF from the very first byte
{                // loop is not executed
    putchar(c);
    c = getc(fp);
}   

上面的检查让我确信FOLD *在fopen通话后并没有真正有效。

无论如何,该函数的后续步骤是打开jpeg图像的位置。 在调用jpeg_stdio_src(&amp; decomp,fp)之后;对于client_data,decomp结构显示0xcccccccc。我怀疑这解释了为什么jpeglib在下一行崩溃:jpeg_read_header内的运行时异常(&amp; decomp,TRUE); (如果fp损坏,可以解释)。

我认为这不是关于fopen的其他stackoverflow问题的重复:

  • 在调用fopen // C - fopen() doesn't work (returns null pointer)
  • 后,我没有得到null
  • jpeg文件没有安全权限,无论如何我都是管理员。 Simple fopen and fprintf not working
  • 我对完整有效的路径进行了硬编码,因此路径不是问题。
  • 我为Windows路径提供了双反斜杠。正斜杠没有区别
  • 我使用Unicode打开和关闭以上内容。没有不同。
  • 损坏的JPEG文件?它在其他软件中打开很好。比如Paint,Photoshop。

所以我在这里不知所措,不知道为什么文件显然无法打开并在jpeglib中读取。

我也看了看 Need help in reading JPEG file using libjpeg但我认为我的代码符合那里的例子。

感谢您的帮助。

0 个答案:

没有答案