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



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

外部.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 ?

温康斯

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

最后是里德·

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

您没有正确定义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

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

最新更新