Por que o processo de geração do windows, às vezes, dispara o erro STATUS_SXS_ASSEMBLY_NOT_FOUND?

Então, eu tenho um pequeno fragmento de código C em execução em uma caixa do Windows, que diz:

/* 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");

Eu escrevi alguns testes de unidade em torno deste onde o meu "comando" foi C: \ windows \ system32 \ ipconfig.exe e funciona, não há problema.

Tentei usá-lo para um lançador de aplicativos ... doo doo. Falha com o erro útil:

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

Ok ... pesquisando ao redor eu descobri que o código de erro é STATUS_SXS_ASSEMBLY_NOT_FOUND, e isso acontece quando eu tento iniciar notepad.exe também. Missing assemblies?

Por que isso está acontecendo?

Como posso contornar isso?

Eu sou apenasadivinhação aqui, mas eu suspeito que tem algo a ver com a necessidade de a variável PATH ser definida no _spawnve (), mas eu não sei o que deveria ser. Eu tentei passar no caminho, mas isso não parece ajudar. Executando 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

ie. Eu estou passando em argv [0] e um valor de caminho; não outras variáveis ​​ou argumentos env.

Alguma ideia?

-

Editar:

Portanto, parece que esse erro está ocorrendo porque o PATH não está configurado corretamente quando invoco o comando usando _spawnve ().

Isso é óbvio invocando _spawnv () ou _spawnvpe (), ambos parecem funcionar corretamente.

Contudo, isso realmente não me ajuda, porque eu preciso especificar um componente PATH adicional para o aplicativo quando ele for executado. Passar PATH = ... para _spawnvpe () causa o mesmo erro, e obviamente _spawnv não é usado porque não permite que você especifique o PATH.

Então, realmente, a resposta para esta pergunta é: Porque a variável PATH está errada.

... mas eu ainda não tenho ideia do quedevemos estar. Parece não haver exemplos de trabalho que eu possa encontrar em qualquer lugar. Aceito qualquer resposta que vincule a um exemplo de codificação usando _spawnve () ou _spawnvpe () e passando a variável PATH para ela (e funcionando).

Editar # 2:

Mesmo. Não, na verdade, isso não funciona. Aqui está umexemplo não funciona. Esqueça a vinculação a um exemplo que funcione; apenas modifique o meu exemplo e poste um diff que 1) passe no PATH e 2) seja executado sem erro.

Nb Quer ver isso funcionar? mude para _spawnv () ou torne o valor de env NULL e ele funcionará bem.

#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);
}

Saída:

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

questionAnswers(3)

yourAnswerToTheQuestion