【问题标题】:Why is D2D1CreateFactory Sending an error message in assembly为什么 D2D1CreateFactory 在程序集中发送错误消息
【发布时间】:2019-12-20 21:53:25
【问题描述】:

到目前为止,我有一个程序,它所做的只是尝试创建一个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

Externals.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

变量.asm

align qword
screendc qword ?
picdc qword ?
ID2D1Factory qword ?

Wincons.asm

DIB_RGB_COLORS equ <0>
SRCCOPY equ <0CC0020h>
D2D1_DEBUG_LEVEL_NONE equ <0>
D2D1_FACTORY_TYPE_SINGLE_THREADED equ <0>

最后是 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

【问题讨论】:

  • D2D1_DEBUG_LEVEL_NONE 应该通过引用而不是值传递。
  • 当我创建一个值为 D2D1_DEBUG_LEVEL_NONE 的变量并对其 lea r8 时,它具有相同的错误代码
  • 我认为它会,但它仍然是您的代码中的一个错误。
  • GUID 中的第三个 word 值应该是 04592h 而不是 09245h(或者,更准确地说,应该是 byte 092h, byte 045h

标签: windows winapi assembly directx x86-64


【解决方案1】:

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

IID_ID2D1Factory    Dword   006152247h
                    word    06f50h
                    word    0465ah
                    byte    092h
                    byte    045h
                    byte    011h
                    byte    08bh
                    byte    0fdh
                    byte    03bh
                    byte    060h
                    byte    007h

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 2021-05-10
    • 2016-02-21
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多