Sdílená paměť – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Sdílená paměť – C / C++ – Fórum – Programujte.comSdílená paměť – C / C++ – Fórum – Programujte.com

 

TomyB
~ Anonymní uživatel
57 příspěvků
20. 12. 2018   #1
-
0
-

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

Nahlásit jako SPAM
IP: 94.112.168.–
20. 12. 2018   #2
-
0
-

Stálo by za to se podívat na návratové hodnoty funkcí a popř. pomocí GetLastError() získat kód chyby. 

V závěru popisu na https://msdn.microsoft.com/en-us/library/ms959953.aspx jsem narazil na Runs On Windows CE OS a poznámku some devices may not support this API.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
KIIV
~ Moderátor
+43
God of flame
20. 12. 2018   #3
-
0
-
Nahlásit jako SPAM
IP: 62.24.80.–
Program vždy dělá to co naprogramujete, ne to co chcete...
TomyB
~ Anonymní uživatel
57 příspěvků
20. 12. 2018   #4
-
0
-

#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.

Nahlásit jako SPAM
IP: 94.112.168.–
gna
~ Anonymní uživatel
1891 příspěvků
20. 12. 2018   #5
-
0
-

Pokud ten mapping vytváříš, tak bude vyplněný nulami. Pokud už existuje, tak bys asi měl dostat ERROR_ALREADY_EXISTS.

Na otevření existujícího je OpenFileMapping.

Nahlásit jako SPAM
IP: 213.211.51.–
TomyB
~ Anonymní uživatel
57 příspěvků
20. 12. 2018   #6
-
0
-

#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();
Nahlásit jako SPAM
IP: 94.112.168.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 120 hostů

Podobná vlákna

Sdilena pamet — založil markez

Sdilena pamet - 2d pole — založil smoky

Paměť.... — založil yaqwsx

Pamet — založil Lukaydo

Moderátoři diskuze

 

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