Я не мог заставить его работать в чистой сборке, поэтому я попытался сделать код C для рисования на экране, но код C тоже не сделает этого, и я не знаю почему, и ничего не дает коды ошибок. Я пытаюсь нарисовать прямо на экране с помощью Direct2D через GDI D C.
Мой C код, извините, если он немного запутан, он должен был быть временным для быстрого исправления
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Windows.h>
#include <d2d1.h>
#pragma comment(lib, "d2d1.lib")
extern "C" ID2D1Bitmap* mybitmapcreate(ID2D1DCRenderTarget*);
float left = 5;
float top = 10;
float Bottom = 10;
float Right = 30;
ID2D1Bitmap* picbitmap;
D2D1_RECT_F myrect = D2D1::RectF(left, top, Bottom, Right);
ID2D1DCRenderTarget* pow;
ID2D1Bitmap* mybitmap;
ID2D1Factory *l;
REFIID x = __uuidof(ID2D1Factory);
struct D2D1_RENDER_TARGET_PROPERTIES props = D2D1::RenderTargetProperties(
D2D1_RENDER_TARGET_TYPE_DEFAULT,
D2D1::PixelFormat(
DXGI_FORMAT_B8G8R8A8_UNORM,
D2D1_ALPHA_MODE_IGNORE),
0,
0,
D2D1_RENDER_TARGET_USAGE_NONE,
D2D1_FEATURE_LEVEL_DEFAULT
);
struct D2D1_BITMAP_PROPERTIES bitmapprops = D2D1::BitmapProperties(
D2D1::PixelFormat(DXGI_FORMAT_R8G8B8A8_UINT, D2D1_ALPHA_MODE_UNKNOWN), 96.0, 96.0
);
int main()
{
/*
long bufferend;
FILE* mybitmapfile;
char* mybitmaparray;
//size_t result;
mybitmapfile = fopen("bitmap.bin", "rb");
if (mybitmapfile == NULL) { fputs("File error", stderr); exit(1); }
fseek(mybitmapfile, 0, SEEK_END);
//bufferend = ftell(mybitmapfile);
bufferend = 1204097;
rewind(mybitmapfile);
mybitmaparray = (char*) malloc(sizeof(char)*bufferend);
if (mybitmaparray == NULL) { fputs("Memory error", stderr); exit(2); }
fread(mybitmaparray, 1, bufferend, mybitmapfile);
fclose(mybitmapfile);
*/
HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &l);
l->CreateDCRenderTarget(&props, &pow);
picbitmap = mybitmapcreate(pow);
pow->BeginDraw();
while (true) {
pow->DrawBitmap(picbitmap, myrect, 1.0F, D2D1_BITMAP_INTERPOLATION_MODE_LINEAR, myrect);
};
pow->EndDraw();
return 0;
}
Это mybitmapcreate, его возвращаемое значение - это растровое изображение.
includelib user32.lib
includelib D2D1.lib
include externals.asm
include wincons.asm
include vtable.asm
.data
include variables.asm
include pic.asm
include riid.asm
include structures.asm
.code
public mybitmapcreate
bitmapcreate proc frame
mybitmapcreate::
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 ID2D1DCRenderTarget, rcx
call __imp_GetDesktopWindow
mov rcx, 0
mov rbx, rax
getdcfail:
call __imp_GetDC
cmp rax, 0
je getdcfail
mov rcx, rbx
lea rdx, ScreenSize
mov screendc, rax
call __imp_GetWindowRect
mov rcx, ID2D1DCRenderTarget
mov rbx, [rcx]
mov rdx, ScreenDC
lea r8, ScreenSize
call ID2D1DCRenderTarget_BindDC
mov rcx, ID2D1DCRenderTarget
mov rbx, [rcx]
mov rdx, 000000199000002E0h
lea r8, pic1colorbytes
mov r9, 2944
lea rax, pic1properties
mov qword ptr [rsp + 20h], rax
lea rax, ID2D1Bitmap1
mov qword ptr [rsp + 28h], rax
call ID2D1DCRenderTarget_CreateBitmap
mov rax, ID2D1Bitmap1
mov rsp, rbp
pop rbp
pop r13
pop rbx
ret
bitmapcreate endp
end
Это моя таблица
;ID2D1RenderTargetVtbl
ID2D1RenderTarget_QueryInterface textequ <qword ptr [rbx+0]>
ID2D1RenderTarget_AddRef textequ <qword ptr [rbx+8]>
ID2D1RenderTarget_Release textequ <qword ptr [rbx+16]>
ID2D1RenderTarget_GetFactory textequ <qword ptr [rbx+24]>
ID2D1RenderTarget_CreateBitmap textequ <qword ptr [rbx+32]>
ID2D1RenderTarget_CreateBitmapFromWicBitmap textequ <qword ptr [rbx+40]>
ID2D1RenderTarget_CreateSharedBitmap textequ <qword ptr [rbx+48]>
ID2D1RenderTarget_CreateBitmapBrush textequ <qword ptr [rbx+56]>
ID2D1RenderTarget_CreateSolidColorBrush textequ <qword ptr [rbx+64]>
ID2D1RenderTarget_CreateGradientStopCollection textequ <qword ptr [rbx+72]>
ID2D1RenderTarget_CreateLinearGradientBrush textequ <qword ptr [rbx+80]>
ID2D1RenderTarget_CreateRadialGradientBrush textequ <qword ptr [rbx+88]>
ID2D1RenderTarget_CreateCompatibleRenderTarget textequ <qword ptr [rbx+96]>
ID2D1RenderTarget_CreateLayer textequ <qword ptr [rbx+104]>
ID2D1RenderTarget_CreateMesh textequ <qword ptr [rbx+112]>
ID2D1RenderTarget_DrawLine textequ <qword ptr [rbx+120]>
ID2D1RenderTarget_DrawRectangle textequ <qword ptr [rbx+128]>
ID2D1RenderTarget_FillRectangle textequ <qword ptr [rbx+136]>
ID2D1RenderTarget_DrawRoundedRectangle textequ <qword ptr [rbx+144]>
ID2D1RenderTarget_FillRoundedRectangle textequ <qword ptr [rbx+152]>
ID2D1RenderTarget_DrawEllipse textequ <qword ptr [rbx+160]>
ID2D1RenderTarget_FillEllipse textequ <qword ptr [rbx+168]>
ID2D1RenderTarget_DrawGeometry textequ <qword ptr [rbx+176]>
ID2D1RenderTarget_FillGeometry textequ <qword ptr [rbx+184]>
ID2D1RenderTarget_FillMesh textequ <qword ptr [rbx+192]>
ID2D1RenderTarget_FillOpacityMask textequ <qword ptr [rbx+200]>
ID2D1RenderTarget_DrawBitmap textequ <qword ptr [rbx+208]>
ID2D1RenderTarget_DrawText textequ <qword ptr [rbx+216]>
ID2D1RenderTarget_DrawTextLayout textequ <qword ptr [rbx+224]>
ID2D1RenderTarget_DrawGlyphRun textequ <qword ptr [rbx+232]>
ID2D1RenderTarget_SetTransform textequ <qword ptr [rbx+240]>
ID2D1RenderTarget_GetTransform textequ <qword ptr [rbx+248]>
ID2D1RenderTarget_SetAntialiasMode textequ <qword ptr [rbx+256]>
ID2D1RenderTarget_GetAntialiasMode textequ <qword ptr [rbx+264]>
ID2D1RenderTarget_SetTextAntialiasMode textequ <qword ptr [rbx+272]>
ID2D1RenderTarget_GetTextAntialiasMode textequ <qword ptr [rbx+280]>
ID2D1RenderTarget_SetTextRenderingParams textequ <qword ptr [rbx+288]>
ID2D1RenderTarget_GetTextRenderingParams textequ <qword ptr [rbx+296]>
ID2D1RenderTarget_SetTags textequ <qword ptr [rbx+304]>
ID2D1RenderTarget_GetTags textequ <qword ptr [rbx+312]>
ID2D1RenderTarget_PushLayer textequ <qword ptr [rbx+320]>
ID2D1RenderTarget_PopLayer textequ <qword ptr [rbx+328]>
ID2D1RenderTarget_Flush textequ <qword ptr [rbx+336]>
ID2D1RenderTarget_SaveDrawingState textequ <qword ptr [rbx+344]>
ID2D1RenderTarget_RestoreDrawingState textequ <qword ptr [rbx+352]>
ID2D1RenderTarget_PushAxisAlignedClip textequ <qword ptr [rbx+360]>
ID2D1RenderTarget_PopAxisAlignedClip textequ <qword ptr [rbx+368]>
ID2D1RenderTarget_Clear textequ <qword ptr [rbx+376]>
ID2D1RenderTarget_BeginDraw textequ <qword ptr [rbx+384]>
ID2D1RenderTarget_EndDraw textequ <qword ptr [rbx+392]>
ID2D1RenderTarget_GetPixelFormat textequ <qword ptr [rbx+400]>
ID2D1RenderTarget_SetDpi textequ <qword ptr [rbx+408]>
ID2D1RenderTarget_GetDpi textequ <qword ptr [rbx+416]>
ID2D1RenderTarget_GetSize textequ <qword ptr [rbx+424]>
ID2D1RenderTarget_GetPixelSize textequ <qword ptr [rbx+432]>
ID2D1RenderTarget_GetMaximumBitmapSize textequ <qword ptr [rbx+440]>
ID2D1RenderTarget_IsSupported textequ <qword ptr [rbx+448]>
;ID2D1Factory
ID2D1Factory_QueryInterface textequ <qword ptr [rbx+0]>
ID2D1Factory_AddRef textequ <qword ptr [rbx+8]>
ID2D1Factory_Release textequ <qword ptr [rbx+16]>
ID2D1Factory_ReloadSystemMetrics textequ <qword ptr [rbx+24]>
ID2D1Factory_GetDesktopDpi textequ <qword ptr [rbx+32]>
ID2D1Factory_CreateRectangleGeometry textequ <qword ptr [rbx+40]>
ID2D1Factory_CreateRoundedRectangleGeometry textequ <qword ptr [rbx+48]>
ID2D1Factory_CreateEllipseGeometry textequ <qword ptr [rbx+56]>
ID2D1Factory_CreateGeometryGroup textequ <qword ptr [rbx+64]>
ID2D1Factory_CreateTransformedGeometry textequ <qword ptr [rbx+72]>
ID2D1Factory_CreatePathGeometry textequ <qword ptr [rbx+80]>
ID2D1Factory_CreateStrokeStyle textequ <qword ptr [rbx+88]>
ID2D1Factory_CreateDrawingStateBlock textequ <qword ptr [rbx+96]>
ID2D1Factory_CreateWicBitmapRenderTarget textequ <qword ptr [rbx+104]>
ID2D1Factory_CreateHwndRenderTarget textequ <qword ptr [rbx+112]>
ID2D1Factory_CreateDxgiSurfaceRenderTarget textequ <qword ptr [rbx+120]>
ID2D1Factory_CreateDCRenderTarget textequ <qword ptr [rbx+128]>
;dcrendertarget
ID2D1DCRenderTarget_QueryInterface textequ <qword ptr [rbx+0]>
ID2D1DCRenderTarget_AddRef textequ <qword ptr [rbx+8]>
ID2D1DCRenderTarget_Release textequ <qword ptr [rbx+16]>
ID2D1DCRenderTarget_GetFactory textequ <qword ptr [rbx+24]>
ID2D1DCRenderTarget_CreateBitmap textequ <qword ptr [rbx+32]>
ID2D1DCRenderTarget_CreateBitmapFromWicBitmap textequ <qword ptr [rbx+40]>
ID2D1DCRenderTarget_CreateSharedBitmap textequ <qword ptr [rbx+48]>
ID2D1DCRenderTarget_CreateBitmapBrush textequ <qword ptr [rbx+56]>
ID2D1DCRenderTarget_CreateSolidColorBrush textequ <qword ptr [rbx+64]>
ID2D1DCRenderTarget_CreateGradientStopCollection textequ <qword ptr [rbx+72]>
ID2D1DCRenderTarget_CreateLinearGradientBrush textequ <qword ptr [rbx+80]>
ID2D1DCRenderTarget_CreateRadialGradientBrush textequ <qword ptr [rbx+88]>
ID2D1DCRenderTarget_CreateCompatibleRenderTarget textequ <qword ptr [rbx+96]>
ID2D1DCRenderTarget_CreateLayer textequ <qword ptr [rbx+104]>
ID2D1DCRenderTarget_CreateMesh textequ <qword ptr [rbx+112]>
ID2D1DCRenderTarget_DrawLine textequ <qword ptr [rbx+120]>
ID2D1DCRenderTarget_DrawRectangle textequ <qword ptr [rbx+128]>
ID2D1DCRenderTarget_FillRectangle textequ <qword ptr [rbx+136]>
ID2D1DCRenderTarget_DrawRoundedRectangle textequ <qword ptr [rbx+144]>
ID2D1DCRenderTarget_FillRoundedRectangle textequ <qword ptr [rbx+152]>
ID2D1DCRenderTarget_DrawEllipse textequ <qword ptr [rbx+160]>
ID2D1DCRenderTarget_FillEllipse textequ <qword ptr [rbx+168]>
ID2D1DCRenderTarget_DrawGeometry textequ <qword ptr [rbx+176]>
ID2D1DCRenderTarget_FillGeometry textequ <qword ptr [rbx+184]>
ID2D1DCRenderTarget_FillMesh textequ <qword ptr [rbx+192]>
ID2D1DCRenderTarget_FillOpacityMask textequ <qword ptr [rbx+200]>
ID2D1DCRenderTarget_DrawBitmap textequ <qword ptr [rbx+208]>
ID2D1DCRenderTarget_DrawText textequ <qword ptr [rbx+216]>
ID2D1DCRenderTarget_DrawTextLayout textequ <qword ptr [rbx+224]>
ID2D1DCRenderTarget_DrawGlyphRun textequ <qword ptr [rbx+232]>
ID2D1DCRenderTarget_SetTransform textequ <qword ptr [rbx+240]>
ID2D1DCRenderTarget_GetTransform textequ <qword ptr [rbx+248]>
ID2D1DCRenderTarget_SetAntialiasMode textequ <qword ptr [rbx+256]>
ID2D1DCRenderTarget_GetAntialiasMode textequ <qword ptr [rbx+264]>
ID2D1DCRenderTarget_SetTextAntialiasMode textequ <qword ptr [rbx+272]>
ID2D1DCRenderTarget_GetTextAntialiasMode textequ <qword ptr [rbx+280]>
ID2D1DCRenderTarget_SetTextRenderingParams textequ <qword ptr [rbx+288]>
ID2D1DCRenderTarget_GetTextRenderingParams textequ <qword ptr [rbx+296]>
ID2D1DCRenderTarget_SetTags textequ <qword ptr [rbx+304]>
ID2D1DCRenderTarget_GetTags textequ <qword ptr [rbx+312]>
ID2D1DCRenderTarget_PushLayer textequ <qword ptr [rbx+320]>
ID2D1DCRenderTarget_PopLayer textequ <qword ptr [rbx+328]>
ID2D1DCRenderTarget_Flush textequ <qword ptr [rbx+336]>
ID2D1DCRenderTarget_SaveDrawingState textequ <qword ptr [rbx+344]>
ID2D1DCRenderTarget_RestoreDrawingState textequ <qword ptr [rbx+352]>
ID2D1DCRenderTarget_PushAxisAlignedClip textequ <qword ptr [rbx+360]>
ID2D1DCRenderTarget_PopAxisAlignedClip textequ <qword ptr [rbx+368]>
ID2D1DCRenderTarget_Clear textequ <qword ptr [rbx+376]>
ID2D1DCRenderTarget_BeginDraw textequ <qword ptr [rbx+384]>
ID2D1DCRenderTarget_EndDraw textequ <qword ptr [rbx+392]>
ID2D1DCRenderTarget_GetPixelFormat textequ <qword ptr [rbx+400]>
ID2D1DCRenderTarget_SetDpi textequ <qword ptr [rbx+408]>
ID2D1DCRenderTarget_GetDpi textequ <qword ptr [rbx+416]>
ID2D1DCRenderTarget_GetSize textequ <qword ptr [rbx+424]>
ID2D1DCRenderTarget_GetPixelSize textequ <qword ptr [rbx+432]>
ID2D1DCRenderTarget_GetMaximumBitmapSize textequ <qword ptr [rbx+440]>
ID2D1DCRenderTarget_IsSupported textequ <qword ptr [rbx+448]>
ID2D1DCRenderTarget_BindDC textequ <qword ptr [rbx+456]>