Dll Memory?

11/12/2014 23:34 Terrat#16
Quote:
Originally Posted by Logtetsch View Post
Dreckig und durchaus nicht die beste opportunity - aber dennoch funktional :p
Ok bin mal deine links angucken, danach pennen bis dann.

Quote:
Originally Posted by snow View Post
Hier mal meine Version:

Code:
#include <iostream>
#include <Windows.h>
#include <vector>

int I_CreateVector(DWORD_PTR &address)
{
	address = reinterpret_cast<DWORD_PTR>(new std::vector<int>);
	return 1;
}

int I_AddVectorItem(DWORD_PTR address, int value)
{	
	auto &vector = *reinterpret_cast<std::vector<int> *>(address);
	vector.push_back(value);
	return 1;
}

int I_GetVectorItem(DWORD_PTR address, int index)
{
	auto &vector = *reinterpret_cast<std::vector<int> *>(address);
	return vector[index];
}
int main()
{
	DWORD_PTR address = 0x00000000;
	
	I_CreateVector(address);
	
	for (auto i : { 1, 3, 5, 7 })
	{
		I_AddVectorItem(address, i);
	}
	
	for (int i = 0; i != 4; ++i)
	{
		std::cout << "Item: " << I_GetVectorItem(address, i) << std::endl;
	}
}
Pointer übergeben ist uncool. :(
Bist natürlich auch ein Engel

Quote:
Originally Posted by Logtetsch View Post
Dreckig und durchaus nicht die beste opportunity - aber dennoch funktional :p



DWORD ist nur ein typedef für unsigned int. Du kannst einen DWORD auch als int zurückgeben, jedoch könntest du dabei wichtige Informationen verlieren.
??.welche infos ?
11/12/2014 23:56 snow#17
DWORD_PTR ist sowieso nur ein typedef. Wichtig ist, dass sizeof(void*) == sizeof(DWORD /* oder unsigned int oder unsigned long */) ist. Würde es mit unsigned long probieren, oder int, wenn du eine x86 Architektur nutzt, da dürfte das klappen.

Quote:
Dreckig und durchaus nicht die beste opportunity - aber dennoch funktional
Für die meisten Funktionen benötigt man gar keinen Zeiger, ein call by value mit dem DWORD_PTR reicht dabei komplett aus und beugt unerwünschte Modifikationen vor. I_CreateVector muss aber mit einer Referenz, bzw. wenn das nicht geht, weil man eine C-Schnittstelle braucht oder so, bzw. einem Pointer arbeiten.
11/13/2014 11:10 Terrat#18
Danke sehr.
Klappt jetzt wunder bar ( lasse als unsigned int returnen).

Wie lösche ich den jetzt noch ?
z.B. I_DeleteVector(DWORD Adress) ps damit meine ich jetzt nicht ein item des vectors sondern den Kompletten Vector. (clear löscht ja schon alle items aber wie lösche ich ihn jetzt wd. ?)
Code:
delete(&Adress);//<-Crash
[Only registered and activated users can see links. Click Here To Register...]
11/13/2014 12:07 snow#19
delete reinterpret_cast<std::vector<int> *>(address);

Bitte schau dir noch mal das Thema Referenzen & Pointer an. :/
11/13/2014 18:43 Logtetsch#20
Schau dir mal meinen Post an → [Only registered and activated users can see links. Click Here To Register...]
Die Funktion I_FreeVector sollte das sein, wonach du suchst, alternativ über Referenzen arbeiten wie snow bereits gesagt/gezeigt hat.
11/13/2014 20:54 Terrat#21
Quote:
Originally Posted by Logtetsch View Post
Schau dir mal meinen Post an → [Only registered and activated users can see links. Click Here To Register...]
Die Funktion I_FreeVector sollte das sein, wonach du suchst, alternativ über Referenzen arbeiten wie snow bereits gesagt/gezeigt hat.
+_+ Hm, hab anscheinend nen riesen Riss im Bildschirm ;D ne Spaß bei Seite hatte das übersehen dankö.