#BUGFIX by stefan
authorStefan Vogel <sv@exept.de>
Mon, 31 Jul 2017 15:43:13 +0200
changeset 22131 bfd1058ffb7f
parent 22130 b7f01771716c
child 22132 f694f25e1989
#BUGFIX by stefan class: Win32OperatingSystem class added: #nameOfSTXExecutable #primNameOfSTXExecutable changed: #getBinaryType: -- fix for Unicode16String arg https://expeccoalm.exept.de/D207228 pathOfStxExecutable didn't work, if stx was executed and not stx.exe or stx.com
Win32OperatingSystem.st
--- a/Win32OperatingSystem.st	Mon Jul 31 15:40:09 2017 +0200
+++ b/Win32OperatingSystem.st	Mon Jul 31 15:43:13 2017 +0200
@@ -5592,56 +5592,69 @@
     DWORD binaryType;
 
     if (__isStringLike(aPathName)) {
-	ok = GetBinaryTypeA(__stringVal(aPathName), &binaryType);
+        ok = GetBinaryTypeA(__stringVal(aPathName), &binaryType);
     } else if (__isUnicode16String(aPathName)) {
-	ok = GetBinaryTypeW(__unicode16StringVal(aPathName), &binaryType);
+        /* Unicode strings are not 0-terminated */
+        wchar_t path[MAX_PATH+1];
+        int pathLen = __unicode16StringSize(aPathName);
+
+        if (pathLen > MAX_PATH) goto badArgument;
+
+        memcpy(path, __unicode16StringVal(aPathName), pathLen*2);
+        path[pathLen] = 0;
+        ok = GetBinaryTypeW(path, &binaryType);
     } else {
-	goto badArgument;
+        goto badArgument;
     }
 
     if (ok) {
-	OBJ typeSymbol = nil;
-
-	switch (binaryType) {
-	    case SCS_32BIT_BINARY:
-		// A 32bit Windows-based application
-		typeSymbol = @symbol(BINARY_32BIT);
-		break;
-	    case SCS_64BIT_BINARY:
-		// A 64bit Windows-based application.
-		typeSymbol = @symbol(BINARY_64BIT);
-		break;
-	    case SCS_DOS_BINARY:
-		// An MSDOS based application
-		typeSymbol = @symbol(BINARY_DOS);
-		break;
-	    case SCS_OS216_BINARY:
-		// A 16bit OS/2-based application
-		typeSymbol = @symbol(BINARY_OS2_16BIT);
-		break;
-	    case SCS_PIF_BINARY:
-		// A PIF file that executes an MS-DOS – based application
-		typeSymbol = @symbol(BINARY_PIF);
-		break;
-	    case SCS_POSIX_BINARY:
-		// A POSIX based application
-		typeSymbol = @symbol(BINARY_POSIX);
-		break;
-	    case SCS_WOW_BINARY:
-		// A 16-bit Windows-based application
-		typeSymbol = @symbol(BINARY_WOW16);
-		break;
-	    default:
-		typeSymbol = @symbol(other);
-		break;
-	}
-	RETURN (typeSymbol);
+        OBJ typeSymbol = nil;
+
+        switch (binaryType) {
+            case SCS_32BIT_BINARY:
+                // A 32bit Windows-based application
+                typeSymbol = @symbol(BINARY_32BIT);
+                break;
+            case SCS_64BIT_BINARY:
+                // A 64bit Windows-based application.
+                typeSymbol = @symbol(BINARY_64BIT);
+                break;
+            case SCS_DOS_BINARY:
+                // An MSDOS based application
+                typeSymbol = @symbol(BINARY_DOS);
+                break;
+            case SCS_OS216_BINARY:
+                // A 16bit OS/2-based application
+                typeSymbol = @symbol(BINARY_OS2_16BIT);
+                break;
+            case SCS_PIF_BINARY:
+                // A PIF file that executes an MS-DOS – based application
+                typeSymbol = @symbol(BINARY_PIF);
+                break;
+            case SCS_POSIX_BINARY:
+                // A POSIX based application
+                typeSymbol = @symbol(BINARY_POSIX);
+                break;
+            case SCS_WOW_BINARY:
+                // A 16-bit Windows-based application
+                typeSymbol = @symbol(BINARY_WOW16);
+                break;
+            default:
+                typeSymbol = @symbol(other);
+                break;
+        }
+        RETURN (typeSymbol);
     }
     RETURN (nil);
 
 badArgument: ;
 %}.
     self primitiveFailed
+
+
+    "
+      self getBinaryType:'stx.com'
+    "
 !
 
 getCurrentDirectory
@@ -6351,6 +6364,18 @@
     "
 !
 
+nameOfSTXExecutable
+    "return the name of the running ST/X executable program.
+     Usually, 'stx.exe or stx.com' is returned -
+     but may be different for standAlone apps (or winstx.exe)."
+
+    ^ self primNameOfSTXExecutable asSingleByteStringIfPossible
+
+    "
+     OperatingSystem nameOfSTXExecutable
+    "
+!
+
 parentDirectoryName
     "return the name used to refer to parent directories.
      In MSDOS, Unix and other systems this is '..', but maybe different
@@ -6485,6 +6510,26 @@
     ^ nil
 !
 
+primNameOfSTXExecutable
+    "return the name of the running ST/X executable program.
+     Usually, 'stx' is returned -
+     but may be different for standAlone apps (or winstx.exe)."
+
+%{
+    wchar_t name[MAX_PATH];
+    int len;
+
+    len = GetModuleFileNameW(0, name, MAX_PATH);
+    if (len <= 0) {
+        RETURN(nil);
+    }
+    RETURN(__MKU16STRING_MAXLEN(name, len));
+%}
+    "
+     OperatingSystem primNameOfSTXExecutable
+    "
+!
+
 primPathNameOf:aPathName
     "return the pathName of the argument, aPathString,
      - thats the full pathname of the directory, starting at 'X:\'.