gpt4 book ai didi

delphi - 有什么方法可以阻止 Delphi 应用程序在 Vista/Win 7 上使用虚拟存储而不启用运行时主题?

转载 作者:行者123 更新时间:2023-12-03 15:21:38 25 4
gpt4 key购买 nike

这个问题几乎说明了一切。

我的应用程序包含较旧的组件,如果启用运行时主题,该应用程序将无法正常工作。但如果我不启用它们,应用程序最终总是会弄乱虚拟商店。

谢谢!

更新:

使用下面 Mark 的解决方案,应用程序不再写入虚拟存储。但是,现在它不会访问它需要的 tdb 文件(小型数据库文件)。该 tdb 文件与写入虚拟存储的文件相同。关于如何让它访问 tdb 文件并仍然阻止写入虚拟存储有什么想法吗?

最佳答案

您需要将 list (资源)添加到您的 exe 中。

list 中是一个 XML 资源,其内容类似于以下内容。 TrustInfo是导致VirtualStore无法使用的关键部分。

此示例引用了 Microsoft.Windows.Common-Controls 程序集,该程序集启用运行时主题。如果您从 list 中删除它,您仍然可以保留 TrustInfo 部分。

Vista 使用 TrustInfo 来确定应用程序“了解”UAC 限制,并且不会为该应用程序使用 VirtualStore

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
type="win32"
name="Delphi 7"
version="7.1.0.0"
processorArchitecture="*"/>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
publicKeyToken="6595b64144ccf1df"
language="*"
processorArchitecture="*"/>
</dependentAssembly>
</dependency>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="asInvoker"
uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>

以下页面详细介绍了如何创建和使用 list 文件:
http://ruminatedrumblings.blogspot.com/2008/03/vista-uac-manifest.html

以及有关应用程序 list 架构的 Microsoft 页面:
http://msdn.microsoft.com/en-us/library/bb756929.aspx

当然,一旦执行此操作,您将无法再在打开 UAC 的情况下将数据写入 c:\program files\或其他 protected 位置。这就是微软最初创建虚拟商店的原因。它的目的是让旧的应用程序保持运行,这些应用程序预计能够写入这些(现在 protected )位置。

您有几种不同的选择:

1:更改文件位置

将 tdb 文件移动到其他位置。这是理想的情况,但可能需要最多的代码更改。请参阅问题“Correct way to design around Windows UAC Limitations”以获取一些建议。 Microsoft 建议将用户未命名的数据存储在“Application Data”文件夹下。我尝试过此操作,但它使用户很难找到数据并将其移动到另一台计算机。即使用户没有专门保存文件,我也已将所有用户数据移至“我的文档”文件夹。这样,当他们获得新计算机时,他们只需移动“我的文档”(大多数人都会这样做),并且我的所有应用程序数据也将移动。

2:更改文件的权限以允许标准用户读/写该文件。您的安装程序可以执行此操作,或者您可以在事后更新它,但您需要以管理员身份运行才能进行更改。

3:强制您的应用程序以管理员身份运行。如果您按照 Sertac 的说明将执行级别设置为“requireAdministrator”,您将能够写入文件,但您的用户每次运行您的应用程序时都会收到 UAC 提升提示。

另请注意,如果您要升级正在运行并将数据保存到虚拟存储的用户,则不会自动将该数据移动到新位置。将 list 添加到应用程序后,它将开始查看实际位于 c:\program files* 下的文件。您可能需要在虚拟存储中查找文件并将它们复制到用户的新位置。下面是一个例子。就我而言,许​​可证文件存储在安装目录下。升级应用程序后,我需要查找旧的许可证文件并将它们移动到新位置:

procedure TResetMain.CopyVirtFiles();
var
VirtLicDir: string;
NewLicDir: string;
FileOp: TSHFileOp;

TempPath : array[0..MAX_PATH] of Char;
begin


SHGetFolderPath(Application.Handle, CSIDL_LOCAL_APPDATA, 0, 0, TempPath);
VirtLicDir := TempPath + '\VirtualStore\Program Files\My Company\Licenses';

NewLicDir := GetMyConfigDir();
if NewLicDir <> '' then
begin
NewLicDir := IncludeTrailingPathDelimiter(NewLicDir) + 'User Licenses';
end;

// If the Virtual license directory exists but not the new directory we
// know this is the first time the updated application has been run
// and we need to move the files to the correct location.
if DirectoryExists(VirtLicDir) and Not DirectoryExists(NewLicDir) then
begin
ForceDirectories(NewLicDir);

FileOp := TSHFileOp.Create(nil);

FileOp.FileList.Add(VirtLicDir + '\*.*');
FileOp.Destination := NewLicDir;

FileOp.Action := faMove;
FileOp.SHOptions := [ofFilesOnly, ofNoConfirmation, ofNoConfirmMKDir, ofRenameOnCollision, ofSilent];
FileOp.Execute;

FreeAndNil(FileOp);
end;

end;

关于delphi - 有什么方法可以阻止 Delphi 应用程序在 Vista/Win 7 上使用虚拟存储而不启用运行时主题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2822702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com