繁体   English   中英

如何在Delphi中检测通用Windows平台(UWP)

[英]How to detect Universal Windows Platform (UWP) in Delphi

要将用Delphi编写的应用程序添加到Windows应用商店,我必须禁用内部更新机制。 例如,通过商店政策10.2.5禁止“检查更新”等内容

所以,我在DesktopBridgeHelpers项目代码中找到了C#帮助函数IsRunningAsUwp() 我的计划是将该帮助器转换为Delphi代码,但是packageFullName字符串在这里总是为空,即使我通过DesktopBridge转换的项目运行应用程序:

[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
static extern int GetCurrentPackageFullName(ref int packageFullNameLength, StringBuilder packageFullName);

public bool IsRunningAsUwp()
{
    if (IsWindows7OrLower)
    {
        return false;
    }
    else
    {
        int length = 0;
        StringBuilder sb = new StringBuilder(0);
        int result = GetCurrentPackageFullName(ref length, sb);
        sb = new StringBuilder(length);
        result = GetCurrentPackageFullName(ref length, sb);

        return result != APPMODEL_ERROR_NO_PACKAGE;
    }
}

我当前(不工作)的Delphi转换如下所示:

function GetCurrentPackageFullName(out Length: DWORD; out fullName: String): DWORD; stdcall; external kernel32 delayed;

function RunningAsUwp: Boolean;
const
  APPMODEL_ERROR_NO_PACKAGE = 15700;
var
  PackageName: String;
  PackageLen, PackageResult: DWORD;
begin
  if (Win32MajorVersion < 6) or ((Win32MajorVersion = 6) and (Win32MinorVersion <= 1)) then begin
    // Windows 7 or older
    Result := False;
  end else begin
    // Windows 10, but not necessarily a Store App
    PackageLen := 0;
    SetLength(PackageName, 1024);
    PackageResult := GetCurrentPackageFullName(PackageLen, PackageName);
    showmessage(PackageName); // <= always empty
    if PackageResult = APPMODEL_ERROR_NO_PACKAGE then begin
      Result := False;
    end else if not String(PackageName).IsEmpty then begin
      Result := True;
    end else begin
      Result := False;
    end;
  end;
end;

当通过已安装的appx包运行时,我没有得到任何其他错误,只是那个空的PackageName。

功能导入不正确。 它应该是

function GetCurrentPackageFullName(
    out Len: Cardinal; 
    Name: PWideChar
): Integer; stdcall; external kernel32 delayed;

然后称之为你这样做:

var
  Len: Cardinal;
  Name: string;
  ErrorCode: Integer;
....
Len := 0;
ErrorCode := GetCurrentPackageFullName(Len, nil);
if ErrorCode <> ERROR_INSUFFICIENT_BUFFER then
  RaiseLastOSError(ErrorCode);
SetLength(Name, Len-1);
ErrorCode := GetCurrentPackageFullName(Len, PChar(Name));
if ErrorCode <> ERROR_SUCCESS then
  RaiseLastOSError(ErrorCode);

您可能希望以不同方式处理错误,但我相信您可以解决它。

请注意,C#代码有一些我没有复制的错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM