维克斯。
我为AutoCAD插件编写了安装程序。它在开始 - >中创建菜单所有程序 - >等:
此外,我的安装程序会创建一组%AppData%
子文件夹,并将一些可配置文件和DLL
复制到其中。当我的插件加载到AutoCAD中时,这些文件将被我们使用。即当我的插件加载到AutoCAD 时,这些文件将存在。
现在我切换到其他Windows用户个人资料。我看到了我的菜单,但我在%AppData%
中看不到我的数据。如果我通过程序菜单的某个快捷方式打开我的文档或许可文件,那么我的数据会立即显示在%AppData%
文件夹中。好。 请注意,只有当我直接使用快捷方式而不是目标文件时才会发生这种情况。
好的,但是有可能用户在没有打开我的文档或许可证文件之前加载我的插件...在这种情况下,我的插件工作所需的数据仍将缺席...我有一个希望当AutoCAD加载我的插件时,当我使用程序菜单时,它的数据会出现在%AppData%
中,就像这样。但我错了,在这种情况下我的数据没有出现在%AppData%
。
因此,当用户在Windows中登录时,或者在AutoCAD加载我的插件之前,我需要我的数据显示在%AppData%
中。
或者也许我的插件代码可以通过C#强制Windows操作系统安装尚未安装在%AppData%
的组件?
UPD
每个用户必须在%AppData%
目录中拥有单独的文件集,因为这些文件我插件的用户界面的自定义设置。每个用户都有个性化需求。
我该如何解决?
答案 0 :(得分:2)
将文件放在CommonFilesFolder中。它们是共享二进制文件,供系统上的所有用户使用,看起来这些文件中没有特定于用户的内容。为什么它们位于用户的appdata文件夹中,因为它们看起来不像应用程序数据。那里有用户特定的数据吗?
您所看到的是Windows Installer行为 - 快捷方式使用检查组件是否已安装,并且该用户缺少这些文件,因此它将安装它们(为此它将需要原始MSI文件存在)。此机制适用于快捷方式,使用MSI的类表注册的COM组件以及ProgIds,在加载插件时,这些组件似乎都不会被调用。
要在不使用标准Windows Installer entypoints时强制调用此机制,请在加载插件后立即调用Win32(或等效的)API MsiProvideComponent(),然后才需要访问特定用户数据文件,用于每个缺少的组件。如果您将共享Dll放在一些公共文件文件夹(而不是每个用户文件夹)中,那么您将进行两次调用,每个数据文件一个(建议每个组件使用一个文件),其中每个文件是其包含的KeyPath零件。
https://msdn.microsoft.com/en-us/library/windows/desktop/aa370356(v=vs.85).aspx
它需要这些文件的ProductCode,ComponentCode和(内部)功能名称。使用默认模式参数,如文档所述,"提供组件并执行提供组件所需的任何安装。"这是使用快捷方式的原因。