【发布时间】: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