[REQ] Wert mit .ini bestimmen.

10/23/2013 18:52 [Monstercat]#1
Hallo ich möchte einen wert in einer .asi mit einer .ini bestimmen.
Da ich aber keinerlei Kenntnisse in c++ habe kann ich das selbst nicht machen.

Ich möchte den wert *fDistance = 1500.0; (Wenn es an ist)
und den wert *fDistance = 50.0; (Wenn es aus ist)

in einer .ini bestimmen können
Ich hoffe das mir das jemand machen kann :)

Danke im voraus.

Code:
#include <windows.h>

#define SAMP_INFO  0x212A38
#define SAMP_SETTINGS  0x3CF

//DWORD* pChat = NULL;
DWORD* pInfo = NULL;
BYTE* ThroughWalls = NULL;
BYTE* ShowNameTags = NULL;
float* fDistance = NULL;
//---------------------------------------------------------------------------
bool KeyPressed(BYTE key)
{
	return ((GetAsyncKeyState(key)&(1<<16))!=0);
}
//---------------------------------------------------------------------------

void Thread()
{
  DWORD SampDLL = (DWORD)GetModuleHandleA("samp.dll");
  if(SampDLL){
  pInfo = (DWORD*)(SampDLL+SAMP_INFO);
  while(*pInfo==0) Sleep(1000);
  while(*(DWORD*)(*pInfo+SAMP_SETTINGS)==0) Sleep(1000);
  ShowNameTags = (BYTE*)(*(DWORD*)(*pInfo+SAMP_SETTINGS)+0xE);        
  ThroughWalls = (BYTE*)(*(DWORD*)(*pInfo+SAMP_SETTINGS)+0x5);         
  fDistance = (float*)((DWORD*)(*(DWORD*)(*pInfo+SAMP_SETTINGS)+0x2F));  
  Sleep(14000);
  DWORD OldProt;
  VirtualProtect((LPVOID)ShowNameTags,0x100,PAGE_EXECUTE_READWRITE,&OldProt);
  VirtualProtect((LPVOID)ThroughWalls,0x100,PAGE_EXECUTE_READWRITE,&OldProt);
  VirtualProtect((LPVOID)fDistance,0x100,PAGE_EXECUTE_READWRITE,&OldProt);
  VirtualProtect((LPVOID)SampDLL,0x3071B0, PAGE_EXECUTE_READWRITE, &OldProt);
   for(;;)
   {
   do{
	   Sleep(100);
   }while(!KeyPressed(VK_MENU) || !KeyPressed(VK_F3));
   do{
	   Sleep(50);
   }while(KeyPressed(VK_F3));
   *ShowNameTags = 1;
   *ThroughWalls = 0;
   *fDistance = 1500.0;
   do{
	   Sleep(100);
   }while(!KeyPressed(VK_MENU) || !KeyPressed(VK_F3));
   do{
	   Sleep(50);
   }while(KeyPressed(VK_F3));
   *ShowNameTags = 1;
   *ThroughWalls = 1;
   *fDistance = 50.0;
   }
  }
 }

//-------------------------------------------------------------------------------
int WINAPI DllMain(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
	if(reason==DLL_PROCESS_ATTACH)
	{
		 DWORD OldProt;
		 VirtualProtect((LPVOID)0x401000, 0x4A3000, PAGE_EXECUTE_READWRITE, &OldProt);
		 CreateThread(0, 0, (LPTHREAD_START_ROUTINE)Thread, 0, 0, 0);
	}
	return 1;
}
10/23/2013 22:23 ​Tension#2
Also eine Ini-Datei auslesen kannst du mit [Only registered and activated users can see links. Click Here To Register...]
Code:
UINT WINAPI GetPrivateProfileInt(
  _In_  LPCTSTR lpAppName,
  _In_  LPCTSTR lpKeyName,
  _In_  INT nDefault,
  _In_  LPCTSTR lpFileName
);
Könntest du so anwenden:

Code:
fDistanceOn = GetPrivateProfileInt("fDistance","On",0,"FilePath..");
fDistanceOff = GetPrivateProfileInt("fDistance","Off",0,"FilePath..");
die ini müsste dann so aussehen:
Code:
[fDistance]
On=1500
Off=50
10/23/2013 23:12 [Monstercat]#3
Hey danke für die schnelle Antwort :)
Aber grade bin ich am verzweifeln -.- ich kann Visual Studio nicht mal mehr starten...
ka why und wens ma nicht abkackt kann ich nix erstellen -.- vllt liegts daran das ich grad kompletten Systemscan mache.. vllt hat auch en virus was Kaput gemacht [Only registered and activated users can see links. Click Here To Register...]

Würdest du mir vllt die .asi erstellen ?
Ich wäre dir sehr dankbar :)
10/23/2013 23:36 +Yazzn#4
So in der Art sollte das Funktionieren:

Code:
template <typename T, typename e, typename t, typename a>
T string_to(const std::basic_string<e, t, a> &str)
{
	T result;
	std::basic_stringstream<e, t, a> stream(str);
	stream >> result;
	return result;
}

WCHAR filename[MAX_PATH];
GetModuleFileNameW(module_handle, filename, MAX_PATH);
PathRemoveFileSpecW(filename);
PathAppendW(filename, L"config.ini");
WCHAR buffer[256];
int length = GetPrivateProfileStringW(L"distance", L"on", nullptr, buffer, 256, filename);
float distance_on = string_to<float>(std::wstring(buffer, buffer + length));
length = GetPrivateProfileStringW(L"distance", L"off", nullptr, buffer, 256, filename);
float distance_off = string_to<float>(std::wstring(buffer, buffer + length));
10/24/2013 07:28 Nightblizard#5
[Only registered and activated users can see links. Click Here To Register...]
Quote:
Originally Posted by msdn
This function is provided only for compatibility with 16-bit Windows-based applications. Applications should store initialization information in the registry.

Man sollte meinen gut 20 Jahre nachdem sie als deprecated erklärt worden sind, sind .ini Dateien ausgestorben. Wie man sich irren kann. :rolleyes:

Edit:
@Yazzn:
Nutzt der TE nicht pures C? Da gibt es solche tollen Sachen wie templates und stringstreams nicht.
10/24/2013 13:54 +Yazzn#6
Die Registry war wohl auch nicht das, was man sich erhofft hatte.

------------------------------------------------------------------------------------------------

Der OP hat da was von cpp gesprochen, deshalb ging ich einfach mal von aus, dass der OP einen cpp compiler am Start hat.
10/24/2013 19:49 MrSm!th#7
@ Nightblizzard
Warum sollte man auch auf kleine, schlanke Textdateien verzichten und auf die überladene Registry setzen? Wenn die API Funktionen irgendwann entfernt werden sollten, gebe ich dir mein Wort, werden halt eigene/andere Ini Parser verwendet.

@Topic
Das ist der Coding und nicht der C&P Bereich.