使用应用程序的 Windows API commctrl.h 在没有 Platform SDK 的机器上不起作用

Posted

技术标签:

【中文标题】使用应用程序的 Windows API commctrl.h 在没有 Platform SDK 的机器上不起作用【英文标题】:Windows API commctrl.h using application doesn't work on machines without the Platform SDK 【发布时间】:2008-09-30 21:33:06 【问题描述】:

我写了一些使用以下内容的东西:

#include <math.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <commctrl.h>

此代码在 2 台安装了 Platform SDK 的机器上运行良好,但不能在全新安装的 Windows(当然是 VM)上运行(无论是调试版还是发布版)。它以非常熟悉的方式死去:

---------------------------
C:\Documents and Settings\Someone\Desktop\DesktopRearranger.exe
---------------------------
C:\Documents and Settings\Someone\Desktop\DesktopRearranger.exe

This application has failed to start because the application configuration is incorrect. Reinstalling the application may fix this problem.

---------------------------
OK   
---------------------------

如何让它在全新安装时运行?它使用的是哪个 dll 却找不到?我的赌注是 commctrl,但有人能告诉我为什么不是每个窗口都这样吗?

此外,如果有人对如何调试这样的东西有提示,因为我的 CPP 已经生锈了,看起来 :)

编辑 - 对我有用的是下载 Visual Studio 2008 的 Redistributable。我认为这不是一个好的解决方案 - 下载 2MB 文件并安装以运行简单的 11K 工具。我想我会更改代码以使用 LoadLibrary 从 comctl32.dll 获取我需要的 2 或 3 个函数。谢谢大家:)

【问题讨论】:

【参考方案1】:

使用 Dependency Walker。从http://www.dependencywalker.com/ 下载并安装(只需解压缩即可安装)。然后加载您的可执行文件。该工具将突出显示缺少哪个 DLL。然后你可以找到你需要随可执行文件一起发布的可再发行包。

如果您使用 VS2005,http://www.microsoft.com/downloads/details.aspx?FamilyId=32BC1BEE-A3F9-4C13-9C99-220B62A191EE&displaylang=en 将涵盖大多数情况,其中包括运行使用 VS2005 创建的 EXE 所需的一切。不过,使用depends.exe 您可能会找到一个更轻量级的解决方案。

【讨论】:

谢谢,我不仅学到了一个很酷的新工具(Dependency Walker),可再发行包也有帮助(虽然我使用的是 VS2008,链接是:microsoft.com/downloads/…)。【参考方案2】:

通用控件是一条红鲱鱼。您的问题是未安装 Visual C++ 8.0 运行时(我假设您使用的是 Visual Studio 2005)。要么静态链接到 C/C++ 运行时库,要么分发运行时 DLL。

使用 DLL 的任何 C 或 C++ 程序都会遇到此问题。你可以在 VS 6.0 中摆脱它,因为 msvcrt.dll 随 Windows 2000 及更高版本的操作系统一起提供,而在 VS.NET 2003 中,msvcr71.dll 随 .NET Framework 1.1 一起提供。不再。 Visual Studio 2005 及更高版本使用并行程序集来防止 DLL Hell,但这意味着您甚至不能依赖 .NET 2.0 安装程序内置清单使用的 C 运行时的确切版本。 .NET 2.0 的 mscorwks.dll 在其清单中绑定到版本 8.0.50608.0;从 VS2005 SP1 开始,VS 生成的应用程序绑定到 8.0.50727.762。我记得它在 VS2005 的原始(RTM)版本中使用了一些预发布版本,这意味着如果您使用合并模块,则必须部署发布者策略合并模块,以将绑定重定向到实际发布的版本C 运行时合并模块。

另请参阅 MSDN 上的 Redistributing Visual C++ Files。

【讨论】:

您应该突出显示:通用控件是一个红鲱鱼。问题中的问题不在于通用控件,而在于 C/C++ 运行时库【参考方案3】:

我怀疑它正在尝试查找未安装的通用控件版本。您可能需要一个清单文件来将通用控件的版本映射到您的目标操作系统。此外,您可能需要确保安装了与您链接的相同 VC 运行时。

Chris Jackson blog

编辑:稍微搜索一下,我已经确认(大部分)这是应归咎于您的 VC++ 运行时版本。您需要分发您构建的版本。为此,平台 SDK 通常包含一个合并模块,但通常也有一个 VCRedist.exe。尝试查看 Microsoft 的下载。

KB94885

【讨论】:

您的编辑是正确的,虽然我喜欢这篇博文,这提醒了我为什么我的 CPP 文件也有一个清单(我认为这只是 C# 的东西)。

以上是关于使用应用程序的 Windows API commctrl.h 在没有 Platform SDK 的机器上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Windows API一日一练 2 使用应用程序句柄

使用以下 Windows API 的示例应用程序

在VBA中使用Windows API

可用于 Windows 运行时应用的 Windows API 替代项

Windows API编程的作品目录

使用 windows api 读取应用程序的当前安装版本