Anonymní profil TomyB – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil TomyB – Programujte.comAnonymní profil TomyB – Programujte.com

 

Příspěvky odeslané z IP adresy 94.112.168.–

TomyB
C / C++ › Nechce se mi uvolnit pamět p…
14. 1. 2019   #382795

Jak mám přesně uvolnit paměť po tom co si vytvořím bitrmapu. Zůstává mi viset a pořád se navyšuje až system spadne.

vytvořím si bitmapu z hdc

hBitmapOut = reinterpret_cast<HBITMAP>(GetCurrentObject(hdcMem, OBJ_BITMAP));

a pošlu ji na static

SendMessage(hButton, STM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBitmapOut)

Pokud po SendMessage zadám
 

DeleteObject(hBitmapOut);

tak se do staticu nic neposle, ale paměť se uvolní, proste se to neprojeví, pokud to tam nedám, tak se bitmapa zobrazi ale paměť se neuvolní. Pokud opakuji fci, tak si to pokažde vezme kus paměti.

V jaké fázi nebo kde ji mám uvolnit?

Díky

TomyB
C / C++ › Kombinace a zpětné zjištění
13. 1. 2019   #382774

#14 Radek Chalupa
je to tak, mám stejný názor

TomyB
C / C++ › Kombinace a zpětné zjištění
13. 1. 2019   #382772

#12 Radek Chalupa
Díky, takhle by se mi to libilo, je to elegantni, ale ja tu hodnotu, kterou obdržím nemůžu ovlivnit, vytváří ji jiná aplikace a zapisuje do sdílené paměti. Musim si poradit z toho co mam.

Připojen obrázek.

TomyB
C / C++ › Kombinace a zpětné zjištění
13. 1. 2019   #382768

#9 Radek Chalupa
měla, ale je tam nějaká výjimka, resp nastavil jsem si

int indicators[]={0x01, 0x02, 0x08, 0x10, 0x20, 0x30};

fakt je, že u ikon 0x10 a 0x20 může být zobrazena jen pouze jedna z nich, nemuzou svitit obe. Zbytek libovolne. Protože kdyby svítili obě, dostal bych 0x30, coz je uplne jina ikona.

A s tímto nastavením se mi to detekuje správně. Otestoval jsem všechny varianty, a je to ok.

Díky

TomyB
C / C++ › Kombinace a zpětné zjištění
12. 1. 2019   #382765

#7 gna
Perfektní, funguje to dokonale, upravil jsem si, rptože na vstupu mam hexa toho indikatoru, ne jeho poradove cislo.

bool IsIconActive(int icon, int grp)
{
	int indicators[]={0x01, 0x02, 0x08, 0x10, 0x30};
	bool isset[]={false, false, false, false, false};
	int iconpos;

	for (int i = (sizeof(indicators)/sizeof(*indicators)); i >= 0; i--) {
		if (icon == indicators[i])
			iconpos = i;
		int ind = indicators[i];
		if (grp >= ind) {
			grp -= ind;
			isset[i] = true;
		}
	}

	return isset[iconpos];
}


Díky moc

TomyB
C / C++ › Kombinace a zpětné zjištění
12. 1. 2019   #382760

#4 gna
#5 gna
ok, zkousim ten tvuj kod, ale ten mi jaksi nejde

IsIconActive(0x30, 0x48);

grupa 0x48 se skládá z ikon (0x8 , 0x10 a 0x30)

a testuji zda je v grupě ikona 0x30

výsledkem v tvem kodu jsou všechny false, ačkoli u té poslední by se očekávalo true

TomyB
C / C++ › Kombinace a zpětné zjištění
12. 1. 2019   #382757

#2 TomyB
Ten výpočet totalu je tam navíc, není potřeba :-)

TomyB
C / C++ › Kombinace a zpětné zjištění
12. 1. 2019   #382756

#1 TomyB
Napadlo mě toto, vypadá, že by to mohlo funovat
 

bool IsIconActive(int icon, int grp) {
	byte indicators[]={0x01, 0x02, 0x08, 0x10, 0x30};

	int total;
	for (int i=0; i<sizeof(indicators);i++){
		total += int((unsigned char)indicators[i]);
	}

	int a = grp - icon;

	for (int i=sizeof(indicators)-1; i>=0;i--){
		int indi = int((unsigned char)indicators[i]);

		if (indi<=a) {
			a -=  indi;
		}
		if (a==0) {
			return TRUE;
		}
	}
	return FALSE;
}
TomyB
C / C++ › Kombinace a zpětné zjištění
12. 1. 2019   #382754

Možná se ptám hloupě, ale dostávám identifikátor v podobě hexa, který identifikuje jaké indikační ikony jsou právě zobrazeny

Zjednoduším to

Ikona A předtavuje 0x1
Ikona B předtavuje 0x2
Ikona C předtavuje 0x8
Ikona D předtavuje 0x10
Ikona E předtavuje 0x30
atd

pokud je zobrazeno více ikon obdržíme součet jejich hexa čísel, tedy pokud je zobrazeno
A, E obdržím 0x31
A, B, C, D obdržím 0x1B
C, D, E obdržím 0x48
atd.


Snažím se zpětně zeptat, zda je daná ikona právě aktivní, tzn obdržím např. 0x48 a potřebuji vědět, zda ikona C tj. 0x8 je právě zobrazena.
Protože kombinací bez opakování je fakt hodně, tak mi přijde ptát se podmínkou trošku nepraktické.
Netušil by někdo jak by se to dalo ošetrit nejakou funkci a zjistit zda je ikona aktivní?

Díky za jakokolic radu jak se k tomu dopracovat


 

TomyB
C / C++ › Parsování byte array
8. 1. 2019   #382725

řešení je

int a = int((unsigned char)(tmpData[1]) << 8 |
            (unsigned char)(tmpData[0]));

výsledek (a = 954)

TomyB
C / C++ › Parsování byte array
8. 1. 2019   #382724

Parsuji byte array, z pozice 0x22c potřebuji přečít 2 bajty [BA 03]. a převést na 954 Ale vrací mi to záporné číslo. (očekávám v DEC 186 a 3, ale dostanu -70 a 3). Čím by to mohlo být?

void ReadData(DWORD offset, const void* cvData, char* outStr) {
	
	const unsigned char * const bytes = static_cast<const unsigned char *>(cvData);
	
	memcpy(outStr, &bytes[offset], sizeof(outStr) - 1);
}


int GetFreq() {

	const void * cvData;
	if (GetSharedMemory(_T("SharedMemory"), 0x23E8, cvData))
	{
		char tmpData[2];
		ReadData(0x22c, cvData, tmpData);

		int b1 = tmpData[0];
		int b2 = tmpData[1];


		// ???
		return 1;

	} else {
		return 0;
	}
}

Připojen obrázek.

Díky za radu

TomyB
C / C++ › Sdílená paměť
20. 12. 2018   #382622

#5 gna
teď nad tím sedím, ta fce je funkční, ale na druhé straně je pamě´t prázdná. udělal jsem si dva procesy kde vytavřím pamět a ve druhem ji ctu a to funguje.

OpenFileMapping nelze použít WinCE ji nezná,a le funguje to přes
CreateFileMapping.

Důležité je nezavřít handle v prvním procesu jinak se paměť ztratí.

Proces1
 

#define BUF_SIZE 256
TCHAR szName[]=TEXT("SharedMemory");
TCHAR szMsg[]=TEXT("Ahoj svete!");

int setmem()
{
   HANDLE hMapFile;
   LPCTSTR pBuf;

   hMapFile = CreateFileMapping(
                 INVALID_HANDLE_VALUE,    // use paging file
                 NULL,                    // default security
                 PAGE_READWRITE,          // read/write access
                 0,                       // maximum object size (high-order DWORD)
                 BUF_SIZE,                // maximum object size (low-order DWORD)
                 szName);                 // name of mapping object

   if (hMapFile == NULL)
   {
      _tprintf(TEXT("Could not create file mapping object (%d).\n"),
             GetLastError());
      return 1;
   }
   pBuf = (LPTSTR) MapViewOfFile(hMapFile,   // handle to map object
                        FILE_MAP_ALL_ACCESS, // read/write permission
                        0,
                        0,
                        BUF_SIZE);

   if (pBuf == NULL)
   {
      _tprintf(TEXT("Could not map view of file (%d).\n"),
             GetLastError());

       CloseHandle(hMapFile);

      return 1;
   }


   CopyMemory((PVOID)pBuf, szMsg, (_tcslen(szMsg) * sizeof(TCHAR)));

   UnmapViewOfFile(pBuf);

   //CloseHandle(hMapFile);

   return 0;
}

setmem();


Proces 2
Pokud nevim velikost, lze definovat 0, taky to funguje, nesmi byt ovšem větší nez původně definovaná, jinak to skonci chybou.

#define BUF_SIZE 0x0
TCHAR szName[]=TEXT("SharedMemory");

int getmem()
{
   HANDLE hMapFile;
   LPCTSTR pBuf;

   /*hMapFile = OpenFileMapping(
                   FILE_MAP_ALL_ACCESS,   // read/write access
                   FALSE,                 // do not inherit the name
                   szName);               // name of mapping object*/

      hMapFile = CreateFileMapping(
                 INVALID_HANDLE_VALUE,    // use paging file
                 NULL,                    // default security
                 PAGE_READWRITE,          // read/write access
                 0,                       // maximum object size (high-order DWORD)
                 BUF_SIZE,                // maximum object size (low-order DWORD)
                 szName);                 // name of mapping object

   if (hMapFile == NULL)
   {
      _tprintf(TEXT("Could not open file mapping object (%d).\n"),
             GetLastError());
      return 1;
   }

   pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object
               FILE_MAP_ALL_ACCESS,  // read/write permission
               0,
               0,
               BUF_SIZE);

   if (pBuf == NULL)
   {
      _tprintf(TEXT("Could not map view of file (%d).\n"),
             GetLastError());

      CloseHandle(hMapFile);

      return 1;
   }

   MessageBox(NULL, pBuf, TEXT("Process2"), MB_OK);

   UnmapViewOfFile(pBuf);

   CloseHandle(hMapFile);

   return 0;
}

getmem();
TomyB
C / C++ › Sdílená paměť
20. 12. 2018   #382617

#3 KIIV
Proces co vytváří sdílenou paměť neovlivním.

Ale z toho, jak k ni přistupuje jiná aplikace, která mně přiliš nevyhovuje, a potřebuji si ji předělat podle vlastních poždavavků na výstup, tak si data ze sdílené paměti stahuje v nějakém intervalu cca 5s, neustále obnovuje, ani neposílá žádnou message na původní aplikaci, která by ji data dopředu připravila.

Takže ten handle v původní aplikaci bude asi neustále otevřen.

TomyB
C / C++ › Sdílená paměť
20. 12. 2018   #382613

Ahoj. Potřeboval bych se dostat ke sdílené paměti vytvořené jinou aplikací.

Znám její name a size.

Vytvořil jsem si tuto fci, ale pořád nejsem schopný dostat jakokoliv odpověď. Může mi někdo poradit, co je špatně.

int Init(wchar_t const * szName, unsigned long BUF_SIZE) {
	HANDLE hMapFile;
	LPCTSTR pBuf;

	hMapFile = CreateFileMapping(
		INVALID_HANDLE_VALUE,
		NULL,
		PAGE_READONLY,
		0,
		BUF_SIZE,
		szName);

	pBuf = (LPTSTR)MapViewOfFile(hMapFile,
		FILE_MAP_READ,
		0,
		0,
		BUF_SIZE);

	MessageBox(NULL, pBuf, TEXT("Content"), MB_OK);
	UnmapViewOfFile(pBuf);
	CloseHandle(hMapFile);
	return 0;
}

Init(L"DiagSharedMemory",0x38);


Díky

TomyB
C / C++ › Jak správně využít fci v DLL…
27. 11. 2018   #382441

#3 hlucheucho
Jo rezignace už přichází. Napadá mě taková věc, co vytvořit dll se stejnou fci a pro test ji nahradit za orginální a ve fci si logovat vše co do ní přichází, bych aspoň mohl zjsitit jaké parametry se do ní posílají. mělo by to význam, nebo je to ztráta času?

TomyB
C / C++ › Jak správně využít fci v DLL…
27. 11. 2018   #382437

Rád bych využil fci v DLL třetí strany.
Mám k dispozici DLL a jeho map, kde vím jaké fce obsahuje
 

  Address         Publics by Value              Rva+Base
 0001:00000008       CRT_SearchCharTable        10001008 f
 0001:000005e4       CRT_SearchRdsTable         100015e4 f

žel nevím jaké jsou vstupní parametry a výstup, ale z exe který knihovnu používá a jeho mapy vím, že volá tyto fce

0001:00000920       ?SearchRdsTable@@YAPA_WG@Z 00011920 f
0003:000340ec       ?CRT_SearchRdsTable@@3P6APA_WG@ZA 000a00ec

když provedu undecorate, zjsitim, že

@@YAPA_WG@Z = wchar_t * __cdecl a(unsigned short);

@@3P6APA_WG@ZA = wchar_t * (__cdecl* a)(unsigned short)

Vytvořil jsem si malý testik, ale nebude to to správné, nedostávám žádnou informaci.
Nemám s tím někdo zkušenost, jak fci z knihovny správně zavolat z těchto dostupných informací

HINSTANCE g_pRdsTable = LoadLibrary(L"RdsTable.dll");
if (g_pRdsTable) {
	typedef wchar_t * (__cdecl* fce)(unsigned short a);
	fce CRT_SearchRdsTable = (fce) GetProcAddress(g_pRdsTable, _T("CRT_SearchRdsTable"));
	if (CRT_SearchRdsTable) {
		LPTSTR Res = CRT_SearchRdsTable(0);
		MessageBox(Res,_T("RDS"), MB_OK);
	}
}

Díky

 

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý