DCompositionCreateDevice2: E_INVALIDARG 一个或多个参数无效
DCompositionCreateDevice2: E_INVALIDARG One or more arguments are invalid
遇到异常问题运行 Win32C++ 源代码,函数DCompositionCreateDevice2
,是用VS 2015编译的。
源代码编译没有任何错误,但显示上述运行时错误。用VS 2019重新编译和运行相同的源代码,没有运行时错误。
测试示例代码是下面列出的 Windows 个 SDK 示例:
TouchInputDirectManipulation
知道这个问题的根源是什么吗?我正在做 WTL 开源项目,不想将构建环境限制为 VS 2019。
这实际上是一个不寻常的问题...微软在 Windows 8.1 SDK 和 Windows 10 SDK 之间严重搞砸了 dcomp.lib
。
如果转储 Windows 8.1 SDK dcomp.lib 导出,您会看到以下内容:
C:\>dumpbin "C:\Program Files (x86)\Windows Kits.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\Lib.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,而不是导出名称 DCompositionCreateDevice2
。
问题是,Windows 10(我认为你在 Windows 10 上 运行),dcomp 序号 1017 是 而不是 DCompositionCreateDevice2
但是DCompositionAttachMouseDragToHwnd
!如果你调试你的程序,你可以确认这一点,你进入那个不喜欢你发送给它的函数并报告 E_INVALIDARG.
所以如果你的目标是 Windows 10:
,那么解决方案是更改 SDK
或者简单地使用 GetProcAddress("DCompositionCreateDevice2")
等 dcomp.dll 以确保您得到好的。
我想这应该报告给 Microsoft...
遇到异常问题运行 Win32C++ 源代码,函数DCompositionCreateDevice2
,是用VS 2015编译的。
源代码编译没有任何错误,但显示上述运行时错误。用VS 2019重新编译和运行相同的源代码,没有运行时错误。
测试示例代码是下面列出的 Windows 个 SDK 示例:
TouchInputDirectManipulation
知道这个问题的根源是什么吗?我正在做 WTL 开源项目,不想将构建环境限制为 VS 2019。
这实际上是一个不寻常的问题...微软在 Windows 8.1 SDK 和 Windows 10 SDK 之间严重搞砸了 dcomp.lib
。
如果转储 Windows 8.1 SDK dcomp.lib 导出,您会看到以下内容:
C:\>dumpbin "C:\Program Files (x86)\Windows Kits.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\Lib.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,而不是导出名称 DCompositionCreateDevice2
。
问题是,Windows 10(我认为你在 Windows 10 上 运行),dcomp 序号 1017 是 而不是 DCompositionCreateDevice2
但是DCompositionAttachMouseDragToHwnd
!如果你调试你的程序,你可以确认这一点,你进入那个不喜欢你发送给它的函数并报告 E_INVALIDARG.
所以如果你的目标是 Windows 10:
,那么解决方案是更改 SDK或者简单地使用 GetProcAddress("DCompositionCreateDevice2")
等 dcomp.dll 以确保您得到好的。
我想这应该报告给 Microsoft...