El uso de la aplicación commctrl.h de la API de Windows no funciona en máquinas sin Platform SDK

StackOverflow https://stackoverflow.com/questions/155191

  •  03-07-2019
  •  | 
  •  

Pregunta

He escrito algo que usa lo siguiente:

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

Este código funciona bien en 2 máquinas con Platform SDK instalado, pero no se ejecuta (ni las versiones de depuración ni de lanzamiento) en instalaciones limpias de Windows (VM, por supuesto). Muere con lo bastante familiar:

---------------------------
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   
---------------------------

¿Cómo puedo hacer que se ejecute en instalaciones limpias? ¿Qué dll está usando que no puede encontrar? Mi apuesta está en commctrl, pero ¿puede alguien aclararme por qué no está en todas las ventanas?

Más aún, si alguien tiene consejos sobre cómo depurar tal cosa, ya que mi CPP ya está oxidado, como parece :)

Editar: lo que funcionó para mí es descargar Redistributable para Visual Studio 2008. No creo que sea una buena solución: descargar un archivo de 2 MB y una instalación para ejecutar una herramienta simple de 11K. Creo que cambiaré el código para usar LoadLibrary para obtener las 2 o 3 funciones que necesito de comctl32.dll. Gracias a todos :)

¿Fue útil?

Solución

Usa Walker de dependencia. Descargue e instale desde http://www.dependencywalker.com/ (simplemente descomprima para instalar). Luego carga tu ejecutable. La herramienta resaltará qué DLL falta. Luego puede encontrar el paquete redistribuible que necesita enviar con su ejecutable.

Si utiliza VS2005, la mayoría de los casos se cubrirán con http://www.microsoft.com/downloads/details.aspx?FamilyId=32BC1BEE-A3F9-4C13-9C99-220B62A191EE&displaylang=en que incluye todo lo necesario para ejecutar EXEs creados con VS2005 . Sin embargo, al usar depends.exe puede encontrar una solución más liviana.

Otros consejos

Los controles comunes son una pista falsa . Su problema es que el tiempo de ejecución de Visual C ++ 8.0 (supongo que está utilizando Visual Studio 2005) no está instalado. Puede enlazar estáticamente a la biblioteca de tiempo de ejecución de C / C ++ o distribuir la DLL de tiempo de ejecución.

Tendrá este problema con cualquier programa C o C ++ que use la DLL. Podría salirse con la suya en VS 6.0 ya que msvcrt.dll vino con el sistema operativo desde Windows 2000 en adelante, y en VS.NET 2003 como msvcr71.dll vino con .NET Marco 1.1. No más. Visual Studio 2005 y sus versiones posteriores usan ensamblajes en paralelo para evitar DLL Hell, pero eso significa que no puede depender incluso de que .NET 2.0 instale la versión exacta del tiempo de ejecución de C que utiliza el manifiesto incorporado en su programa. mscorwks.dll de .NET 2.0 se enlaza a la versión 8.0.50608.0 en su manifiesto; una aplicación generada por VS se une a 8.0.50727.762 a partir de VS2005 SP1. Mi recuerdo es que usó una versión de prelanzamiento en la versión original (RTM) de VS2005, lo que significaba que tenía que implementar un módulo de combinación de directiva de editor si estaba usando los módulos de combinación, para redirigir el enlace a la versión que se lanzó en realidad Módulo de combinación en tiempo de ejecución de C

Vea también Redistribución de archivos de Visual C ++ en MSDN.

Sospecho que está intentando encontrar una versión de controles comunes que no está instalada. Es posible que necesite un archivo de manifiesto para asignar la versión de los controles comunes a su sistema operativo de destino. Además, es posible que deba asegurarse de haber instalado los mismos tiempos de ejecución de VC a los que estaba vinculado.

blog de Chris Jackson

EDIT: un poco de búsqueda y he confirmado (en su mayoría) que es la versión de tus tiempos de ejecución de VC ++ la que tiene la culpa. Necesitas distribuir las versiones que construiste con. La plataforma SDK generalmente incluye un módulo de combinación de estos para ese propósito, pero a menudo también hay un VCRedist.exe para ellos. Intenta buscar las descargas de Microsoft.

KB94885

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top