Winapi 最新安全更新后未打印的图像

Winapi 最新安全更新后未打印的图像,winapi,hbitmap,stretchblt,Winapi,Hbitmap,Stretchblt,之后,我的应用程序无法打印 所有API调用都没有失败,但图像甚至在PDF中也没有显示。文本和线条等形状打印效果良好 代码使用IPacture接口和OleLoadPicture()加载JPG图像。然后我使用它的Render()调用将其转换为HBITMAP,最后在打印HDC时使用StretchBlt() 所有调用均未失败,所有返回值均已检查。直到今天和最新的Windows安全更新,一切都很好。当然,如果我在我的计算机上卸载KB5000808更新,或者在我客户的计算机上卸载KB5000802,一切都会

之后,我的应用程序无法打印

所有API调用都没有失败,但图像甚至在PDF中也没有显示。文本和线条等形状打印效果良好

代码使用IPacture接口和OleLoadPicture()加载JPG图像。然后我使用它的Render()调用将其转换为HBITMAP,最后在打印HDC时使用StretchBlt()

所有调用均未失败,所有返回值均已检查。直到今天和最新的Windows安全更新,一切都很好。当然,如果我在我的计算机上卸载KB5000808更新,或者在我客户的计算机上卸载KB5000802,一切都会恢复正常,但这不是一个长期的解决方案

今天有人有类似的问题吗?你知道怎么解决这个问题吗?还有其他打印图像的方法吗

编辑:


即使我使用位图而不是JPG图像,也会出现同样的问题。所以JPG渲染没有问题。另一方面,JPG和位图都显示在屏幕上。只有打印不起作用。

我通过使用StretchDIBits而不是StretchBlt win32 api解决的问题类似于。我把这个问题追溯到调用
SelectObject
。奇怪的是,其他应用程序继续打印位图。您编写的API调用中没有一个失败。您正在验证
SelectObject
的返回值吗?SelectObject()看起来很无辜,我几乎从未检查过它的结果。嗯,当然是的,我得到零。令人惊讶的是,即使我自己创建了新的HDC-CreateDC(“DISPLAY”,NULL/*prnName*/,NULL,NULL);-即使在该HDC上,或者如果我尝试使用通过GetDefaultPrinter()获得的有效打印机名称,SelectObject()也会再次失败。请记住,位图只能选择到内存设备上下文中。您需要设置
HDC hdcMem=CreateCompatibleDC(prn)并使用它。我想这对打印机来说是失败的,但对显示器来说是成功的。我甚至用了一个前窗口的hdc。所以HDC winHdc=GetDC(frontHwnd);HDC hdcMem=CreateCompatibleDC(winHdc);HBITMAP hSavedBitmap=SelectObject(hdcMem,HBITMAP)。。。当我在屏幕上绘制东西时,此代码段运行良好,但当我开始打印时,它在SelectObject()上失败。太棒了。我直接使用win32 api。我从未使用过IPicture。但看一下文档,你们能不能用打印机DC简单地调用IPacture::Render?我很乐意接受你们的回答,因为我正在研究StretchDIBits()和GetDIBits(),但你们能发布一个链接或给出一些示例代码吗?一个函数已传递HBITMAP和HDC,并使用StretchDIBits()IPacture将其绘制并渲染到打印机dc中?好问题。也许我真的能做到。我使用的是来自普通C的IPicture,所以我称之为IPicture->lpvtbl->Render();最后,我使用IPacture中的Render解决了这个问题。感谢您引导我找到了最简单的解决方案。就我而言,我很幸运能够使用CreateDIBSection api创建我的hbitmap。所以我有了调用StreDIBits所需的所有信息。但您可以查看:显然,您不会保存文件,但您将拥有所需的所有信息。另外,请注意StretchDIBits调用中的ySrc参数,我需要反转它(height-y)。