Anyone have GetEnvironmentVariable working?
BlitzMax Forums/BlitzMax Programming/Anyone have GetEnvironmentVariable working?
| ||
I'm probably misreading the MSDN docs on this ( not for the first time ) but this doesn't work :Extern "Win32" Function GetEnvironmentVar:Int(Variable$z,Value$z,Length:Int) = "GetEnvironmentVariableA@12" End Extern Function GetEnvironmentVariable:String(EnvVarName:String) Local Ret:String Local L:Int=32767 If GetEnvironmentVar(EnvVarName,Ret,L)=0 Return "" Else Return Ret End If End Function More specifically, it crashes and the debugger shuts itself down, so there's no possible way to see what it did or where it got to. I'm pretty sure it exits the function after being called, but since it shuts down, something obviously went wrong. And it doesn't get the correct value anyway. EDIT: Correction, it does NOT exit the function. The debugger just writes something to the debuglog for no apparent reason before it crashes. Go figure. |
| ||
Here's the code I use (hat tip to Indie)Function GetEnvironmentVariableA(VarName:Byte Ptr,back:Byte Ptr,size:Short) Function GetEnvVar:String(VarName:String) Local TempBank:TBank = CreateBank(1) Local size:Int = GetEnvironmentVariableA(Varname,BankBuf(TempBank),1) If size > 0 ResizeBank(Tempbank,Size+1) GetEnvironmentVariableA(Varname,BankBuf(TempBank),Size+1) Else Return "" EndIf Local tString:String = "" Local t:Int For t = 0 To BankSize(tempbank)-3 tString = tString + Chr(PeekByte(tempbank,t)) Next ResizeBank(TempBank,0) FlushMem() Return tString End Function |
| ||
Ah yeah, I was just gonna go back and see if I could do it with a Bank. Thanks, Eikon. |
| ||
here's the code i use:Print getenv_("path") putenv_ "myvar=snot" Print getenv_("myvar") |
| ||
Are they using getenv from the standard C lib, Skid? Because Software Passport recommends not using that, as it does not always recognize changes made to the environment after the program is started |
| ||
Yes I think so. Interesting, from my experience that would be "never" instead of "not always". |
| ||
@Gabriel, The code that Eikon has posted is the stuff I've been using with software passport pro since GEOM. |
| ||
Strict Extern "Win32" Function GetEnvironmentVariable(lpName$z, lpBuffer:Byte Ptr, nSize) = "GetEnvironmentVariableA@12" End Extern Print GetEnv("HOMEPATH") End Function GetEnv$(envVar$) Local buff:Byte[256] Local rtnLen = GetEnvironmentVariable(envVar$, buff, buff.length) If rtnLen > (buff.length - 1) buff = buff[..rtnLen] rtnLen = GetEnvironmentVariable(envVar$, buff, buff.length) EndIf Return String.FromBytes(buff, rtnLen) End Function |