[英]How to move a textbox with mouse click in Universal Windows Platform (UWP) app
[英]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.