Drive label & Environment sting
Übersicht BlitzMax, BlitzMax NG Allgemein
sinjinBetreff: Drive label & Environment sting |
Do, Jun 18, 2020 8:36 Antworten mit Zitat |
|
---|---|---|
Ich habe zwei Funktionen geschrieben, die eine liest die Festplattendaten aus (Laufwerksnamen, Seriennummer, etc.) und die andere gibt alle Umgebungsvariablen zurück. Ich kann leider nicht so gut C also für Verbesserungen bin ich offen. Gerne würde ich GetEnvironmentStrings und FreeEnvironmentStrings in einer Funktion haben...
Code: [AUSKLAPPEN] 'env.bmx SuperStrict framework pub.win32 import brl.retro Import "env.c" local e$[]=getenvstr(false) for local a%=0 until e.length print e[a] next local serial%,label$,sysname$,flags% if getdriveinfo("c:\",label,serial,sysname,flags) then print "VolumeLabel:"+label local h$=hex(serial) print "Serial:"+h[..4]+"-"+h[4..] print "FileSystem:"+sysname for local a%=0 until 32 local f%=flags&(1 shl a) if f then print "Flag:0x"+hex(f) next else print "some error" endif input '-------------------------------------- Private Extern "C" Function getenvstr_@ptr() Function closeenvstr_(env@ptr) EndExtern Function EatFileNames:String[]( p:Byte Ptr) Local s:Byte Ptr = p Local count:Int = 0 While s[0] <> 0 If s[1] = 0 Then count :+ 1 s :+ 2 If s[0] = 0 Then Exit EndIf s :+ 1 Wend If count <= 0 Then Return Null Local result:String[] = New String[count] s = p For Local i:Int = 0 Until count result[i] = String.FromCString( s) s :+ result[i].Length + 1 Next Return result EndFunction Public Function getenvstr$[](prgenv%=false) local env@ptr=getenvstr_() local ret$[]=eatfilenames(env) closeenvstr_ env if prgenv then return ret local a% while (a<ret.length) if (ret[a][0]<>asc"=") then exit a:+1 wend return ret[a..] endfunction '---------------------------- private extern "Win32" function GetVolumeInformationA%(path$z,name@ptr,namesize%,serial@ptr,complen@ptr,sysflags@ptr,sysname@ptr,sysnamesz%)="GetVolumeInformationA@32" endextern public function getdriveinfo%(drive$,label$ var,serial% var,sysname$ var,flags% var) const namelen%=max_path const sysnamelen%=max_path local pname@ptr=memalloc(namelen) local pserial@ptr=memalloc(4) local psysflags@ptr=memalloc(4) local psysname@ptr=memalloc(sysnamelen) if not GetVolumeInformationA(drive,pname,namelen,pserial,null,psysflags,psysname,sysnamelen) then return false label=string.fromcstring(pname) serial=int ptr(pserial)[0] sysname=string.fromcstring(psysname) flags=int ptr(psysflags)[0] memfree psysname memfree psysflags memfree pserial memfree pname return true endfunction Code: [AUSKLAPPEN] //env.c #include <brl.mod/blitz.mod/blitz.h> int getenvstr_(){ // int @env // int @env2 // env=GetEnvironmentStrings() // strcpy(*env2,env); //memcpy // FreeEnvironmentStrings(env); // return env2 return GetEnvironmentStrings(); } closeenvstr_(int env){ FreeEnvironmentStrings(env); } |
||
Thunder |
Di, Jun 30, 2020 23:43 Antworten mit Zitat |
|
---|---|---|
Warum verwendest du nicht getenv_ aus pub.stdc?
Habe auch versucht deinen Code zu verstehen, aber keine Ahnung wo GetEnvironmentStrings und FreeEnvironmentStrings herkommen... |
||
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit |
sinjin |
Sa, Jul 04, 2020 17:05 Antworten mit Zitat |
|
---|---|---|
Sind das nicht C-Befehle? Wenn du so willst, wo kommen die anderen C Befehle her? Ist das nicht alles in MinGW? Ausserdem wollte ich eine Funktion schreiben die genau andersrum als GetEnv funktioniert. Wenn ich einen Pfad habe soll meine Funktion den Pfad, oder Teile davon in Umgebungsvariablen umwandeln. Das hat den Sinn, das wenn ich eine Datei in c:\users\me\appdata\roaming\test.txt auf mein Programm schiebe (um Daten zur Lagerung zu speichern), dann soll er den ersten Teil in %appdata% ändern, oder halt den ersten längsten Pfad in den Umgebungsvariablen. Wenn man dann mal Windows neu installiert, braucht man später nur einen Knopf drücken und die Daten sind wieder da.
Wenn ich frage: Wo sind all die C oder andere Dinge in Assembler, dann bekomme ich meistens die Antwort, das wird DIREKT übersetzt, aber das geht ja nicht, iwo...im Code halt, steht, das der Compiler aus a=a+1 oder in C a++ glaube ich. Also direkt übersetzt wird das logischerweise nicht, warum dann eine Hochsprache überhaupt? Man könnte es so machen 'add eax,1' oder 'inc eax'...steht ja nirgens. |
||
Thunder |
Fr, Jul 17, 2020 20:36 Antworten mit Zitat |
|
---|---|---|
Die Idee finde ich auch gut! Ich denke nur dass du dieses getenvstr_ gar nicht bräuchtest und mit getenv_ aus pub.stdc arbeiten könntest.
pub.stdc bietet dir einige Standard C-Funktionen für die Verwendung in BlitzMax. |
||
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit |
Übersicht BlitzMax, BlitzMax NG Allgemein
Powered by phpBB © 2001 - 2006, phpBB Group