Search code examples
winapiwin32guidirect-composition

DCompositionCreateDevice2: E_INVALIDARG One or more arguments are invalid


Having an unusual problem running Win32C++ source codes with the function DCompositionCreateDevice2, which is compiled with VS 2015. The source codes compile without any error but display the above runtime error. Recompiling and running the same source codes with VS 2019, there is no runtime error. The test sample codes are Windows SDK samples listed below: TouchInputDirectManipulation

DCompV2BackfaceandD2DBatching

Any idea what could be the source of this problem? I am working on WTL open source project, and do not want to restrict the build environment to VS 2019.


Solution

  • This is actually an unusual issue... What happens is Microsoft has seriously messed up dcomp.lib between the Windows 8.1 SDK and the Windows 10 SDK.

    Here is what you see if you dump the Windows 8.1 SDK dcomp.lib exports:

    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
                  
                  
    

    And here is what you see if you dump the Windows 10 SDK dcomp.lib exports:

    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
                    
    

    As you can see the DCompositionCreateDevice2 was defined with ordinal 1017 initially. When you build your program using the Windows 8.1 SDK (which is how theses samples are currently defined), you get that using 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
    

    So, your .exe is linked to ordinal 1017, not to exported name DCompositionCreateDevice2.

    The problem is, with Windows 10 (I think you're running on Windows 10), dcomp ordinal 1017 is not DCompositionCreateDevice2 but DCompositionAttachMouseDragToHwnd! This can be confirmed if you debug your program, you land into that function that doesn't like what you send to it and reports E_INVALIDARG.

    enter image description here

    So the solution is to change the SDK if you target Windows 10:

    enter image description here

    Or simply use GetProcAddress("DCompositionCreateDevice2") etc. to dcomp.dll to make sure you get the good one.

    This should be reported to Microsoft I guess...