C/C++ skicka pekare mellan program

Permalänk
Medlem

C/C++ skicka pekare mellan program

Har ett program (A) som kör ShellExecute på andra program (B).
Program A skickar vid öppnandet av program B med en kommandosträng som innehåller pekare till två variabler, ex:

... char psc_mem_locs[80]; char psc_prgm_result[256]; bool b_prgm_done = 0; // copy adresses of variables into string sprintf(psc_mem_locs, "%d %d", psc_prgm_result, &b_prgm_done); ShellExecute(HW_console_window, "open", psc_filename, psc_mem_locs, NULL, 0); while (!b_prgm_done); ...

Den sista while-satsen körs alltså tills dess att bool-variabeln ändras till true...
Program B ska då ta emot perkarna och operera på dem...
Exempel:

int main(int argc, char **argv){ char *psc_prgm_result; bool *pb_prgm_done; if (argc > 2){ psc_prgm_result = (char *)atoi(argv[1]); pb_prgm_done = (bool *)atoi(argv[2]); strcpy(psc_prgm_result, "Hello from pq.exe"); *pb_prgm_done = 1; } // return back to windows return(0); }

Grejen är den att Program A aldrig registrerar att ändringar sker...
Har kollat att det blir rätt adresser som tas emot av Program B...

Går det inte att operera på variabler som inte allokerats i samma program, eller?

Hjälp...

Permalänk
Medlem

Jag kan inte så mycket C++ för att ge ett 100%-igt svar, men det borde inte vara möjligt, eftersom det innebär enorma säkerhetsluckor. Tänk om vilket program som helst bara kunde hämta ut en minnesadress och göra vad den vill med den och dess innehåll?

En minnesadress skyddas väl av det program som för stunden använder det. (fast det kanske inte är sant alls. Jag gissar mest nu och svarar för att jag inte har så mycket annat att göra...)

EDIT: Efter ytterligare betänketid kan jag inte annat än konstatera att det vore nästintill fullständig idioti om en sådan handling vore möjlig.

Visa signatur

We shall never cease from exploration And the end of all our exploring Will be to arrive where we started And know the place for the first time.
- T. S. Eliot

Permalänk
Medlem

Det är nog inte så enkelt. Orkar inte förklara varför men tro på mig att det är så.

Vad du kan testa är å använda GlobalAlloc för å allocera i program A o skicka sen den pekare till program B. Om inte det funkar, kolla på CreateFileMapping och MapViewOfFile i MSDN på det sättet går det 100% säkert å lösa för det har jag gjort tidigare.

Edit: Kom på att man kan göra roliga saker med ReadProcessMemory/WriteProcessMemory oxå

Visa signatur

Surf/jobbdator: i7 3770K | GA-Z77-D3H | 16 GB | Intel 510 + 750 GB | HD6870 2GB | 30'' | P180B
Server: Phenom X4 9500 | GA-MA78G-DS3H | 8 GB | 5.4 TB | YY-0221
Speldator: IBM PC XT | 8088 4.77 MHz | 640k | 10 MB HDD | EGA | 360k/720k diskett

Permalänk
Medlem

Mmm, man kan göra en massa roliga trainers...

Visa signatur

Abit KN8-SLI, XFX 7800GT,1 x Crucial Ballistix 1024MB pc4000 (En till på ingång), A64-X2 3800+@250x10

Permalänk
Medlem

Typ.. Men han kan ju göra det han vill genom dom där 2 funktioner oxå

Visa signatur

Surf/jobbdator: i7 3770K | GA-Z77-D3H | 16 GB | Intel 510 + 750 GB | HD6870 2GB | 30'' | P180B
Server: Phenom X4 9500 | GA-MA78G-DS3H | 8 GB | 5.4 TB | YY-0221
Speldator: IBM PC XT | 8088 4.77 MHz | 640k | 10 MB HDD | EGA | 360k/720k diskett

Permalänk
Medlem

Kör shared memory, pipes eller så kan du köra loopback interfacet etc...

Om det bara är bool du behöver dela kör en global semaphore.

Visa signatur
Permalänk
Medlem

Re: C/C++ skicka pekare mellan program

Citat:

Ursprungligen inskrivet av Osaou
Grejen är den att Program A aldrig registrerar att ändringar sker...
Har kollat att det blir rätt adresser som tas emot av Program B...

Det är inte riktigt så enkelt. I ditt första program kommer pb_prgm_done att läggas i ett register, den kommer aldrig hämta värdet från minnet igen. Om du har otur kommer ditt andra progam krashar ibland, och ge "invalid write of memory location".

Minnesadressen du kopierade är inte heller den "riktiga" adressen, utan en virtuell. Minne kan ju swappas ut till disk och flyttas om. Jag är inte riktigt säker på hur det fungerar, men varje program har en egen virtuell adressrymd som inget annat program kan läsa/skriva från/till.