Hilfe beim Auslesen von Aliase aus INI Dateien...
-
Ich habe eine Shell die Befehle ausführt, hierbei wird ein Befehl eingelesen und vor der Ausführung überprüft ob nicht der eingegebene Befehl als ein Alias gespeichert wurde, wenn ja wird dieser Ausgeführt.
Meine INI Datei:
[Alias] ps=proc -l hl=help sht=shutdown kl=killWie kann ich alle Unterpunkte von [Alias] auslesen, also in dem Beispiel wären es 4 Aliase, die mit dem eingelesen Befehl vergleicht werden und bei Übereinstimmung ausgeführt.
Bitte um Hilfe
-
zum auslesen: unter windows (denk xmd-tools is in windows, oder), nimm
ReadPrivateProfileStringaliase in einer
std::map<string, string> speichern, dann mittels map:find suchen, ob der befehl ein alias is und den wert der map ausführen.kurz: alle laden, vor jedem eingegebenen befehl gucken, ob der nich ein alias is und dann den anderen befehl dafür ausführen
-
Hab folgendes zusammengestrickt:
#include <windows.h> #include <iostream> #include <string> #include <map> using namespace std; int main(int argc, char* argv[]) { string file = "shell.ini"; char tmp[100]; DWORD destSize = 500; //Beispiel: //ps = proc //tk = bla bla //hl = help //### PROBLEM 1 ### Aliase ps, tk, hl, ... unbekannt!!! GetPrivateProfileString("Alias", "ps", "NULL", tmp, destSize, file.c_str()); GetPrivateProfileString("Alias", "tk", "NULL", tmp, destSize, file.c_str()); GetPrivateProfileString("Alias", "hl", "NULL", tmp, destSize, file.c_str()); //...belibieg viele Aliase... //Befehl einlesen -> hier ein Alias string befehlEingelesen = "hl"; map<string, string> testmap; map<string, string>::iterator iter; //### PROBLEM 2 ### testmap[tmp] = befehlEingelesen; testmap[tmp] = befehlEingelesen; testmap[tmp] = befehlEingelesen; string Alias; for(iter = testmap.begin(); iter != testmap.end(); iter++) { if(iter->first == iter->second) { cout << "Befehl gefunden..." << endl; cout << iter->first << " - " << iter->second << endl; Alias = iter->first; } } cout << "Alias: " << Alias << endl; system("pause"); return 0; }Meine INI Datei:
[Alias] ps=bla tk=test hl=help pl=haus ...Mein erstes Problem ist, wie bekomme ich raus wieviele und welche Aliase in der Datei stehen, hiermit mein ich ps, tk, hl, pl, ... diese sind unbekannt, deshalbt muss ich das mit GetPrivateProfileString() eleganter verarbeiten.
2 Problem: Ich habe tmp so in mein Map gespeichert: testmap[tmp]
Wie würdet ihr das verbessern? Info testmap[] soll nur einmal aufgerufen werden und nicht wie oben x-mal.
-
Wenn du als zweiten Parameter an GetPrivateProfileString() einen NULL-Zeiger übergibst, erhältst du alle Bezeichner in der Sektion:
char tmp[100],tmpnames[100];//Achtung: Du benötigst eventuell mehr Platz, wenn du viele Alias-Bezeichner eingetragen hast int namesize=GetPrivateProfileString("Alias",NULL,"",tmpnames,100,file.c_str()); for(char* p=tmpnames;p<tmpnames+namesize;p+=strlen(p)+1) { GetPrivateProfileString("Alias",p,"",tmp,100,file.c_str()); alias_map[p]=tmp; }PS: Du solltest so einer Funktion immer die korrekte Größe deines Speichers mitgeben - und wenn du ein Array für 100 char's angelegt hast, kannst du dort keine 500 Zeichen reinpacken.
Edit: Flüchtigkeitsfehler beseitigt
-
Bekomme folgenden Fehler in der Datei strlen.asm:
Unbehandelte Ausnahme bei 0x0044d790 in test.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.main_loop: -> mov eax,dword ptr [ecx] ; read 4 bytesmap<string, string> alias_map; char tmp[1024], tmpnames[1024];//Achtung: Du benötigst eventuell mehr Platz, wenn du viele Alias-Bezeichner eingetragen hast int namesize=GetPrivateProfileString("Alias",NULL,"",tmpnames,100,file.c_str()); for(char* p=0; p<tmpnames+namesize; p+=strlen(p)+1) { GetPrivateProfileString("Alias", p, "", tmp, 100, file.c_str()); cout << tmp << endl; alias_map[p]=tmp; }
-
Sorry, kleiner Flüchtigkeitsfehler:
for(char*p=tmpnames;...)(das kommt davon, wenn man mitten im Beitrag entscheidet, von Index-Zugriff auf Zeiger-Zugriff umzuschalten :D)
-
Danke für die Bemühungen, hab in der zeit eine Alternative erstellt:
#include <windows.h> #include <iostream> #include <string> #include <vector> #include <map> using namespace std; vector<std::string> split(string const& str, string const& sep) { using std::string; vector<string> ret; string::size_type last = 0; string::size_type i; while ((i = str.find(sep, last)) != string::npos) { ret.push_back(str.substr(last, i - last)); last = i + 1; } ret.push_back(str.substr(last)); return ret; } int main(int argc, char* argv[]) { string file = "c:\\file.ini"; //Befehl string cmd = "hl"; char Buffer[200], BufferSize[200]; GetPrivateProfileSection( "alias", Buffer, 200, file.c_str() ); char* Key = Buffer; string skey; while( *Key ) { skey += Key; skey += '\0'; cout << "skey: " << skey << endl; Key += strlen( Key ) + 1; vector<string> token = split(skey,"="); string alias; for(int i = 0; i < token.size(); i = i+2)//Gerade Werte { alias = token[i]; cout << "ALIAS: " << alias << endl; //Vergleiche Befehl mit Aliase //wenn gleich dann weiterverarbeiten if(cmd == alias) { cout << "ALIAS gefunden!!! -> " << alias << endl; } } //Löscht Inhalt von skey skey.clear(); } system("pause"); return 0; }Wenn ich jetzt in der for schleife bin erhalte ich den Alias welchen ich jedes mal mit dem eingegenem Befehl vergleiche hier cmd:
if(cmd == alias)doch das klappt nicht, liegt es daran das man kein vector und string vergleichen kann?
-
Eventuell solltest du mal das Programm durch den Debugger laufen lassen (oder dir zumindest ansehen, was in deinem vector drinsteht). Du fasst alle Einträge der Sektion zu einem String zusammen, den du dann an den '=' auftrennst - d.h. du hast letztendlich die Einträge "ps","blah\0tk","test\0hl",... in deinem vector.
(außerdem solltest du deine Alias-Liste besser nur einmal einlesen und dann vorrätig halten)
Versuch's mal besser so:
map<string,string> aliases; while( *Key ) { string sKey = Key; size_t pos=sKey.find('='); string name = sKey.substr(0,pos),value=sKey.substr(pos+1); aliases[name]=value; //oder: //aliases.insert(make_pair(name,value)); Key += strlen( Key ) + 1; } map<string,string>::iterator cmd_pos = aliases.find(cmd); if(cmd_pos != aliases.end() cout<<"Alias gefunden:"<<cmd<<"="<<cmd_pos->second<<endl;
-
Wenn ich deine Funktion ausführe wird nix angezeigt obwohl in der ini Datei hl definiert ist. An welcher Stelle wird Befehl und Alias verglichen?
-
kernel64 schrieb:
Wenn ich deine Funktion ausführe wird nix angezeigt obwohl in der ini Datei hl definiert ist.
Das könnte daran liegen, daß ich in der Schleife keine Debug-ausgaben eingebaut habe (erschien mir unnötig - wenn du unbedingt willst, kannst du es noch nachholen).
An welcher Stelle wird Befehl und Alias verglichen?
Mit der find-Abfrage in Zeile 15 wird überprüft, ob das aktuelle Kommando in der Alias-Liste drin steht (und dort wurden in der Schleife alle Einträge der Sektion "[Alias]" reingepackt.
-
ICH BLÖDDDMAN, ich habe da so viele Aliase das ich die übersicht verloren habe, und der fehler war das hl nicht drin stand.
Vielen Dank
