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)
您没有正确定义 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中包含的定义更容易且不易出错。