Projektpfad aus EXE ermitteln
Moderator: Moderatoren
- azzo
- Rekursionen-Architekt
- Beiträge: 483
- Registriert: So, 28. Mär 2010 19:21
- Danksagung erhalten: 11 Mal
Projektpfad aus EXE ermitteln
Hallo,
ich suche nach einer Möglichkeit, eine EXE Datei zu lesen und nach einem Wort zu suchen.
Memoread oder f_open funktioniert bei mir leider nicht.
Man kann eine EXE mit F3 vom TotalCommander aus aufmachen und dann nach:
INITSTATICS
suchen.
Man sieht dann, den Projektpfad.
LG
Otto
ich suche nach einer Möglichkeit, eine EXE Datei zu lesen und nach einem Wort zu suchen.
Memoread oder f_open funktioniert bei mir leider nicht.
Man kann eine EXE mit F3 vom TotalCommander aus aufmachen und dann nach:
INITSTATICS
suchen.
Man sieht dann, den Projektpfad.
LG
Otto
- HaPe
- 1000 working lines a day
- Beiträge: 996
- Registriert: So, 15. Nov 2015 17:44
- Wohnort: 71665 Vaihingen-Enz
- Hat sich bedankt: 17 Mal
- Danksagung erhalten: 15 Mal
Re: Projektpfad aus EXE ermitteln
Hallo Otto !
Was sagt FError()?
Welcher Rückgabe-Code bzw. Fehler-Code kommt denn?Memoread oder f_open funktioniert bei mir leider nicht.
Was sagt FError()?
Zuletzt geändert von HaPe am Fr, 23. Feb 2018 14:01, insgesamt 1-mal geändert.
--
Hans-Peter
Hans-Peter
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Projektpfad aus EXE ermitteln
FOpen() kann JE Datei öffnen, solange genug Rechte auf dem Verzeichnis vorhanden sind.
Du schreibst deine Funktion anders, also könnte es eine spezielle Version sein, die eventuell die Parameter anders setzt.
Du schreibst deine Funktion anders, also könnte es eine spezielle Version sein, die eventuell die Parameter anders setzt.
bei der Standardversion wird Read-Only und shared geöffnet, somit sollte das auch auf einem Laufwerk funktionieren, bei dem die EXE läuft und das Schreibschutz hat.FOpen( <cFilename>, [<nMode>]) --> nHandle
<nMode> ist ein ganzzahliger, numerischer Wert, der den Modus für den Dateizugriff spezifiziert. Der Standardwert ist 0, d.h. wenn <nMode> nicht angegeben ist, wird eine Datei im "Read-only" und "shared" Modus geöffnet. Für das Argument <nMode> sind in der Header-Datei "Fileio.ch" verschiedene symbolische Konstanten definiert, mit denen der Zugriffsmodus für eine Einzelplatz- oder eine Netzwerkanwendung spezifiziert werden kann.
Gruß
Hubert
Hubert
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: Projektpfad aus EXE ermitteln
Ich kann F_Open(), MemoRead() und FileStr() mit jeder beliebigen Datei veranstalten, wenn ich an sie rankomme. Das funktioniert auch bei EXEn, die über 100 MB groß sind.
Aber, mal ganz blöd gefragt: Was soll der "Projektpfad" sein, der irgendwo in der Nähe von "INITSTATICS" in der EXE steckt? Ich kann eine EXE ja in jedes beliebige Verzeichnis kopieren und dort starten, aber ihr Inhalt ändert sich dadurch nicht. Das wäre ja auch noch schöner. Ich finde allerdings bei DEBUG=yes Pfad und Name von PRG und OBJ (sonst nicht!), und bei direkt gelinktem Manifest alle darin enthaltenen Informationen. Anders gefragt: Wonach suchst Du?
Aber, mal ganz blöd gefragt: Was soll der "Projektpfad" sein, der irgendwo in der Nähe von "INITSTATICS" in der EXE steckt? Ich kann eine EXE ja in jedes beliebige Verzeichnis kopieren und dort starten, aber ihr Inhalt ändert sich dadurch nicht. Das wäre ja auch noch schöner. Ich finde allerdings bei DEBUG=yes Pfad und Name von PRG und OBJ (sonst nicht!), und bei direkt gelinktem Manifest alle darin enthaltenen Informationen. Anders gefragt: Wonach suchst Du?
Herzlich,
Tom
Tom
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Projektpfad aus EXE ermitteln
Ich habe dieses Programm mal in der Workbench laufen lassen ...
das ist das Ergebnis:
Code: Alles auswählen
#include "Common.ch"
PROCEDURE Main
LOCAL cExe, cBinBuffer, nError, cSuch
/* we use the ansi charset by default */
SET CHARSET TO ANSI
SET ALTERNATE TO test.txt
SET ALTERNATE ON
cSuch := "INIT" + "STATICS" // sonst wird es wegen diesem String gefunden
cExe := AppName(.T.)
?
? "Testprogramm: ",cExe
?
? "Versuche EXE zu öffenen ..."
cBinBuffer := file2Str(cExe,,,@nError)
? "Ergebnis nError=",nError," Eingelesene Bytes: ",len(cBinBuffer)
? "Ist '"+cSuch+"' EXE vorhanden ? "
IF cSuch $ upper(cBinBuffer)
? "JA, ab Byte", at(cSuch,cBinBuffer)
ELSE
? "NEIN"
END IF
SET ALTERNATE OFF
inkey(20)
/* $TODO: place your application code here */
RETURN
*---------------------------------------------------------------------------------------------
FUNCTION File2Str(cFile,nStartPos,nLen,nError) // memoread() könnte Umwandeln !!!
LOCAL nHandle, cBuffer, nReadBytes,nSeekPos // nError muss per Referenz übergeben werden
cBuffer := ""
nReadBytes := 0
DEFAULT nStartPos TO 1 // normalerweise will man ab dem 1. Zeichen.
DEFAULT nLen TO 0 // 0 steht für keine Begrenzung
IF nStartPos < 1
nStartPos := 1
ENDIF
nError := 0 // 0 steht für keinen Fehler
nHandle := FOpen(cFile)
IF nHandle = -1
nError := FError()
ELSE
IF nLen=0
nLen := FSize( nHandle )
ENDIF
IF nStartPos > 1
nSeekPos := FSeek( nHandle, nStartPos-1 )
IF nSeekPos <> nStartPos-1
nError := -2
ENDIF
ENDIF
cBuffer := space(nLen)
nReadBytes := FRead( nHandle, @cBuffer, nLen)
IF nReadBytes < nLen // eventuell kein Fehler, sondern nur weniger Daten verf³gbar.
nError := FError()
ENDIF
ENDIF
FClose(nHandle)
RETURN left(cBuffer,nReadBytes)
also, es geht ganz einfach mit fOpen() oder meiner damit erstellten Funktion, die EXE Längen sollten auch kein Problem darstellenTestprogramm: C:\Users\BRANDELH\Documents\Xbase++\Projects\test\Test.exe
Versuche EXE zu öffenen ...
Ergebnis nError= 0 Eingelesene Bytes: 16384
Ist 'INITSTATICS' EXE vorhanden ?
JA, ab Byte 10997
Gruß
Hubert
Hubert
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Projektpfad aus EXE ermitteln
OK, prüfen wir noch DEBUG=OFF ... EXE wird neu erstellt, direkt gestartet und ...
Was man dort finden soll weiß ich aber auch nicht ...
Es sind weniger Bytes, also wird was weg gelassen, aber die Sprungadresse auf INITSTATICS bleibt gleich.Testprogramm: C:\Users\BRANDELH\Documents\Xbase++\Projects\test\Test.exe
Versuche EXE zu ”ffenen ...
Ergebnis nError= 0 Eingelesene Bytes: 14848
Ist 'INITSTATICS' EXE vorhanden ?
JA, ab Byte 10997
Was man dort finden soll weiß ich aber auch nicht ...
Gruß
Hubert
Hubert
- azzo
- Rekursionen-Architekt
- Beiträge: 483
- Registriert: So, 28. Mär 2010 19:21
- Danksagung erhalten: 11 Mal
Re: Projektpfad aus EXE ermitteln
Hallo Hubert,
danke für deine Hilfe.
Ich habe deinen Code mit xHarbour kompiliert.
Ich musste nur SET CHARSET TO ANSI kommentieren und habe den Pfad zur gewünschten EXE fix eingegeben.
Hier erhalte ich keinen Treffer.
Könntest du mir bitte zum Testen eine EXE mit xBase geben. Vielleicht kannst du meinen Pfad eingeben.
Mit bestem Dank im Voraus,
Otto
Testprogramm: c:\xwinhotel\xZahlung.exe
Versuche EXE zu öffenen ...
Ergebnis nError= 0 Eingelesene Bytes: 2075
Ist 'INITSTATICS' EXE vorhanden ?
NEIN
danke für deine Hilfe.
Ich habe deinen Code mit xHarbour kompiliert.
Ich musste nur SET CHARSET TO ANSI kommentieren und habe den Pfad zur gewünschten EXE fix eingegeben.
Hier erhalte ich keinen Treffer.
Könntest du mir bitte zum Testen eine EXE mit xBase geben. Vielleicht kannst du meinen Pfad eingeben.
Mit bestem Dank im Voraus,
Otto
Code: Alles auswählen
LOCAL cExe, cBinBuffer, nError, cSuch
/* we use the ansi charset by default */
// SET CHARSET TO ANSI
SET ALTERNATE TO test.txt
SET ALTERNATE ON
cSuch := "INIT" + "STATICS" // sonst wird es wegen diesem String gefunden
cExe := "c:\xwinhotel\xZahlung.exe" //AppName(.T.)
Testprogramm: c:\xwinhotel\xZahlung.exe
Versuche EXE zu öffenen ...
Ergebnis nError= 0 Eingelesene Bytes: 2075
Ist 'INITSTATICS' EXE vorhanden ?
NEIN
- azzo
- Rekursionen-Architekt
- Beiträge: 483
- Registriert: So, 28. Mär 2010 19:21
- Danksagung erhalten: 11 Mal
Re: Projektpfad aus EXE ermitteln
Hallo Tom,
danke für deine Infos. Ich suche die prg-Datei , die die main Funktion der EXE enthält.
LG
Otto
danke für deine Infos. Ich suche die prg-Datei , die die main Funktion der EXE enthält.
LG
Otto
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Projektpfad aus EXE ermitteln
Frage : über welche Xbase++ Version redet ihr
ich habe das \SOURCE\samples\ Verzeichnis mit TC nach *.EXE und Text = "INITSTATICS" und "DEBUG" durchsucht und nichts gefunden
ich habe das \SOURCE\samples\ Verzeichnis mit TC nach *.EXE und Text = "INITSTATICS" und "DEBUG" durchsucht und nichts gefunden
gruss by OHR
Jimmy
Jimmy
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Projektpfad aus EXE ermitteln
Jimmy,
ich habe das mal mit 2 normalen EXE Dateien auspropiert und kann dir nur Zustimmen, warum mein anderes Beispiel etwas gefunden hat ... vermutlich den Suchbegriff selbst
ich habe das mal mit 2 normalen EXE Dateien auspropiert und kann dir nur Zustimmen, warum mein anderes Beispiel etwas gefunden hat ... vermutlich den Suchbegriff selbst
Gruß
Hubert
Hubert
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Projektpfad aus EXE ermitteln
So ich habe mein Programm angepasst, damit der String nicht aus dem Quellcode direkt in der EXE landet und siehe da ... den gibt es gar nicht
Ergebnis in test.txt:
Testprogramm: c:\xwinhotel\xZahlung.exe
Testprogramm: c:\xwinhotel\xZahlung.exe
Code: Alles auswählen
#include "Common.ch"
PROCEDURE Main
LOCAL cExe, cBinBuffer, nError, cSuch1, cSuch2, cSuch
/* we use the ansi charset by default */
// SET CHARSET TO ANSI
SET ALTERNATE TO test.txt
SET ALTERNATE ON
cSuch1 := "IniT" // sonst wird es wegen diesem String gefunden
cSuch2 := "STaTICS" // sonst wird es wegen diesem String gefunden
cSuch := upper(rtrim(ltrim(cSuch1)-ltrim(cSuch2)))
// cExe := AppName(.T.)
cExe := "c:\xwinhotel\xZahlung.exe" //AppName(.T.)
?
? "Testprogramm: ",cExe
?
? "Versuche EXE zu öffenen ..."
cBinBuffer := file2Str(cExe,,,@nError)
? "Ergebnis nError=",nError," Eingelesene Bytes: ",len(cBinBuffer)
? "Ist '"+cSuch+"' in EXE vorhanden ? "
IF cSuch1 $ upper(cBinBuffer)
? "JA, ab Byte", at(cSuch,cBinBuffer)
ELSE
? "NEIN"
END IF
SET ALTERNATE OFF
inkey(20)
/* $TODO: place your application code here */
RETURN
*---------------------------------------------------------------------------------------------
FUNCTION File2Str(cFile,nStartPos,nLen,nError) // memoread() könnte Umwandeln !!!
LOCAL nHandle, cBuffer, nReadBytes,nSeekPos // nError muss per Referenz übergeben werden
cBuffer := ""
nReadBytes := 0
DEFAULT nStartPos TO 1 // normalerweise will man ab dem 1. Zeichen.
DEFAULT nLen TO 0 // 0 steht für keine Begrenzung
IF nStartPos < 1
nStartPos := 1
ENDIF
nError := 0 // 0 steht für keinen Fehler
nHandle := FOpen(cFile)
IF nHandle = -1
nError := FError()
ELSE
IF nLen=0
nLen := FSize( nHandle )
ENDIF
IF nStartPos > 1
nSeekPos := FSeek( nHandle, nStartPos-1 )
IF nSeekPos <> nStartPos-1
nError := -2
ENDIF
ENDIF
cBuffer := space(nLen)
nReadBytes := FRead( nHandle, @cBuffer, nLen)
IF nReadBytes < nLen // eventuell kein Fehler, sondern nur weniger Daten verf³gbar.
nError := FError()
ENDIF
ENDIF
FClose(nHandle)
RETURN left(cBuffer,nReadBytes)
Testprogramm: c:\xwinhotel\xZahlung.exe
Diese Variable wird nicht von Xbase++ selbst gesetzt ... versuchen wir es noch mit DEBUG=YES ...Versuche EXE zu öffenen ...
Ergebnis nError= 0 Eingelesene Bytes: 10752
Ist 'INITSTATICS' in EXE vorhanden ?
NEIN
Testprogramm: c:\xwinhotel\xZahlung.exe
Wichtig an der Geschichte ist aber, dass fOpen() die EXE fehlerfrei öffnet (nError=0 bedeutet KEIN Fehler) und meine Funktion die Datei in einen String lädt.Versuche EXE zu öffenen ...
Ergebnis nError= 0 Eingelesene Bytes: 11776
Ist 'INITSTATICS' in EXE vorhanden ?
NEIN
Gruß
Hubert
Hubert
- azzo
- Rekursionen-Architekt
- Beiträge: 483
- Registriert: So, 28. Mär 2010 19:21
- Danksagung erhalten: 11 Mal
Re: Projektpfad aus EXE ermitteln
Hallo Hubert,
auch hier wird mit fOpen() die Datei geöffnet. Aber leider wird nach einigen Bytes dann der Lesevorgang abgebrochen.
LG
Otto
auch hier wird mit fOpen() die Datei geöffnet. Aber leider wird nach einigen Bytes dann der Lesevorgang abgebrochen.
LG
Otto
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2832
- Registriert: Fr, 08. Feb 2008 21:29
- Hat sich bedankt: 98 Mal
- Danksagung erhalten: 13 Mal
Re: Projektpfad aus EXE ermitteln
Hallo, Otto -
wie liest Du, verwendest Du fRead() oder fReadStr()?
fReadStr() hört auf, wenn ein Chr(0) gelesen wird, und das hört sich nach Deinem Problem an.
wie liest Du, verwendest Du fRead() oder fReadStr()?
fReadStr() hört auf, wenn ein Chr(0) gelesen wird, und das hört sich nach Deinem Problem an.
Liebe Grüsse aus der Eifel,
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
- azzo
- Rekursionen-Architekt
- Beiträge: 483
- Registriert: So, 28. Mär 2010 19:21
- Danksagung erhalten: 11 Mal
Re: Projektpfad aus EXE ermitteln
Hallo Georg,
danke für deine Hilfe und den Hinweis Chr(0).
Genau das war mein Problem.
Ich habe mir immer nur
cBuf := MEMOREAD( cExe )
angeschaut und anzeigen lassen.
Hier wird dann nach dem ersten CHR(0) einfach abgeschnitten.
Anbei die Funktion die bei mir nun funktioniert.
Die Funktion liefert den Pfad des prg Files - file in dem die main -Funktion enthalten ist - der EXE zurück.
Die Funktion dürfte 1:1 auch mit xBase funktionieren.
LG
Otto
danke für deine Hilfe und den Hinweis Chr(0).
Genau das war mein Problem.
Ich habe mir immer nur
cBuf := MEMOREAD( cExe )
angeschaut und anzeigen lassen.
Hier wird dann nach dem ersten CHR(0) einfach abgeschnitten.
Anbei die Funktion die bei mir nun funktioniert.
Die Funktion liefert den Pfad des prg Files - file in dem die main -Funktion enthalten ist - der EXE zurück.
Die Funktion dürfte 1:1 auch mit xBase funktionieren.
LG
Otto
Code: Alles auswählen
function PrjPath( cExe )
local cBuf, nAt
if Empty( cExe )
return nil
endif
cBuf := MEMOREAD( cExe )
cBuf := AfterAtNum( "(_INITSTATICS", cBuf, 1 )
cBuf := AfterAtNum( Chr( 0 ), cBuf, 1 )
cBuf := BeforAtNum( Chr( 0 ), cBuf, 1 )
return cBuf
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Projektpfad aus EXE ermitteln
Und wieder einmal zeigt es sich, dass es NICHT egal ist mit welchem Clipper Nachfolger man arbeitet !
1. EXE von Xbase++ oder auch PowerBasic enthalten kein Schlüsselwort INITSTATICS, das habe ich jetzt bei 5 EXE Dateien mit HEX-Editor überprüft.
2. MemoRead() aus Xbase++ liest eine BIN Datei (also auch jede EXE) komplett ein, egal ob chr(0) oder sonstwas drin enthalten ist; wobei ich nicht auf chr(26) getestet habe.
Hier die Ausgabe eines Abwandelten Xbase++ Test Programmes (einmal mit memoedit(), das zweite mal mit meiner file2str() Funktion):
Für C-Compiler Funktionen ist es normal bei chr(0) nicht mehr weiter zu lesen.
Alaska hat bei Xbase++ beide Verhaltensweisen ...
Memoread() liest alles, aber fReadStr() hört auch bei chr(0) auf.
Dennoch, Memoread() sollte laut Alaska nicht verwendet werden, da es eigentlich eine Text-Funktion ist, EXE Dateien etc. sind aber Binär-Daten.
1. EXE von Xbase++ oder auch PowerBasic enthalten kein Schlüsselwort INITSTATICS, das habe ich jetzt bei 5 EXE Dateien mit HEX-Editor überprüft.
2. MemoRead() aus Xbase++ liest eine BIN Datei (also auch jede EXE) komplett ein, egal ob chr(0) oder sonstwas drin enthalten ist; wobei ich nicht auf chr(26) getestet habe.
Hier die Ausgabe eines Abwandelten Xbase++ Test Programmes (einmal mit memoedit(), das zweite mal mit meiner file2str() Funktion):
(x)Harbour übersetzt ja RRG Code nach C-Code und ein C-Compiler übersetzt das dann.Versuche EXE zu öffenen, MemoEdit() ...
Ergebnis Eingelesene Bytes: 15360
Versuche EXE zu öffenen, File2Str() ...
Ergebnis nError= 0 Eingelesene Bytes: 15360
Ist 'IniTStaTICS' EXE vorhanden ?
NEIN
Für C-Compiler Funktionen ist es normal bei chr(0) nicht mehr weiter zu lesen.
Alaska hat bei Xbase++ beide Verhaltensweisen ...
Memoread() liest alles, aber fReadStr() hört auch bei chr(0) auf.
Dennoch, Memoread() sollte laut Alaska nicht verwendet werden, da es eigentlich eine Text-Funktion ist, EXE Dateien etc. sind aber Binär-Daten.
Gruß
Hubert
Hubert
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Projektpfad aus EXE ermitteln
Hallo Hubert
bist du dir mit Harbour sicher?
Meine Version die ich unter FreeBSD verwende übersetzt PRG's in Pseudo-Code und das Runtime-Modul arbeitet diese dann ab.
Gruss Carlo
bist du dir mit Harbour sicher?
Meine Version die ich unter FreeBSD verwende übersetzt PRG's in Pseudo-Code und das Runtime-Modul arbeitet diese dann ab.
Gruss Carlo
Valar Morghulis
Gruss Carlo
Gruss Carlo
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Projektpfad aus EXE ermitteln
Ich ging davon aus, dass das von AZZO beschriebene Verhalten von Memoedit() unter xHarbour beobachtet wurde.
Da könnte ich mich aber auch täuschen. Wie die Runtime das dann umsetzt weiß ich auch nicht, aber dass C-Funktionen normalerweise chr(0) als Ende des Strings interpretieren stimmt.
Wenn man das anders machen möchte, muss man die "Strings" als Array of Byte behandeln und dann geht das auch mit den chr(0) im Datenstrom, sonst wäre eine Verarbeitung von Binär-Daten ja nicht möglich.
Aber um es deutlich zu sagen, meine C-Kenntnisse beschränken sich auf das Lesen von Parameter Aufrufen für meine DLL Libs
Was ich eigentlich nur sagen wollte ist:
Wenn man wie in diesem Thread (zudem unter Allgemein !) ein (Fehl-)Verhalten schildert und eben NICHT Xbase++ nutzt, bitte dazu schreiben soll, dass es um XYZ Compiler geht.
Da könnte ich mich aber auch täuschen. Wie die Runtime das dann umsetzt weiß ich auch nicht, aber dass C-Funktionen normalerweise chr(0) als Ende des Strings interpretieren stimmt.
Wenn man das anders machen möchte, muss man die "Strings" als Array of Byte behandeln und dann geht das auch mit den chr(0) im Datenstrom, sonst wäre eine Verarbeitung von Binär-Daten ja nicht möglich.
Aber um es deutlich zu sagen, meine C-Kenntnisse beschränken sich auf das Lesen von Parameter Aufrufen für meine DLL Libs
Was ich eigentlich nur sagen wollte ist:
Wenn man wie in diesem Thread (zudem unter Allgemein !) ein (Fehl-)Verhalten schildert und eben NICHT Xbase++ nutzt, bitte dazu schreiben soll, dass es um XYZ Compiler geht.
Gruß
Hubert
Hubert
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Projektpfad aus EXE ermitteln
Hallo Otto
du könntest doch mit dem Texteditor eine "File Suche" in den prg's in deinen Verzeichnisen und Unterverzeichnisen suchen. z.B. nach " main" Multiedit liefert dir dann alle Dateien im gewählten Verzeichnisbaum die " main" enthalten.
Gruss Carlo
du könntest doch mit dem Texteditor eine "File Suche" in den prg's in deinen Verzeichnisen und Unterverzeichnisen suchen. z.B. nach " main" Multiedit liefert dir dann alle Dateien im gewählten Verzeichnisbaum die " main" enthalten.
Gruss Carlo
Valar Morghulis
Gruss Carlo
Gruss Carlo
- azzo
- Rekursionen-Architekt
- Beiträge: 483
- Registriert: So, 28. Mär 2010 19:21
- Danksagung erhalten: 11 Mal
Re: Projektpfad aus EXE ermitteln
Hallo Carlo,
ich habe schon weiter oben gepostet, dass ich dank eurer Hilfe das Problem lösen konnte.
Danke nochmals an alle.
LG
Otto
ich habe schon weiter oben gepostet, dass ich dank eurer Hilfe das Problem lösen konnte.
Danke nochmals an alle.
LG
Otto
Hallo Georg,
danke für deine Hilfe und den Hinweis Chr(0).
Genau das war mein Problem.
Ich habe mir immer nur
cBuf := MEMOREAD( cExe )
angeschaut und anzeigen lassen.
Hier wird dann nach dem ersten CHR(0) einfach abgeschnitten.
Anbei die Funktion die bei mir nun funktioniert.
Die Funktion liefert den Pfad des prg Files - file in dem die main -Funktion enthalten ist - der EXE zurück.
Die Funktion dürfte 1:1 auch mit xBase funktionieren.
LG
Otto
Code: Alles auswählen
function PrjPath( cExe )
local cBuf, nAt
if Empty( cExe )
return nil
endif
cBuf := MEMOREAD( cExe )
cBuf := AfterAtNum( "(_INITSTATICS", cBuf, 1 )
cBuf := AfterAtNum( Chr( 0 ), cBuf, 1 )
cBuf := BeforAtNum( Chr( 0 ), cBuf, 1 )
return cBuf