- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试用 direct2d 制作位图。问题是 CoCreateInstance(...) 函数不起作用
HRESULT Renderer::InitImagingFactory()
{
if (FAILED(CoInitializeEx(NULL, COINIT_MULTITHREADED))) return E_FAIL;
if (FAILED(CoCreateInstance(
CLSID_WICImagingFactory,
NULL,
CLSCTX_INPROC_SERVER,
IID_IWICImagingFactory,
reinterpret_cast<void **>(&m_imagingfactory)))) return E_FAIL;
return S_OK;
}
最佳答案
您可能会遇到这个问题的主要原因有两个。
(1) 调用此函数前需要初始化COM。对于经典的 Win32 桌面应用程序,您可以使用 CoInitialize
或 CoInitializeEx
执行此操作。对于 Windows 运行时平台,您将使用 Windows::Foundation::Initialize
。
HRESULT hr = CoInitializeEx(nullptr, COINITBASE_MULTITHREADED);
if (FAILED(hr))
// error
(2) 您需要确保为您的目标平台正确设置了 _WIN32_WINNT
-- 请参阅 Using the Windows Headers .
对于经典的 Win32 桌面应用程序,您可能希望使用以下代码在支持它的平台上初始化 WIC2 或在其他平台上初始化 WIC1——在 DirectXTex 中找到的代码和 DirectXTK的 WICTextureLoader
。
#include <wincodec.h>
namespace
{
bool g_WIC2 = false;
}
bool IsWIC2()
{
return g_WIC2;
}
IWICImagingFactory* GetWIC()
{
static INIT_ONCE s_initOnce = INIT_ONCE_STATIC_INIT;
IWICImagingFactory* factory = nullptr;
InitOnceExecuteOnce(&s_initOnce,
[](PINIT_ONCE, PVOID, PVOID *factory) -> BOOL
{
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE)
HRESULT hr = CoCreateInstance(
CLSID_WICImagingFactory2,
nullptr,
CLSCTX_INPROC_SERVER,
__uuidof(IWICImagingFactory2),
factory
);
if ( SUCCEEDED(hr) )
{
// WIC2 is available on Windows 10, Windows 8.x, and Windows 7 SP1 with KB 2670838 installed
g_WIC2 = true;
return TRUE;
}
else
{
hr = CoCreateInstance(
CLSID_WICImagingFactory1,
nullptr,
CLSCTX_INPROC_SERVER,
__uuidof(IWICImagingFactory),
factory
);
return SUCCEEDED(hr) ? TRUE : FALSE;
}
#else
return SUCCEEDED( CoCreateInstance(
CLSID_WICImagingFactory,
nullptr,
CLSCTX_INPROC_SERVER,
__uuidof(IWICImagingFactory),
factory) ) ? TRUE : FALSE;
#endif
}, nullptr, reinterpret_cast<LPVOID*>(&factory));
return factory;
}
This uses
InitOnceExecuteOnce
to ensure it's thread-safe. This ensures that the WIC factory is created exactly once no matter which thread callsGetWIC
first. I'm using a C++11 lambda a.k.a. an anonymous function for the callback. The actual pointer to the WIC factory is stored inside theINIT_ONCE
structure. See Using One-Time Initialization
此代码旨在涵盖所有可能的平台设置。
为 Windows 应用商店、通用 Windows 平台 (UWP) 应用程序或 Xbox 构建时,将为 Windows 8 或更高版本设置 _WIN32_WINNT
变量。这也适用于仅支持 Windows 8.0 或更高版本的经典 Win32 桌面应用程序。
为 Windows 7 构建时,_WIN32_WINNT
将设置为低于 Windows 8 的值。Windows 8.x SDK 和 Windows 10 SDK WIC header 同时支持 WIC 和 WIC 版本 2,但WIC 版本 2 定义通常不为 Windows 7 或更低版本定义。因此,即使 _WIN32_WINNT
是设置为 0x0601
(Windows 7) 或 0x0600
(Windows Vista)。在这种情况下,您需要处理操作系统上实际未安装 WIC2 支持的情况,并回退以使用原始 WIC 工厂。
否则,它只是默认为默认的 WIC 工厂,这将是 WIC 版本 1。此代码路径还将使用比 Windows 8.0 SDK 更旧的 Windows SDK 构建,后者是第一个具有 WIC2 类型的 wincodec.h
.
我有 IsWIC2
函数,因为有几个地方您需要知道该工厂是否实际上是 WIC2 工厂,特别是如果您尝试使用 GUID_WICPixelFormat96bppRGBFloat
、GUID_WICPixelFormat32bppRGB
、GUID_WICPixelFormat64bppRGB
或 GUID_WICPixelFormat64bppPRGBAHalf
像素格式。如果您不使用 WIC2,则需要改用其他格式。
有关 WIC 与 WIC2 的不同之处的详细信息,请参阅 MSDN以及this blog post .
关于c++ - CoCreateInstance 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40352283/
以下是简短的重现样本: DWORD WINAPI _threadTest (LPVOID) { Sleep (2000); CoInitialize(0); CoCreateI
我是 .NET 程序员和 COM 新手。想简单了解一下 CoCreateInstance 的作用是什么? 最佳答案 你可以想到CoCreateInstance()作为匿名工厂类的接口(interfac
我有一个调用 CoCreateInstance 的函数。此函数被多次调用并且有效,但是有一次 CoCreateInstance 因“变量类型错误”错误而失败。问题是参数在成功和失败时始终相同。什么会导
我尝试用 direct2d 制作位图。问题是 CoCreateInstance(...) 函数不起作用 HRESULT Renderer::InitImagingFactory() { if
我正在使用开源库 EasyHook . 我想做的是,当 VB6 应用程序在特定 CLSID 上从 ole32.dll 调用 CoCreateInstance 时 Hook ,返回我自己的对象 C# 实
我有一个 DLL,我需要在其中调用 CoCreateInstance()。在 Dllmain() 中,我创建了一个新线程来运行我的函数 do_stuff()。 CoCreateInstance() 在
我有一个 Windows 服务,它在初始化期间调用多个 COM+。在某些系统上,此 Windows 服务会在启动期间导致死锁。 At least one service or driver faile
使用 COM 你使用 CoCreateInstance创建一个对象。 有没有办法完全破坏它,以便单元测试的下一部分可以重新开始? 最佳答案 每个持有引用的 COM 接口(interface)指针的人都
我正在尝试使用 Windows 核心音频 API 从麦克风捕获音频 相关的代码行是 const CLSID CLSID_MMDeviceEnumerator = __uuidof(MMDeviceEn
我正在将一段代码从 C++ 转换为 C#,但不确定如何使用 CoCreateInstance()。这是 C++(这有效并且是我在 C# 中想要的): IComDevice *Device=NULL;
我在这里尝试做的只是创建一个接口(interface)的实例。真的应该这么简单。一直在关注任何在线资料,阅读我能找到但终生无法解决这个问题的资料。 它归结为从 CoCreateInstance 返回的
我有一个关于 CoCreateInstnace() 方法如何定位和创建包含在 COM DLL 中的 CoClass 实例的问题。 根据MSDN : The CoCreateInstance funct
我使用C++ MFC activex脚本调用javascript函数,它编译正常但使用 init 函数运行到 CoCreateInstance,导致读取访问冲突(此 0x4)。如何解决这个问题? 下面
我正在使用 COM 通过 C++ 非托管代码初始化 C# .NET 类,并且即使在非常基本的程序中我也检测到内存泄漏: int _tmain(int argc, _TCHAR* argv[]) {
这是创建 COM 对象的代码示例: CComPtr pFilter; auto hr = CoCreateInstance(CLSID_DMOWrapperFilter, NULL, CLSC
鉴于一些现有代码调用 CoCreateInstance 来创建已注册 COM 对象的实例,是否有一种方法可以重定向这些调用以创建不同的实例? 想法是在同一个进程中(出于测试目的),在不改变原始代码或影
我想使用 DSound Audio Render在我的一个应用程序中,所以我用 CoCreateInstance 加载它.根据my previous question ,如果我没有安装音频硬件,CoC
当我调用 dll 中的 CoCreateInstance() 时,出现错误“不支持此类接口(interface)”。我正在尝试创建 IGroupPolicyObject 的实例。当我通过 exe 运行
我已经成功编译并注册了一个直接显示过滤器。现在我想在我的代码中使用它。但是对 COCreateInstance 的调用返回错误代码 E_NOINTERFACE。 这是我的过滤器的注册码 #inclu
以上是否可行? 我可以这样做吗: IUnknown *punk; punk->QueryInterface(IID_MyInterface, (void**)&m_pMyInterface); 我认为
我是一名优秀的程序员,十分优秀!