winapi - DCompositionCreateDevice2: E_INVALIDARG 一个或多个参数无效
问题描述
使用 VS 2015 编译的函数运行 Win32C++ 源代码时出现异常问题DCompositionCreateDevice2
。源代码编译没有任何错误,但显示上述运行时错误。用VS 2019重新编译和运行相同的源代码,没有运行时错误。测试示例代码是下面列出的 Windows SDK 示例:
TouchInputDirectManipulation
知道这个问题的根源是什么吗?我正在做 WTL 开源项目,并不想将构建环境限制为 VS 2019。
解决方案
dcomp.lib
这实际上是一个不寻常的问题......发生的事情是微软在 Windows 8.1 SDK 和 Windows 10 SDK 之间严重搞砸了。
如果您转储 Windows 8.1 SDK dcomp.lib 导出,您会看到以下内容:
C:\>dumpbin "C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x64\dcomp.lib" /exports
Microsoft (R) COFF/PE Dumper Version 14.28.29914.0
Copyright (C) Microsoft Corporation. All rights reserved.
Exports
ordinal name
DCompositionCreateDevice
1017 DCompositionCreateDevice2
DCompositionCreateSurfaceHandle
如果您转储 Windows 10 SDK dcomp.lib 导出,您会看到以下内容:
C:\>dumpbin "C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\um\x64\dcomp.lib" /exports
Microsoft (R) COFF/PE Dumper Version 14.28.29914.0
Copyright (C) Microsoft Corporation. All rights reserved.
Exports
ordinal name
DCompositionAttachMouseDragToHwnd
DCompositionAttachMouseWheelToHwnd
DCompositionCreateDevice
DCompositionCreateDevice2
DCompositionCreateDevice3
DCompositionCreateSurfaceHandle
如您所见,DCompositionCreateDevice2
最初是用序数 1017 定义的。当您使用 Windows 8.1 SDK 构建程序时(这些示例当前是如何定义的),您可以使用 dumpbin 获得它:
C:\>dumpbin c:\mypath\TouchInputDirectManipulation\cpp\x64\Debug\DirectManipulationSample.exe /imports
Microsoft (R) COFF/PE Dumper Version 14.28.29914.0
Copyright (C) Microsoft Corporation. All rights reserved.
Section contains the following imports:
dcomp.dll
140054570 Import Address Table
140054E98 Import Name Table
0 time date stamp
0 Index of first forwarder reference
Ordinal 1017
因此,您的 .exe 链接到序号 1017,而不是导出的 name DCompositionCreateDevice2
。
问题是,对于 Windows 10(我认为您正在 Windows 10 上运行), dcomp ordinal 1017不是 DCompositionCreateDevice2
但是DCompositionAttachMouseDragToHwnd
!如果您调试程序,则可以确认这一点,您进入那个不喜欢您发送给它的函数并报告 E_INVALIDARG 的函数。
因此,如果您以 Windows 10 为目标,则解决方案是更改 SDK:
或者简单地使用GetProcAddress("DCompositionCreateDevice2")
etc. 到 dcomp.dll 以确保你得到一个好的。
这应该报告给微软我猜...
推荐阅读
- wordpress - 使用 apache proxypass 重定向到 /blog (wordpress)
- scala - 在 Spark Streaming 中处理太晚的数据
- r - 发生错误“权重总和不为 1”,但它们总和为 1(R 的 MCDM 包)
- javascript - 可以在 Vuex 中使任意对象具有响应性吗?
- android - Android芯片文字未显示
- mysql - 条件左连接或 Where SQL 查询
- javascript - javascript-如何使用键从数组数组中提取值
- python - 如何在文本文件中使用 python 增加 empid
- php - 循环之间的睡眠功能在任何循环执行之前运行
- php - 使用模仿原始 mysql_real_escape_string 的函数