winapi - CComPtr 解构函数导致读取访问冲突
问题描述
我编写了以下 C++/Win32 程序以将屏幕截图保存为 jpeg 格式。
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winuser.h>
#include <strsafe.h>
#include <objbase.h>
#include <combaseapi.h>
#include <wincodec.h>
#include <wincodecsdk.h>
#include <atlbase.h>
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{
HRESULT hr = S_OK;
CComPtr<IWICImagingFactory> pFactory;
hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
if (SUCCEEDED(hr))
{
hr = CoCreateInstance(CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pFactory));
}
DEVMODE d;
if (EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &d))
{
HWND desktop = GetDesktopWindow();
HDC desktopDC = GetDC(desktop);
HDC captureDC = CreateCompatibleDC(desktopDC);
HBITMAP hCaptureBitmap = CreateCompatibleBitmap(desktopDC, d.dmPelsWidth, d.dmPelsHeight);
SelectObject(captureDC, hCaptureBitmap);
BitBlt(captureDC, 0, 0, d.dmPelsWidth, d.dmPelsHeight, desktopDC, 0, 0, SRCCOPY | CAPTUREBLT);
CComPtr<IWICBitmap> wicbitmap;
CComPtr<IWICStream> stream;
CComPtr<IWICBitmapEncoder> encoder;
CComPtr<IWICBitmapFrameEncode> frame;
hr = pFactory->CreateBitmapFromHBITMAP(hCaptureBitmap, NULL, WICBitmapIgnoreAlpha, &wicbitmap);
if (SUCCEEDED(hr))
{
hr = pFactory->CreateStream(&stream);
}
if (SUCCEEDED(hr))
{
hr = stream->InitializeFromFilename(L"screenshot.jpg", GENERIC_WRITE);
}
if (SUCCEEDED(hr))
{
hr = pFactory->CreateEncoder(GUID_ContainerFormatJpeg, NULL, &encoder);
}
if (SUCCEEDED(hr))
{
hr = encoder->Initialize(stream, WICBitmapEncoderNoCache);
}
if (SUCCEEDED(hr))
{
hr = encoder->CreateNewFrame(&frame, NULL);
}
if (SUCCEEDED(hr))
{
hr = frame->Initialize(NULL);
}
if (SUCCEEDED(hr))
{
hr = frame->SetSize(d.dmPelsWidth, d.dmPelsHeight);
}
if (SUCCEEDED(hr))
{
GUID pixel_format = GUID_WICPixelFormat24bppRGB;
hr = frame->SetPixelFormat(&pixel_format);
}
if (SUCCEEDED(hr))
{
hr = frame->WriteSource(wicbitmap, NULL);
}
if (SUCCEEDED(hr))
{
hr = frame->Commit();
}
if (SUCCEEDED(hr))
{
hr = encoder->Commit();
}
ReleaseDC(desktop, desktopDC);
DeleteDC(captureDC);
DeleteObject(hCaptureBitmap);
}
CoUninitialize();
return 0;
}
但是,当wWinMain
函数结束时,我收到每个 CComPtr 对象的读取访问冲突错误。我是 Windows 编程的新手,所以我不知道我在这里做错了什么。
解决方案
推荐阅读
- passport.js - ADFS 证书翻转后无法登录
- mongodb - 排序时的MongoDB性能问题
- javascript - 使用“?”时,编码字符串与 asp.net server.URL 编码不同 在字符串中
- jenkins - 詹金斯没有触发工作
- c# - 在 itextsharp 中为 pdfpcell 添加左上右圆角边框
- scala - 使用 sbt 原生打包将 fat jar 打包成 debian
- php - 使用带有密钥字符串的触发器安全地自动加密 mySQL 列
- c - 将字符类型转换为 Int 并进行算术运算不起作用
- java - 进行测验,不确定如何使用 firebase 数据库在 android 中进行下一个问题
- jenkins - 根据部署在 email-ext 插件中的分支更改电子邮件收件人电子邮件