没有Platform SDK的机器上使用Windows API commctrl.h的应用程序将无法运行

时间:2020-03-06 14:56:58  来源:igfitidea点击:

我写的东西包括以下内容:

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

此代码在安装了Platform SDK的2台机器上都可以正常运行,但在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的可再发行组件。我认为下载2MB文件并安装运行简单的11K工具不是一个好的解决方案。我想我将更改代码以使用LoadLibrary从comctl32.dll获取我需要的2或者3个函数。谢谢大家 :)

解决方案

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

克里斯·Hyman逊(Chris Hymanson)博客

编辑:稍作搜索,我已经证实(大多数情况),这应该归咎于VC ++运行时的版本。我们需要分发构建时使用的版本。平台SDK通常为此目的包括一个合并模块,但是通常也有一个VCRedist.exe。尝试查看Microsoft的下载。

KB94885

使用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可能会发现更轻量的解决方案。

常见控件是红色鲱鱼。问题是我假设我们正在使用Visual Studio 2005的Visual C ++ 8.0运行时未安装。静态链接到C / C ++运行时库,或者分发运行时DLL。

使用DLL的任何C或者C ++程序都会出现此问题。我们可以在VS 6.0中摆脱它,因为Windows 2000及更高版本的OS附带了" msvcrt.dll",而.NET Framework 1.1中的msvcr71.dll则是在VS.NET 2003中。不再。 Visual Studio 2005和更高版本使用并行程序集来防止DLL地狱,但这意味着即使安装.NET 2.0程序的内置清单所使用的C运行时的确切版本,我们也不能依赖。 .NET 2.0的mscorwks.dll绑定到清单中的8.0.50608.0版本;从VS2005 SP1开始,VS生成的应用程序将绑定到8.0.50727.762. 我的回忆是,它在VS2005的原始(RTM)版本中使用了一些预发行版本,这意味着如果我们使用合并模块,则必须部署发布者策略合并模块,以将绑定重定向到实际在发行版中的版本C运行时合并模块。

另请参见在MSDN上重新分发Visual C ++文件。