#FEATURE by stefan
authorStefan Vogel <sv@exept.de>
Fri, 12 Aug 2016 17:27:03 +0200
changeset 20245 0ea9c9caba33
parent 20243 44d5a7ba8756
child 20246 dacb56e06db1
#FEATURE by stefan class: Win32OperatingSystem added: #expandEnvironmentStrings: #primExpandEnvironmentStringsA:into:size: #primExpandEnvironmentStringsW:into:size:
Win32OperatingSystem.st
--- a/Win32OperatingSystem.st	Thu Aug 11 19:00:34 2016 +0200
+++ b/Win32OperatingSystem.st	Fri Aug 12 17:27:03 2016 +0200
@@ -8053,6 +8053,37 @@
     "Modified: / 23-08-2011 / 21:14:45 / jv"
 !
 
+expandEnvironmentStrings:aString
+    "expand the environmentStrings (e.g. %ProgramFiles%) in aString"
+
+    |count resultString resultCount|
+
+    count := aString size + 128.
+    [
+        aString isWideString ifTrue:[
+            resultString := Unicode16String new:count.
+            resultCount := self primExpandEnvironmentStringsW:aString into:resultString size:count.
+        ] ifFalse:[
+            resultString := String new:count.
+            resultCount := self primExpandEnvironmentStringsA:aString into:resultString size:count.
+        ].
+        resultCount <= count ifTrue:[
+            true
+        ] ifFalse:[
+            "resultString was too small. resultCount is the required buffer size"
+            count := resultCount.
+            false
+        ].
+    ] whileFalse.
+    ^ resultString copyTo:resultCount-1.
+
+
+    "
+        self expandEnvironmentStrings:'%ProgramFiles%\test\x'
+        self expandEnvironmentStrings:'%ProgramFiles%\test\x' asUnicode16String
+    "
+!
+
 getDomainName
     "return the DNS domain this host is in.
      Notice:
@@ -10333,6 +10364,26 @@
     ^ OSProcessStatus
 
     "Created: / 12.6.1998 / 16:30:43 / cg"
+!
+
+primExpandEnvironmentStringsA:inString into:outString size:outBuffer
+
+    <apicall: ulongReturn "ExpandEnvironmentStringsA" (pointer pointer ulong) module: "kernel32.dll" >
+    ^self primitiveFailed
+
+    "
+        self primExpandEnvironmentStringsA:'%ProgramFiles%\test\x' into:(String new:256) inspect size:256
+    "
+!
+
+primExpandEnvironmentStringsW:inString into:outString size:outBuffer
+
+    <apicall: ulongReturn "ExpandEnvironmentStringsW" (pointer pointer ulong) module: "kernel32.dll" >
+    ^self primitiveFailed
+
+    "
+        self primExpandEnvironmentStringsW:'%ProgramFiles%\test\x' asUnicodeString into:(Unicode16String new:256) inspect size:256
+    "
 ! !
 
 !Win32OperatingSystem class methodsFor:'regional settings'!