2048 byte long ASCII block an eine EXE Datei hängen

Anfängerfragen zum Programmieren mit PureBasic.
funk.munich
Beiträge: 123
Registriert: 27.03.2006 09:45

Beitrag von funk.munich »

Hi Thomas,

es klappt jetzt :D Vielen Dank.

:: Datei, die den Block anzeigen soll, z.B. readString.{pb, exe}

Code: Alles auswählen

fname$ = "readString.exe"
fsize.l = FileSize(fname$)

If ReadFile(0,fname$) 
  FileSeek(fsize - 4)
  byte = ReadLong()
  FileSeek(fsize - 4 - byte)
  msg.s = ReadString()
  MessageRequester("", Left(msg, Len(msg) - Len(Str(byte)) + 1))
  CloseFile(0)
EndIf
:: Datei, die den String in die Exe schreiben soll, z.B. writeString.{pb, exe}

Code: Alles auswählen

fname$ = "readString.exe"
string$ = "Hallo Welt!"
fsize.l = FileSize(fname$)

If OpenFile(0, fname$) 
  FileSeek(fsize) 
  WriteString(string$)
  WriteLong(Len(string$))
  CloseFile(0) 
EndIf
Jetzt hätte ich nur noch eine Frage, wie ich platformunabhängig
den eigenen Dateinamen einlesen kann.
Hättest Du hierzu auch noch eine Idee?

Unter windows kann ich ja mit dem Api Call:

GetModuleFileName_(GetModuleHandle_(0), @sApp, 256)

den Dateinamen auslesen.

Gibt es für Linux/Mac auch so ein Call?

Vielen Dank für die Hilfe,
Daniel
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Umsteigen auf PB 4 und "Ergebnis$ = ProgramFilename()"

FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
funk.munich
Beiträge: 123
Registriert: 27.03.2006 09:45

Beitrag von funk.munich »

Hi,

ich möchte jedoch für dieses Projekt PB3.9 nehmen, da es diese Version
für Win, Linux + Mac gibt. PB4 gibt es ja zur Zeit für Win und Linux ist ja in der Beta Phase.

Also wäre super, wenn jemand mir hierzu weiterhelfen könnte, auch wenn ich es mit PB3.9 mache :wink:

Gruß,
Daniel
funk.munich
Beiträge: 123
Registriert: 27.03.2006 09:45

Beitrag von funk.munich »

Hi zusammen,

habe für meine Frage eine Lösung gefunden:

Windows:

Code: Alles auswählen

Procedure.s GetExeName() 

  sApp.s=Space(256) 
  GetModuleFileName_(GetModuleHandle_(0), @sApp, 256) 
  
  ProcedureReturn sApp 
  
EndProcedure 
Linux:

Code: Alles auswählen

Procedure.s GetExeName() 

  lngBuffer = AllocateMemory(2048 + 1) 
  lngLen = Readlink_("/proc/" + Str(getpid_()) + "/exe", lngBuffer, 2048) 
  strOut = GetFilePart(PeekS(lngBuffer, lngLen)) 
  
  ProcedureReturn strOut
  
EndProcedure 
Gruß,
Daniel

(Für PB 3.9)
Antworten