为什么 D2D1CreateFactory 在程序集中发送错误消息

Nat*_*ith 1 windows directx assembly winapi x86-64

到目前为止,我有一个程序,它所做的只是尝试创建一个,D2D1Factory但我收到错误消息E_NOINTERFACE,我认为我是正确的,IID_ID2D1Factory并且我已经在多个地方多次检查过。有人可以告诉我为什么它失败和/或如何修复它。

我的代码

include externals.asm
include wincons.asm
include vtable.asm
.data
include variables.asm
;include pic.asm
include riid.asm
.code
start proc frame
    DB 48h
    push rbx
    .pushreg rbx
    push r13
    .pushreg r13
    push rbp
    .pushreg rbp
    sub rsp, 80
    .allocstack 80
    lea rbp, [rsp + 80]
    .setframe rbp, 80
    .endprolog
    mov rcx, D2D1_FACTORY_TYPE_SINGLE_THREADED
    lea rdx, IID_ID2D1Factory
    mov r8, D2D1_DEBUG_LEVEL_NONE
    lea r9, ID2D1Factory
    call __imp_D2D1CreateFactory
drawscreen:

    jnc drawscreen
    xor rcx, rcx
    call __imp_ExitProcess
    mov rsp, rbp
    pop rbp
    pop r13
    pop rbx
    ret
start endp
end
Run Code Online (Sandbox Code Playgroud)

外部.asm

extern __imp_GetDC:qword
extern __imp_ReleaseDC:qword
extern __imp_GetDesktopWindow:qword
extern __imp_ExitProcess:QWORD
extern __imp_SetDIBits:qword
extern __imp_BitBlt:qword
extern __imp_CreateDIBitmap:qword
extern __imp_DeleteObject:qword
extern __imp_DeleteDC:qword
extern __imp_CreateCompatibleBitmap:qword
extern __imp_SelectObject:qword
extern __imp_CreateCompatibleDC:qword
extern __imp_GetDesktopWindow:qword
extern __imp_GetLastError:qword
extern __imp_GetAsyncKeyState:word
extern __imp_D2D1CreateFactory:qword
Run Code Online (Sandbox Code Playgroud)

变量.asm

align qword
screendc qword ?
picdc qword ?
ID2D1Factory qword ?
Run Code Online (Sandbox Code Playgroud)

Wincons.asm

DIB_RGB_COLORS equ <0>
SRCCOPY equ <0CC0020h>
D2D1_DEBUG_LEVEL_NONE equ <0>
D2D1_FACTORY_TYPE_SINGLE_THREADED equ <0>
Run Code Online (Sandbox Code Playgroud)

最后是 riid.asm

IID_IUnknown    Dword   000000000h
                word    00000h
                word    00000h
                word    0C000h
                byte    000h
                byte    000h
                byte    000h
                byte    000h
                byte    000h
                byte    046h

IID_ID2D1RenderTarget   Dword   02cd90694h
                        word    012e2h
                        word    011dch
                        byte    09fh
                        byte    0edh
                        byte    000h
                        byte    011h
                        byte    043h
                        byte    0a0h
                        byte    055h
                        byte    0f9h

IID_ID2D1Factory    Dword   006152247h
                    word    06f50h
                    word    0465ah
                    word    09245h
                    byte    011h
                    byte    08bh
                    byte    0fdh
                    byte    03bh
                    byte    060h
                    byte    007h
Run Code Online (Sandbox Code Playgroud)

Ros*_*dge 5

您没有正确定义 IID_ID2D1Factory 的 UUID。问题是 UUID 的 Microsoft 二进制编码要求 UUID {06152247-6f50-465a-9245-118bfd3b6007} 的最后两个组件采用大端格式,这与采用小端顺序的前三个组件不同。所以应该是:

IID_ID2D1Factory    Dword   006152247h
                    word    06f50h
                    word    0465ah
                    byte    092h
                    byte    045h
                    byte    011h
                    byte    08bh
                    byte    0fdh
                    byte    03bh
                    byte    060h
                    byte    007h
Run Code Online (Sandbox Code Playgroud)

与其自己定义此 UUID,不如使用uuid.libWindows SDK中包含的定义更容易且不易出错。