Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Tiedon jakaminen Prosessiin liitettyyn DLL:llään. (C++)

Jarkko-C++ [02.06.2007 20:34:40]

#

Eli siis, olen tekemässä ohjelmaa jonka tietyssä vaiheessa tulee liittää DLL toiseen prosessiin. Se onnistuu vielä, mutta sitten kun pitäisi antaa pää-ohjelmasta tietoa DLL:lle, että mitä tehdä, niin ei onnistu. Yritin File Mappingin avulla, mutta toinen prosessi ei löydä koko File Mappia...
Myös jos joku tietäisi jonkun toisen kätevän tyylin tähän hommaan, niin olisi hienoa.
Kiitos vastauksesta etukäteen.

//DLL, joka liitetään.
BOOL WINAPI DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
	if (ul_reason_for_call == DLL_PROCESS_ATTACH) //Ajetaan itsestään kun dll liitty prosessiin.
	{
		int Function;
		HANDLE FileMap = OpenFileMapping(FILE_MAP_ALL_ACCESS, false, "Global\\DiggerFunction");
		if (FileMap == 0) //Tämä tykkää toteutua joka kerta...
			MessageBox(0, "Error, couldn't open the file map!", "Error.", 0);
		Function = (int)MapViewOfFile(FileMap, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(int));

	}
	return TRUE;
}
//Koodi joka luo file mapin, ajetaan juuri ennen DLL:n liittämistä.
static HANDLE FileMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(Function), "Global\\DiggerFuntion");
	if (FileMap == 0)
		cout<<"Error creating file map!\n";
	LPVOID Pointer = MapViewOfFile(FileMap, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(Function));
	if (Pointer == 0)
		cout<<"Error modifing the file map!\n";
	if (memcpy(Pointer, &Function, sizeof(Function)) == 0)
		cout<<"Error copying data to the file map!\n";

Metabolix [02.06.2007 20:43:47]

#

Tarkoitatko siis, että ohjelma A toimii itsekseen ja ohjelma B käyttää DLL:ää ja näiden kahden pitäisi pystyä nyt keskustelemaan keskenään jotenkin? Hieman jäi epäselväksi, mistä minne dataa piti siirtää. Tekstistäsi sai kuvan, että ohjelma A liittää DLL:n ohjelmaan B, mikä ei kuulosta ainakaan minusta kovin järkevältä... En siis käsittänyt tilannetta.

Jos Windows-versio ei ole esteenä, niin putket voisivat olla yksi helpoimpia tapoja. Niitä ei kuitenkaan taida olla kuin NT-pohjaisissa, ellen aivan väärin muista. Toinen mielestäni hyvä vaihtoehto olisivat socketit, niiden pitäisi yleisesti toimia kyllä.

Jarkko-C++ [02.06.2007 20:52:20]

#

Windowsia käytän joo.
Taisin selittää hieman huonosti. Eli siis, ohjelma A liittää DLL:n ohjelmaan B, joka voi olla periaatteessa mikä tahansa, vaikkapa Windows -laskin. Sitten B:hen liitetyn DLL tulisi saada jotain tietoa A:sta, jotta se tietäisi mitä sen pitäisi tehdä.
Putket? En ole kuullut moisista, mitähän ne ovat?

Metabolix [02.06.2007 21:10:52]

#

Putkiin tutustumisen voi aloittaa vaikka MSDN:n CreateNamedPipe-funktion kuvauksella. Periaatteessa kyseessä on siis virtuaalinen tiedosto. Windowsissa niitä valitettavasti voi käsitellä vain vaikeilla WinAPI-funktioilla, mutta kun kerran tuollaisenkin FileMapping-sotkun olet saanut aikaan, ei putkienkaan pitäisi kovin vaikeita olla. ;)

Jarkko-C++ [02.06.2007 21:18:13]

#

Kiitoksia avusta. Kokeilen hoitaa sen noiden putkien avulla.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta