¿Por qué el proceso de generación de Windows a veces desencadena el error STATUS_SXS_ASSEMBLY_NOT_FOUND?

Por lo tanto, tengo un pequeño fragmento de código C que se ejecuta en un cuadro de Windows, que dice:

/* invoke command */
impl->procHandle = _spawnve(_P_NOWAIT, command, vargs, env);
if (impl->procHandle == -1) {
  printf("Failed to invoke command: %s\n", strerror(errno));
  impl->busy = false;
}
printf("VICTORY\n");

Escribí algunas pruebas de unidad en torno a esto donde mi "comando" era C: \ windows \ system32 \ ipconfig.exe y funciona, no hay problema.

Intenté usarlo para un lanzador de aplicaciones ... doo doo. Falló con el error útil:

The application failed to initialize properly (0xc0150004). 
Click on OK to terminate the application.

Ok ... buscando alrededor, descubrí que el código de error es STATUS_SXS_ASSEMBLY_NOT_FOUND, y sucede cuando intento iniciar notepad.exe también. Faltan asambleas?

¿Por qué está pasando esto?

¿Cómo puedo solucionarlo?

Sólo soyadivinación aquí, pero sospecho que tiene algo que ver con la necesidad de establecer la variable PATH en _spawnve (), pero no sé qué debería ser. Intenté pasar por el camino, pero eso no parece ayudar. Ejecutando este código:

int offset = 0;
while (vargs[offset] != NULL) {
  printf("vargs %d: %s\n", offset, vargs[offset]);
  ++offset;
}
offset = 0;
while (env[offset] != NULL) {
  printf("env %d: %s\n", offset, env[offset]);
  ++offset;
}

Yeilds:

vargs 0: C:\windows\system32\notepad.exe
env 0: PATH=c:\WINDOWS\system32

es decir. Estoy pasando en argv [0], y un valor de ruta; No otras variables env o argumentos.

¿Algunas ideas?

-

Editar:

Por lo tanto, parece que este error se está produciendo porque la PATH no está configurada correctamente cuando invoco el comando usando _spawnve ().

Esto se hace obvio invocando _spawnv () o _spawnvpe (), ambos parecen funcionar correctamente.

sin embargo, eso realmente no me ayuda, porque necesito especificar un componente PATH adicional para la aplicación cuando se ejecute. Al pasar PATH = ... a _spawnvpe () se produce el mismo error y, obviamente, _spawnv no se usa porque no le permite especificar la PATH.

Entonces, realmente, la respuesta a esta pregunta es: porque la variable PATH es incorrecta.

... pero aun no tengo idea de quedebería ser. Parece que no hay ejemplos prácticos de esto que pueda encontrar en cualquier lugar. Aceptaré cualquier respuesta que enlaza con un ejemplo de codificación usando _spawnve () o _spawnvpe () y pasando la variable PATH (y funcionando).

Edición # 2:

De Verdad. No, en realidad, esto no funciona. Aquí hay unejemplo De eso no funciona. Olvídate de enlazar a un ejemplo que funcione; simplemente modifique mi ejemplo y publique una diferencia que 1) pasa en PATH y 2) se ejecuta sin error.

Nótese bien. ¿Quieres verlo funcionar? cambie a _spawnv () o haga que el valor env sea NULL y se ejecute bien.

#include <stdio.h>
#include <windows.h>
#include <process.h>
#include <errno.h>

int main(int argc, char *argv[]) {

  char *path_value;
  char buffer[4000];
  const char *env[2];
  const char *args[1];
  char *command;
  int result;
  intptr_t procHandle;

  path_value = getenv("PATH");
  sprintf(buffer, "PATH=%s", path_value);
  env[0] = buffer;
  env[1] = NULL;

  args[0] = NULL;

  int offset = 0;
  while (env[offset] != NULL) {
    printf("env %d: %s\n", offset, env[offset]);
    ++offset;
  }

  offset = 0;
  while (args[offset] != NULL) {
    printf("arg %d: %s\n", offset, args[offset]);
    ++offset;
  }

  command = "C:\\windows\\system32\\notepad.exe";

  procHandle = _spawnvpe(_P_NOWAIT, command, args, NULL);
  if (procHandle == -1) {
    printf("Failed to invoke command: %s\n", strerror(errno));
    exit(1);
  }

  _cwait(&result, procHandle, 0);
  if (result != 0)
    printf("Command exited with error code %d\n", result);
}

Salida:

env 0: PATH=.;c:\Program Files\Common Files\Microsoft Shared\Windows Live;c:\WINDOWS\system32;c:\WINDOWS;c:\WINDOWS\System32\Wbem;c:\Program Files\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\DTS\Binn\;c:\Program Files\CMake 2.8\bin;c:\Program Files\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\;c:\Program Files\Common Files\Microsoft Shared\Windows Live
Command exited with error code -1072365564

Respuestas a la pregunta(3)

Su respuesta a la pregunta