Jump to content

IsRunningAsUwp() detection for AutoIt Apps published via the Windows Bridge to UWP as MSIX/APPX for the Windows Store - (Moved)


Recommended Posts

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: 

#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

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

Link to comment
Share on other sites

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

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 by matthewjs
update
Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...