我尝试用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问题的重复:
所以我在这里不知所措,不知道为什么文件显然无法打开并在jpeglib中读取。
我也看了看 Need help in reading JPEG file using libjpeg但我认为我的代码符合那里的例子。
感谢您的帮助。