#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
--- 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:\'.