0

我刚刚使用 C++ 中的 Visual Studio 2010 IDE 在 D2D1 应用程序上完成了我的应用程序开发工作。我正在探索从中创建包的不同方法,并使用了内置的 Visual Studio 安装程序/设置。安装项目顺利编译并创建了安装文件。我还能够根据我的要求成功安装应用程序。但是,当我将它安装在默认位置(这将是我的首选位置 - C:\Program Files(x86))时,应用程序拒绝启动。这是我到目前为止能够进行的调试:

  1. 安装在 C:\Program Files(x86) 中:应用程序无法正常启动。
  2. 安装在 C:\Program Files(x86) 中:应用程序在“以管理员身份运行”时启动
  3. 安装在 %ProgramFiles% 或 %ProgramFiles(x86)% 以外的位置:应用程序正常启动,无需“以管理员身份运行”。

我已经尝试过解决错误案例,但到目前为止还没有任何决定性或令人信服的东西,这就是我在这里寻求专家帮助的原因。我进一步做了什么:

  1. 使用 Dependency Walker x86 版本通过探查器确定 dll 调用的位置/内容。它没有为我提供任何具体的东西——depends.exe 认为我的应用程序具有延迟加载依赖模块 GPSVC.dll 和 IESHIMS.dll,我相当确定我不需要这些。分析器还指示 CRT 0xC0000417 错误 - 但我很难说它是否相关。

  2. 我确实为我的视觉风格定义了一个清单作为编译指示。删除它没有帮助。

  3. 如果这有帮助-链接器设置中的我的 C++ 项目清单文件选项如下所示:

    • 生成清单 - 是
    • 允许隔离 - 是
    • 启用 UAC - 是
    • UAC 执行级别 - 作为调用者
    • UAC 绕过 UI 保护 - 否
  4. 按照 MSDN 文档的建议,我已将所有 CRT 功能转换为安全版本 (sprintf -> sprintf_s)。这甚至在这里相关吗?

  5. 我试过简单地将 .exe 复制到 %ProgramFiles(x86)%。它没有帮助 - 所以看来我的安装程序不是造成问题的人。

  6. 我在代码中的几个地方使用 _dupenv_s 来检索 %COMSPEC% 、 %TEMP% 等。

非常感谢任何有关我如何进一步进行调试的指针。我确实阅读了有关此内容的信息,一些专家建议不正确的字符串处理或大的或无效的目录名称;但我认为这与我的情况无关,因为该问题是在 %ProgramFiles(x86)% 下正常启动应用程序所特有的。

其他详细信息:* 操作系统 Windows 7 - 64 位,带有最新 SP 的 Vista - 32 位 * Visual Studio Professional 2010,带有 .Net 客户端配置文件目标 Visual Studio 安装程序的 C++ 项目;目标平台 32 位 * 应用程序性质 - 基于 Direct2D

如果我没有使用正确的技术术语,请原谅我。我是应用程序部署的新手。

4

1 回答 1

1

That is correct Viswanathan, you cannot write to Program Files/Program Files(x86) if you are not running from an elevated process.

If your application needs to write custom settings in a file when it is launched you should create a dedicated folder for it under CommonAppDataFolder

于 2012-05-04T08:44:46.423 回答