Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  &char*->LPVOID->&char* ? (c++) märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
Hazar
Kreisi kasutaja
Hazar

liitunud: 24.08.2004




sõnum 26.06.2010 04:40:44 &char*->LPVOID->&char* ? (c++) vasta tsitaadiga

Pikalt pead murdnud selle üle aga ei mõtle välja.. siiamaani on

char * juku = "Tere";
LPVOID juhan = &juku;

ning nüüd on vaja lpvoidist tagasi saada char* (oletades et pikkus on teada)

milleks? programmA kirjutab programmB mällu byte array juku ning annab progammB'le array aadressi ning pikkuse, nüüd vaja programmBs sellega edasi toimetada kuid kuidagi ei saa datat kätte icon_sad.gif
Kommentaarid: 29 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 28
tagasi üles
vaata kasutaja infot saada privaatsõnum
troglodyte
Kreisi kasutaja
troglodyte

liitunud: 09.08.2002




sõnum 26.06.2010 10:40:09 vasta tsitaadiga

LPVOID on ilmselt void pointer (void *)? Kui nii siis void pointerisse salvestatud mäluaadressil olevad andmed saab kätte *(char **)juhan abil.
_________________
ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn
Kommentaarid: 34 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 34
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
i8080
Kreisi kasutaja
i8080

liitunud: 15.03.2002



Autoriseeritud ID-kaardiga

sõnum 26.06.2010 11:18:43 vasta tsitaadiga

char* juku = "Tere";
LPVOID juhan = &juku;

char* tuhajuhan = (char*)*juhan;

ja nüüd võid datat bait haaval näppida näiteks stiilis
char a = tuhajuhan[0];
või
char a = *(tuhajuhan + 0);

LPVOID alusel oletan kasutad win32 api.
ja kas protsesside (programmA ja programmB) mälu kopeerimiseks ikka kasutad ReadProcessMemory(..)
niisama pointerid teises protsessis ei viita samale data massiivile. igal protsessil on oma aadressruum ja teise ruumi pääsuks peab enne ligipääsu tekitama
Kommentaarid: 169 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 151
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
wigry
HV vaatleja

liitunud: 18.06.2010




sõnum 26.06.2010 11:52:02 vasta tsitaadiga

Siin tekib jah pigem küsimus protsesside vahelises andmevahetuses. Win32 API-s peaks olema ka natuke elegantsemaid võimalusi kui lihtsalt teise protsessi aadress space'i baitide kirjutamine (kuigi mul tekib väike kahtlus, kas ikka niisama saab teise protsessi aadressruumi kätte, kui me just win98-st ei räägi)
tagasi üles
vaata kasutaja infot saada privaatsõnum
Hazar
Kreisi kasutaja
Hazar

liitunud: 24.08.2004




sõnum 26.06.2010 13:18:58 vasta tsitaadiga

kirjutan VirtualAllocEx -> WriteProcessMemory, siia maani pole keegi vastu tõrkunud
kui oleks teada elegantsem võimalus siis kasutaks seda kuid mindagi muud (peale failile kirjutamise) pähe ei tulnud (tegu pole tingimata programmide vahelise suhtlusega vaid threadide ning need ei taha peale ühe lpvoidi millestki kuulda)

troglodyte kirjutas:
LPVOID on ilmselt void pointer (void *)? Kui nii siis void pointerisse salvestatud mäluaadressil olevad andmed saab kätte *(char **)juhan abil.

see töötas suur tänu!
Kommentaarid: 29 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 28
tagasi üles
vaata kasutaja infot saada privaatsõnum
wigry
HV vaatleja

liitunud: 18.06.2010




sõnum 26.06.2010 14:52:48 vasta tsitaadiga

Nimetades mõningaid:

- Shared memory
- named pipe
- WinSock
- Mailslot

http://www.codeproject.com/KB/threads/Win32IPC.aspx

ja alati on võimalik kasutada MSMQ-d
tagasi üles
vaata kasutaja infot saada privaatsõnum
Hazar
Kreisi kasutaja
Hazar

liitunud: 24.08.2004




sõnum 26.06.2010 14:59:21 vasta tsitaadiga

need näevad välja nii pirakad võrreldes minu 3 reaga saatja ja 2 reaga saaja poolel (oletades, et handle on mul naguinii olemas ja juba eelnevalt kasutuses)
Kommentaarid: 29 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 28
tagasi üles
vaata kasutaja infot saada privaatsõnum
murka_
HV vaatleja

liitunud: 05.08.2008




sõnum 26.06.2010 15:19:38 vasta tsitaadiga

Siiamaani olen kasutanud _beginthread() funktsiooni, millega annan kaasa argumendid void pointeriga. Olenevalt vajadusest on selleks argumendiks muutuja, struktuur või midagi enamat. Teises threadis teen lihtsa casti ja ongi mul ühised muutujad.

void funktsioon(void *vpArgument) {
   int *yhineMuutuja=(int*)vpArgument;
}

int main() {
   int yhineMuutuja=0;
   uintptr_t thread=_beginthread(funktsioon, 0, &yhineMuutuja);
}
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 4
tagasi üles
vaata kasutaja infot saada privaatsõnum
wigry
HV vaatleja

liitunud: 18.06.2010




sõnum 26.06.2010 17:08:40 vasta tsitaadiga

No jah, eks tööriist sõltub probleemist, et kui on vaja teha keerukas mitmest protsessist koosnev süsteem, siis arhitektuuriliselt on mõistlik valida siis korralik IPC lahendus. Kui aga vaja vaid kahe tillukese threadi vahel infot vahetada siis korrektne viis oleks seda teha läbi sünkroniseeritud globaalsete muutujate, millele on mõlemal threadil ligipääs. Siit kohe veel küsimus, et kui need threadid nii tillukesed on ja üldse lahendus tilluke, siis kas ikka peab mitu protsessi/threadi olema... Äkki overkill?
tagasi üles
vaata kasutaja infot saada privaatsõnum
murka_
HV vaatleja

liitunud: 05.08.2008




sõnum 26.06.2010 17:15:28 vasta tsitaadiga

Äkki peab üks asi kestvalt midagi tegema ja teine thread annab ainult infot kas jätkata või peatuda, samas alati olema valmis kasutajalt sisestust vastu võtma?
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 4
tagasi üles
vaata kasutaja infot saada privaatsõnum
Hazar
Kreisi kasutaja
Hazar

liitunud: 24.08.2004




sõnum 26.06.2010 17:30:57 vasta tsitaadiga

thread asub teises programmis CreateRemoteThread (mõte polegi performancis vaid pigem triggerina kasutades)

kui oleks kohalik siis teeb LPVOID automaatselt talle antud asjandusest pointeri ja püüdev funkt saab sedapidi kohe data juurde kuid oma address spaces tehtud pointeris pole teises protsessis tolku, siis peab refereerima target protsessis ehitatud tüüp pointerile kuid mul on saatjaks vb.net ja see ei jaga matsu laiali seega piirdusin vaid mälu aadressi saatmisega ja lasin target functil koha peal välja nuputada
Kommentaarid: 29 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 28
tagasi üles
vaata kasutaja infot saada privaatsõnum
wigry
HV vaatleja

liitunud: 18.06.2010




sõnum 26.06.2010 18:47:36 vasta tsitaadiga

Hmm, saadad mäluaadresse ja oled sunnitud tegema musta maagiat, selle asemel, et otse ühelt protsessilt andmeid teise protsessi saata. Et kuna ma olen aastaid integratsiooni valdkonnas toimetanud, siis taoline mäluaadressidega toimetamine tundub natuke kehvakese kodukootud IPC quickhackina. Mina analüüsiks situatsiooni ja panustaks õigele arhitektuurile. On ju hetkel tegu lisaks erinevate protsessidele ka erinevate keeltega, seega oleks vaja mingit kõrgema taseme toru, millega andmed ühest teise toimetada. Samas puudub mul muidugi igasugune info, kas korraliku lahenduse jaoks aega, ressurssi ja tahtmist kah oleks icon_smile.gif
tagasi üles
vaata kasutaja infot saada privaatsõnum
Hazar
Kreisi kasutaja
Hazar

liitunud: 24.08.2004




sõnum 26.06.2010 19:15:52 vasta tsitaadiga

heh aega ja ressurssi oleks kuid tegu on "kärab küll" lahendusega icon_razz.gif vbl tulevikus kui asjast piisavalt kasu teen ümber
Kommentaarid: 29 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 28
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004



Online

sõnum 26.06.2010 22:31:08 vasta tsitaadiga

Enamus ajutisi lahendusi on jääva loomuga.
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  &char*->LPVOID->&char* ? (c++)
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.