我要维护一个VB6软件,它基本上从第二个程序导出数据并将它们导入到关于第三个程序的数据文件中。所以,这个导入/导出工具在Windows 95到XP的几年里运行得非常好,但是,现在,我必须更新它以支持Vista和Seven ......当时间写入第三个程序的文件时它会失败。这时,我刚刚在Windows 7下完成了测试,但我想在Vista下它会是一样的。
以下是详细问题:
当我的程序尝试访问第三个程序的数据进行写入时,我收到此错误:“运行时错误'75':路径/文件访问错误”。所以,这听起来像是一个UAC阻塞,因为我的程序试图获得写入他不拥有的数据文件的访问权限。然后,如果我使用管理员权限或XP兼容性运行我的程序,它可以工作:没有错误,第三个程序的数据文件被很好地修改。
此时我想知道如何解决这个错误(对于我的程序是致命的,因为它被阻止了它的主要工作:导出/导入数据)以编程方式:在安装期间(我正在使用Inno Setup)或在运行时
什么是正确的方法?以编程方式强制“XP兼容性”或提升我的程序以管理员权限启动?如何实现这个以及何时(在安装期间或运行时)?清单是否可以在此字段中更改某些内容(此时从未使用任何清单)?
此外,无论采用何种方式(XP兼容性或管理员权限),UAC都会在每次发布时警告用户系统更改:非常烦人:(
那么,如何让我的程序在Windows 7和Vista下顺利运行,就像在XP下一样,知道除了在第三方数据文件中写下之外别无选择(因为这是它的主要目的)? / p>
等待你点燃的回复......
PS:也(可能很重要),我的程序本身不知道数据文件的路径,但是用户使用通用对话框选择它。
如果我安装(在Windows 7下)我的程序以管理员身份登录,它安装没有任何问题,然后程序启动没有任何问题并完成其工作(读取和写入任何不属于我的程序的文件)毫无疑问。所以,在这种情况下完美!
尽管如此,如果我以简单用户身份登录,在使用管理员密码询问权限后安装得很好,那么程序启动没有任何问题,但是(这是剩下的问题)我再次陷入“路径/文件”当读取或写入外部文件(不属于我的程序)时,访问错误“(错误'75')。
所以,这是我的另外一个问题:如何解决这个错误被记录为简单用户?这是否意味着升级没有起作用(虽然它似乎在其他情况下适用于任何步骤:安装,启动,读/写)仅在这种特定情况下?我心里有点混淆......
编辑:嗯,我想我理解了一件事,但需要你的确认(或不需要)。我将调用我的程序B.B将读取/导入程序A拥有的数据,然后写入/导出到程序C拥有的数据。我的困惑是我重新安装了B作为简单用户登录,但是没有安装的程序A和C被记录为管理员。因此,当B有时间读取有关A的数据时,尽管有所提升,但它失败了,因为这些A的数据归管理员所有(即使这些A的数据不在用户特定路径中,但是,“C:\ email_data” “)。
如果我重新安装以简单用户身份登录的所有三个程序,它可以正常工作(没有警告也没有错误)。
所以,我重新提出我的问题:由于提升工作(应该允许程序获得管理员权限),为什么程序B(由用户安装)无法读取有关程序A(由管理员安装)的数据?我应该在Inno安装过程中添加一些东西,以便我的程序只安装为管理员(知道我对A和C程序的安装方式没有任何影响)?
答案 0 :(得分:0)
您可以使用外部清单文件(myapp.exe.manifest)或使用工具在exe和资源中包含manfiest。
有大量内容可供使用,只需谷歌即可。从here我抓起了样本清单:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
您需要将级别更改为“requireAdministrator”,这将在用户启动应用程序时提示用户(取决于他们的UAC设置)。
答案 1 :(得分:0)
启用UAC时,{7}目录在Windows 7下受到保护(您需要提升权限才能直接写入)
这是您遇到的问题。
为了传承&#39;程序更无缝地工作(即没有可见的错误)Windows 7使用folder redirection。这允许您的遗留应用程序读取和写入程序文件目录中的内容的副本。
如果您使用清单,这会告诉Windows您的应用程序是否具有UAC识别功能,因此不会发生文件夹重定向,但您需要具有提升(管理员)权限才能读取/写入程序文件。
有很多关于如何使用清单的例子。我个人的偏好是Manifest Creator。
如果您将%Program Files%
设置为requestedExecutionLevel
,那么它会读取和写入实际文件夹,但当您的应用运行时,系统会提示您提升UAC。
解决方案实际上是不读取和写入程序文件位置,而是使用其他位置。请查看this stack overflow question以获取解决方案。