Dll Memory?

11/10/2014 19:18 Terrat#1
Hallo,
ich schreibe gerade mein eigenes Plugin für ein Spiel. Meine Frage ist nun wie kann ich vectoren erstellen und verwalten ohne das das Zielprogramm mit vectoren arbeiten kann?

Bsp.
Server soll es so callen:
Funktion in der Dll erstellt vector
z.B. push_back (handle von den vector) ?

wie realisiere ich so etwas ?
Ich meine würde am liebsten gleich Vector im Server nehmen aber da dies dort nicht exestiert will ich mir eigene Möglichkeiten suchen.
11/12/2014 10:37 MrSm!th#2
Wieso existieren in der Zielumgebung keine vectors?
11/12/2014 18:24 Terrat#3
Quote:
Originally Posted by MrSm!th View Post
Wieso existieren in der Zielumgebung keine vectors?
Weil ich die Ziel Dll später in einer Script sprache nutzen will die keine Array hat die keine feste Größe haben, sprich es exestiert dort nicht so etwas wie ein Vector.

Später soll das ganze wie folgt aussehen:

(Server lädt plugin)
(....)
(Script callt funktionen)
Code:
new V_Vectortest;

....
I_CreateVector(V_Vectortest);//<- soll den <vector> erstellen und die adresse in V_Vectortest schreiben.
....
I_AddVectorItem(V_Vectortest);//<- soll jetzt halt !nur! mit hilfe  der Adresse die in V_Vectortest drin ist auf die Funktion zugreifen, sprich das geht ja noch einfach mit push_back ...
Meine Überlegung werde ich hier immer mal posten:
Code:
.....
#include <vector>

//funktion zum erstellen
void I_CreateVector(DWORD Adress){
	std::vector<int> Vectoradress;
	Adress = (DWORD)&Vectoradress;
}
So funktioniert es ja aber leider auch nicht:
Code:
int I_AddVectorItem(DWORD Adress, int value){

	(std::vector)Adress.push_back(value);
	return 1;
}
11/12/2014 18:45 ​Tension#4
Wie wäre es wenn du erstmal sagen würdest welche Scriptsprache du verwendest, vielleicht muss man ja gar keinen Wrapper schreiben.
11/12/2014 18:48 Terrat#5
Quote:
Originally Posted by ​Tension View Post
Wie wäre es wenn du erstmal sagen würdest welche Scriptsprache du verwendest, vielleicht muss man ja gar keinen Wrapper schreiben.
;) Pawno *_* ;D xd. da muss man das hab mich da schon informiert
Nun noch mal zurück wie kann ich nun über den Parameter Adress, die Vector klasse nutzen?
11/12/2014 22:15 Logtetsch#6
Ansatz 1:
Code:
reinterpret_cast<std::vector<int>*>(Adress)->push_back(value);
Ansatz 2:
Code:
std::vector<int>* pVector = reinterpret_cast<std::vector<int>*>(Adress);
pVector->push_back(value);
Bevor du dies tust, solltest du natürlich prüfen ob Adress eine gültige Adresse aufzeigt.
11/12/2014 22:15 Terrat#7
Quote:
Originally Posted by Logtetsch View Post
Ansatz 1:
Code:
reinterpret_cast<std::vector<int>*>(Adress)->push_back(value);
Ansatz 2:
Code:
std::vector<int>* pVector = reinterpret_cast<std::vector<int>*>(Adress);
pVector->push_back(value);
Werde ich gleich mal probieren dankö
Keine fehler beim compilen aber beim debuggen / runnen:

Code:
>	Vectorplugintest.exe!std::vector<int,std::allocator<int> >::_Inside(const int * _Ptr) Zeile 1583	C++
 	Vectorplugintest.exe!std::vector<int,std::allocator<int> >::push_back(const int & _Val) Zeile 1244	C++
 	Vectorplugintest.exe!I_AddVectorItem(unsigned long Adress, int value) Zeile 13	C++
 	Vectorplugintest.exe!main() Zeile 22	C++
 	[Externer Code]	
 	[Unten angegebene Rahmen sind möglicherweise nicht korrekt und/oder fehlen, keine Symbole geladen für kernel32.dll]
Code:
Code:
#include <iostream>
#include <Windows.h>
#include <vector>
int I_CreateVector(DWORD Adress){
	std::vector<int> Vectoradress;
	Adress = (DWORD)&Vectoradress;
	return 1;
}
int I_AddVectorItem(DWORD Adress, int value){
	reinterpret_cast<std::vector<int>*>(Adress)->push_back(value);
	//std::vector<int>* pVector = reinterpret_cast<std::vector<int>*>(Adress);
	//pVector->push_back(value);
	return 1;
}
int I_GetVectorItem(DWORD Adress, int item){
	int i_return=0;
	return i_return;
}
int main(){
	DWORD Adress=0x000000;
	I_CreateVector(Adress);
	I_AddVectorItem(Adress,1);
	while (true)
		Sleep(1);
	return 0;
}
11/12/2014 22:33 snow#8
Du solltest dir I_CreateVector noch mal anschauen, da sind mehrere Fehler.
Zum einen ist es keine gute Idee, eine Adresse einer lokalen Variable zurückzugeben, zum anderen solltest du dir call by value / reference / pointer mal anschauen.
11/12/2014 22:38 Terrat#9
edit:
habs mit static versucht in der Funktion klappt jetzt auch kann aber nur 1 mal halt erstellen hat wer ne idee ?
11/12/2014 23:00 Logtetsch#10
Ich verstehe deine Aussage nicht. Versuch dich beim nächsten mal bitte besser auszudrücken und ohne neuen Code kann man dir nur wenig helfen.

Habe die Funktionen etwas umgeschrieben :
Code:
int I_CreateVector(DWORD* Adress){
	if (Adress == nullptr) return FALSE;
	std::vector<int>* pVector = new std::vector<int>();
	*Adress = reinterpret_cast<DWORD>(pVector);
	return TRUE;
}

int I_AddVectorItem(DWORD* Adress, int value){
	if (Adress == nullptr) return FALSE;
	reinterpret_cast<std::vector<int>*>(*Adress)->push_back(value);
	return TRUE;
}

int I_GetVectorItem(DWORD* Adress, int index){
	if (Adress == nullptr) return FALSE;
	return reinterpret_cast<std::vector<int>*>(*Adress)->at(index);
}

void I_FreeVector(DWORD* Adress){
	if (Adress == nullptr) return; //Exception?!
	delete reinterpret_cast<std::vector<int>*>(*Adress);
	*Adress = 0x0;
}

int main(){
	DWORD Adress = 0x0;
	I_CreateVector(&Adress);
	
	for (int i = 0; i < 3; i++)
		I_AddVectorItem(&Adress, i);

	for (int i = 0; i < 3; i++)
		std::cout << "Index: " << i << " Value: " << I_GetVectorItem(&Adress, i) << std::endl;

        I_FreeVector(&Adress);
	return 0;
}
11/12/2014 23:03 Terrat#11
Quote:
Originally Posted by Logtetsch View Post
Ich verstehe deine Aussage nicht. Versuch dich beim nächsten mal bitte besser auszudrücken und ohne neuen Code kann man dir nur wenig helfen.

Habe die Funktionen etwas umgeschrieben :
Code:
int I_CreateVector(DWORD* Adress){
	std::vector<int>* pVector = new std::vector<int>();
	*Adress = reinterpret_cast<DWORD>(pVector);
	return 1;
}

int I_AddVectorItem(DWORD* Adress, int value){
	reinterpret_cast<std::vector<int>*>(*Adress)->push_back(value);
	return 1;
}

int I_GetVectorItem(DWORD* Adress, int index){
	return reinterpret_cast<std::vector<int>*>(*Adress)->at(index);
}

int main(){
	DWORD Adress = 0x0;
	I_CreateVector(&Adress);
	
	for (int i = 0; i < 3; i++)
		I_AddVectorItem(&Adress, i);

	for (int i = 0; i < 3; i++)
		std::cout << "Index: " << i << " Value: " << I_GetVectorItem(&Adress, i) << std::endl;

	return 0;
}
Du bist ein Engel:rolleyes:
11/12/2014 23:08 Logtetsch#12
Hab den Code etwas umgeschrieben. Siehe Edit vom Vorpost.
Call by Reference → [Only registered and activated users can see links. Click Here To Register...]
Pointer Dereferenzierung → [Only registered and activated users can see links. Click Here To Register...]
11/12/2014 23:18 snow#13
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. :(
11/12/2014 23:30 Terrat#14
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. :(
*_* werde sie mir morgen mal angucken. In Pawno exestiert DWORD garnicht, kann ich jetzt eigentlich DWORD einfach als (int) returnen und danach wieder zusammenkratzen ?
11/12/2014 23:32 Logtetsch#15
Quote:
Originally Posted by snow View Post
Pointer übergeben ist uncool. :(
Dreckig und durchaus nicht die beste opportunity - aber dennoch funktional :p

Quote:
Originally Posted by Dreamsläps View Post
In Pawno exestiert DWORD garnicht, kann ich jetzt eigentlich DWORD einfach als (int) returnen und danach wieder zusammenkratzen ?
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.