matthewjs Posted July 2, 2022 Share Posted July 2, 2022 I am looking to code IsRunningAsUwp() detection for AutoIt Apps published via the Windows Bridge to UWP borrowing from code here in C#: DesktopBridgeHelpers/Helpers.cs at master · qmatteoq/DesktopBridgeHelpers · GitHub More info also here: GetCurrentPackageFullName function (appmodel.h) - Win32 apps | Microsoft Docs The P/Invoke equivalent looks to be a pain in AutoIt and I am sure that DllStructCreate|GetData|GetPtr etc are required so if anyone one else finds this of interest and useful to them they are most welcome to contribute: I hacked a workaround as IsRunningAsUwp() (I think its only the "\VFS\" that matches!) whereas IsRunningAsUwpToDo() is to be fixed and coded up properly using DLLStruct functions as I mentioned and I figure that there will be a Guru around here with this stuff as I have also heard that the AutoIt Devs are planning a move to UWP and the below is going to be pretty fundamental (at least until then although similar will likely wind up in the libraries eventually anyways..). OutputDebugString() is here: #Include-once Func OutputDebugString($lpOutputString) DllCall("kernel32.dll", "NONE", "OutputDebugString", "STR", $lpOutputString) EndFunc The script to be fixed is here: expandcollapse popup#Include <OutputDebugString.au3> Const $APPMODEL_ERROR_NO_PACKAGE = 15700 Const $ERROR_INSUFFICIENT_BUFFER = 122 Func IsRunningAsUwp() If IsWindows7OrLower Then Return False EndIf Return StringinStr(@ScriptDir, "\WindowsApps\") > 0 Or StringInStr(@ScriptDir, "\VFS\") > 0 EndFunc Func IsRunningAsUwpToDo() If IsWindows7OrLower Then Return False EndIf Local $packageFullNameLength = 0; Local $packageFullName[$packageFullNameLength]; Local $result = DllCall("kernel32.dll", "LONG", "GetCurrentPackageFullName", "UINT32*", $packageFullNameLength, "PWSTR", $packageFullName) OutputDebugString("$result=" & String($result)) OutputDebugString("packageFullNameLength=" & String($packageFullNameLength)) OutputDebugString("packageFullName=" & String($packageFullName)) Local $packageFullName[$packageFullNameLength]; Local $result = DllCall("kernel32.dll", "LONG", "GetCurrentPackageFullName", "UINT32*", $packageFullNameLength, "PWSTR", $packageFullName) OutputDebugString("$result=" & String($result)) OutputDebugString("packageFullNameLength=" & String($packageFullNameLength)) OutputDebugString("packageFullName=" & String($packageFullName)) Return $result <> $APPMODEL_ERROR_NO_PACKAGE And $packageFullNameLength > 0 EndFunc Func IsWindows7OrLower() Local $objWMIService = ObjGet("winmgmts:\\localhost\root\CIMV2") Local $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_OperatingSystem", "WQL", 0x30) If IsObj($colItems) Then For $objItem In $colItems Local $version = $objItem.Version OutputDebugString("Win32_OperatingSystem.Version=" & $version) Return Number($version) <= 6.1 Next Else Msgbox(0, "", "No WMI Object for Version found in WMI Class Win32_OperatingSystem") Exit(-1) Endif Return False EndFunc Kindest Regards, Matthew Link to comment Share on other sites More sharing options...
Developers Jos Posted July 2, 2022 Developers Share Posted July 2, 2022 Moved to the appropriate forum. Moderation Team SciTE4AutoIt3 Full installer Download page - Beta files Read before posting How to post scriptsource Forum etiquette Forum Rules Live for the present, Dream of the future, Learn from the past. Link to comment Share on other sites More sharing options...
Danyfirex Posted July 2, 2022 Share Posted July 2, 2022 You should read AutoIt's dllcall reference doc. I think this may work: Local $aCall = DllCall("kernel32.dll", "LONG", "GetCurrentPackageFullName", "uint*", 0, "wstr", Null) Local $iRequiredSize = $aCall[1] Local $tPackageName=DllStructCreate("wchar Data[" & $iRequiredSize & "]") Local $aCall = DllCall("kernel32.dll", "LONG", "GetCurrentPackageFullName", "uint", $iRequiredSize, "ptr", DllStructGetPtr($tPackageName)) Local $sPackageName=$tPackageName.Data ;or maybe Local $aCall = DllCall("kernel32.dll", "LONG", "GetCurrentPackageFullName", "uint", 1024, "wstr*", Null) Local $sPackageName=$aCall[1] Saludos Danysys.com AutoIt... UDFs: VirusTotal API 2.0 UDF - libZPlay UDF - Apps: Guitar Tab Tester - VirusTotal Hash Checker Examples: Text-to-Speech ISpVoice Interface - Get installed applications - Enable/Disable Network connection PrintHookProc - WINTRUST - Mute Microphone Level - Get Connected NetWorks - Create NetWork Connection ShortCut Link to comment Share on other sites More sharing options...
matthewjs Posted July 3, 2022 Author Share Posted July 3, 2022 Not quite: Syntax/Runtime Errors on: Local $iRequiredSize = $aCall[1] Local $iRequiredSize = $aCall^ ERROR Fixed the Error on: Local $sPackageName = $tPackageName.Data Local $sPackageName = $tPackageName^ ERROR With: Local $sPackageName = DllStructGetData($tPackageName, "Data") Link to comment Share on other sites More sharing options...
Danyfirex Posted July 3, 2022 Share Posted July 3, 2022 and? Danysys.com AutoIt... UDFs: VirusTotal API 2.0 UDF - libZPlay UDF - Apps: Guitar Tab Tester - VirusTotal Hash Checker Examples: Text-to-Speech ISpVoice Interface - Get installed applications - Enable/Disable Network connection PrintHookProc - WINTRUST - Mute Microphone Level - Get Connected NetWorks - Create NetWork Connection ShortCut Link to comment Share on other sites More sharing options...
matthewjs Posted July 4, 2022 Author Share Posted July 4, 2022 (edited) Perhaps the return value itself is a DllStruct? Pretty sure I tried it without the subscript to no avail but I will look again. Its a bugger because I have to update and redeploy the app each time by hand to test. And another reason for reaching out.. Decided I am going to use a UWP Launcher (as I need UWP AutoStart: Grrr!) but even that is a pain as you cannot pass regular command line arguments to the Win32 AutoIt App so would still like the internal routine and for security as well. Amazing how complicated .NET and Windows et al Frameworks are becoming.. Ah maybe I could compile and call a small exe built from the original C# from the command line (that exit code or stdout string I can get!) and be done with (Auto)it but without having to port the rest of the App for which it is just fine (no systray in UWP eeither 2nd Grrr!). This is like cryptic VB syntax to me anyways and is very painful in comparison to C#.. Although my earlier hack works OK its just a hack and I am compelled to fix it. Another option: the original C# as a DLL with the simple integer return code of 0 or 1: that'll do it as well as I can get that DllCall working. I am thinking that Autoit like VB is a language just written to maximize forum questions and answers and the usage of same haha! If AutoIt was so brilliant and easy (like C# P/Invokes) then someone would have answered me back with a fully working answer wouldn't they HAHA! 😉 Nah: I am already Run-ing and ShellExecute-ing several other exes from my AutoIt systray app and which really do all of the work so I can call another one.. IsRunningAsUwp.exe in C# is a cleaner hack! Edited July 4, 2022 by matthewjs update Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now