Drive label & Environment sting

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

sinjin

Betreff: Drive label & Environment sting

BeitragDo, Jun 18, 2020 8:36
Antworten mit Zitat
Benutzer-Profile anzeigen
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
print

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

BeitragDi, Jun 30, 2020 23:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Jul 04, 2020 17:05
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jul 17, 2020 20:36
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group