Vánoční nadílka Vánoční nadílka
Až 80% zdarma! Předvánoční BLACK FRIDAY akce. Více informací
Avatar
Caster
Člen
Avatar
Caster:5. srpna 21:30
VOID OnPaint(HDC hdc)
{
        Graphics graphics(hdc);
        Pen      pen(Color(255, 0, 0, 255), 3);
        INT32   LAT[156]{ -10127, -10291, -11002, ...
        };
        INT32   LON[156]{ 73025, 73056, 72348, ...
        };
        POINT    apt[156]{ };
        for (int i = 0; i < 156; i++)   // Naplníme pole pro vynášení bójí
        {
                apt[i].x = (float)LON[i] / (float)180000 * 960 + 960;
                apt[i].y = (float)abs(LAT[i]) / (float)90000 * 540 + 540;
        }
        //graphics.DrawLine(&pen, 0, 0, 200, 100);
        //SetMapMode(hdc, MM_ISOTROPIC);
        //SetWindowExtEx(hdc, 960, 540, NULL);
        //SetViewportExtEx(hdc, cxClient / 2, -cyClient / 2, NULL);
        //SetViewportOrgEx(hdc, cxClient / 2, cyClient / 2, NULL);

        Polyline(hdc, apt, 156);
}

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT iCmdShow)
...

Chci docílit: Kód výše je funkční (není zde uveden celý), pro diskuzi zde jsem jen ponechal první tři hodnoty LAT, LON ze 156. Potřebuji poradit, jak načíst vektor z ASM přímo z paměti. Z C++ volám vlastní funkce v x64 macroassembleru (počet souřadnic a vektor souřadnic ve tvaru QWORD kde LoDWORD je LAT a HiDWORD je LON, souřadnice jsou za sebou. Při pokusu o náhradu počtu bodů (místo 156) v

POINT    apt[156]{ };

pomocí *(DWORD *)(bsrc + 0x01719F0F6B + 4 * i) mi to hlasí chybu, že není definován pointer bsrc a proměnná i. Těm ale přiřadím hodnoty v hlavní části programu ve WinMain. Jak na to ?

 
Odpovědět 5. srpna 21:30
Avatar
Caster
Člen
Avatar
Caster:6. srpna 17:37

Upravil jsem příkaz, aby se odkazoval na hodnoty přímo z paměti:

Polyline(hdc, *(DWORDLONG *)(bsrc + 0x01719F0F6B + 8 * x + 8), *(DWORD *)(bsrc + 0x01719F0F6B + 4 * x + 4));

Překlad mi ale hlásí chybu, že není definován pointer bsrc (je definován v hlavním programu WinMain. Co s tím ? Přesun funkce OnPaint za blok WinMain nepomohlo.

 
Nahoru Odpovědět 6. srpna 17:37
Avatar
Caster
Člen
Avatar
Caster:6. srpna 17:45

bsrc už jsem vyřešil jeho definováním:

BYTE* bsrc = NULL;

před funkcí OnPaint. Poslední problém:

argument of type "DWORDLONG" is incompatible with parameter of type "const POINT *"

Co s tím ? Jde o 64bit pointer, který odkazuje do paměti s daty (souřadnice bodů) pro jejich vykreslení funkcí Polyline.

 
Nahoru Odpovědět 6. srpna 17:45
Avatar
Caster
Člen
Avatar
Caster:6. srpna 23:38

Nakonec se ukázalo, že potřebuji nadefinovat odkaz na data bodů v paměti.
To znamené nahradit řádek programu, který odkazuje na strukturu bodů:

POINT    apt[156]{}

něčím jako

POINT     má_adresa_na_pole_bodů[*(DWORD *)(bsrc + 0x01719F0F6B + 4 * x + 4)]

kde je *(DWORD *)(bsrc + 0x01719F0F6B + 4 * x + 4) odkaz na DWORD hodnotu počet bodů v poli a přesměrovat adresu pole s daty "apt" na mou 64 bit adresu v paměti např. pomocí *(DWORDLONG *)(bsrc + 0x01719F0F6B + 8 * x + 8)

 
Nahoru Odpovědět 6. srpna 23:38
Avatar
Caster
Člen
Avatar
Caster:14. srpna 1:25

Vyřešeno, pomohl

reinterpret_cast<POINT*>(memory)
Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět 14. srpna 1:25
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.