Waitforexit nenhum processo está associado a este objeto
O código a seguir faz com que um NullReferenceException.
Usando o depurador, vejo que Process. Start está retornando nulo. Então ... algum pensamento sobre por que isso está acontecendo? Eu realmente gostaria de bloquear a execução do programa até que o usuário conclua o processo iniciado.
ATUALIZAÇÃO: Refatorando o código para isso:
causa esta exceção:
InvalidOperationException: Nenhum processo está associado a este objeto.
No MSDN, o Process. Start retornará:
Um novo componente de processo que está associado com o recurso de processo ou referência nula (Nada no Visual Basic), se nenhum recurso de processo é iniciado (por exemplo, se um processo existente é reutilizado).
No seu caso, desde que você está passando uma URL para Process. Start em vez de um executável, você não está realmente iniciando um novo processo. Você está passando a URL para iexplore, ou seja qual for o seu navegador. E então você recebe um nulo de volta.
Em qualquer caso, o que significaria "bloquear a execução do programa até que o usuário conclua o processo iniciado"? Espere até que o usuário feche o navegador da web? Nesse caso, você pode querer algo como:
. que funciona adequadamente para mim. Ele exige que você especifique o executável do navegador, no entanto.
Waitforexit nenhum processo está associado a este objeto
Eu tenho um serviço do windows contendo este código:
A finalidade deste código é executar um extrato IFilter em um documento, usamos um processo separado porque alguns IFilters são notoriamente escamosos.
Agora este código roda perfeitamente nas caixas do Windows 7 e do Server 2008 R2, mas em um Windows Server 2003 o WaitForExit lança imediatamente uma exceção "Não há processo associado a este objeto de processo". O processo existe e conclui sua tarefa sem nenhum problema.
Alguém viu isso? Alguém pode lançar alguma luz sobre por que WaitForExit iria mostrar esse erro?
Se eu colocar este código em um aplicativo de console e executá-lo funciona bem na caixa do Windws Server 2003 também, portanto, parece ser um problema específico executando isso em um serviço em uma caixa do Windows Server 2003.
Ao iniciar processos, com a classe System. Diagnostics. Process, o sistema pode usar a função Win32 CreateProcess ou ShellExecuteEx. Ao usar o CreateProcess, somente arquivos executáveis podem ser iniciados. Ao usar ShellExecuteEx, qualquer arquivo que possa ser iniciado usando o comando "Iniciar-> Executar" a partir do shell.
No entanto, estas são formas completamente diferentes de iniciar processos. ShellExecuteEx envolve o shell e pode, por exemplo, reutilizar uma instância existente do Word ou do Excel para abrir um documento, usando as informações armazenadas sob o HKCR \ & lt; progid & gt; \ shell \ & lt; verb & gt; Chave do registro. Isso pode envolver, por exemplo, o uso de DDE para procurar e ativar uma instância existente do Excel.
Veja a documentação no SHELLEXECUTEINFO do ShellExecuteEx:
Observe que ShellExecuteEx pode ou não retornar um hProcess dependendo se um novo processo foi iniciado. Esse é o comportamento que você está vendo.
CreateProcess é uma função de nível inferior e cria um processo diretamente e simplesmente passa os argumentos equivalentes. Sempre retorna um identificador de processo.
Nota: Como você parece estar iniciando um arquivo executável, é um pouco surpreendente que nenhum hProcess seja retornado pelo ShellExecuteEx. No entanto, se você quiser garantir que você obtenha um identificador de processo, usar UseShellExecute = false é a coisa correta a ser feita.
Waitforexit nenhum processo está associado a este objeto
System. Diagnostics. Process SetupGUIProcess = new System. Diagnostics. Process ();
SetupGUIProcess. StartInfo = new System. Diagnostics. ProcessStartInfo (strStartMenuPath + & lt; \\ Programas \\ AXYZ International \\ A2MC Setup. appref-ms & quot;);
Quando o programa chega à linha WaitForExit, causa uma exceção & quot; Nenhum processo está associado a este objeto & quot ;. O processo começa ok. Eu estou tentando obter o segmento de chamada para bloquear até que o processo seja encerrado. Este é o caminho certo?
2. Aguarde até que o aplicativo termine a instalação usando o Process. WaitOne.
3. Inicie o executável como outro processo (// newlyinstalled exe).
4. WaitForProcess (); (processo do nome do executável //.
Marcado como Resposta Bin-ze Zhao segunda-feira, 5 de outubro de 2009 8:16.
Todas as respostas.
Eu sei com certeza que o processo ainda está em execução no momento em que WaitForExit é chamado. Eu percebo que estou iniciando o processo por meio de uma referência de clickonce. Eu tentei isso de todas as maneiras diferentes que você pode iniciar um processo e ocorre a mesma exceção. Se eu iniciar o processo apenas passando o caminho para start (). start retorna null. Existe outra maneira de iniciar um aplicativo que é instalado por um escudo de instalação clickonce outro que pela referência? Eu estaria interessado em ver se eu poderia ligar diretamente para o exe. Talvez então a função WaitForExit conheça o objeto de processo. Isso é intrigante. Obrigado pela resposta.
Os aplicativos ClickOnce são iniciados usando uma URL para o arquivo de manifesto de implantação (.application). Então você usa a sintaxe do parâmetro querystring web:
Eu não tenho um servidor. Eu só quero mandar pessoas com dois sheilds instalados. Eles os instalam. e um dos programas instalados pode chamar o outro como um processo e, em seguida, bloquear e aguardar até que seja feito. Ainda não está claro para mim o que eu tenho que fazer para que eu possa chamar o programa usando a sintaxe acima. eu preciso de um sever para fazer isso? Quando você diz parar de usar o ClickOnce. Você quer dizer parar de chamá-lo por sua referência ou você quer parar de usá-lo e usar algum outro método de pagamento? Eu acho que eu realmente não entendo o que o Click Once significa. O termo Clique uma vez apenas encapsula o significado de todos os escudos de instalação por meio da opção de publicação no Visual Studio? Eu espero que você veja com o que estou lutando. Tem que haver algo simples aqui que estou perdendo.
Eu tottally acordo com NoBugz (que muito provavelmente entende isso melhor do que eu). Então, vamos pensar sobre isso você e eu. Quando você visita uma URL, você não inicia um processo ao vivo. Você solicita ao servidor alguns dados e ele retorna alguns dados e, depois, sua vida útil. Não há estado persistente como um processo que você pode acessar. Você está tentando usar um aplicativo clickOnce que usa um URL, então é claro que não há processo por causa do que acabei de passar. Pare de usar o ClickOnce.
Crie um aplicativo instalável como este.
Chame assim.
Espere por isso assim.
Eu não concordo que as postagens estão se desviando da sua pergunta. Seu exemplo usa o ClickOnce, o único problema que você enfrenta é devido ao fato de estar usando o ClickOnce. É por isso que as pessoas dizem. "pare de usar o clickOnce". Talvez você não entenda o que é ClickOnce versus um executável? Este é um exemplo muito simples de exatamente o que você está tentando fazer, sem um clickonce.
Mais uma vez obrigado pela resposta.
1. O clique é uma referência de referência a um exe? Eu gostaria de ligar para o exe. Eu simplesmente não consigo encontrar em qualquer parte do sistema a sua instalação. Existe um caminho específico onde é colocado quando um clique de publicação é executado um escudo de instalação?
Mais uma vez obrigado pela resposta.
1. O clique é uma referência de referência a um exe? Eu gostaria de ligar para o exe. Eu simplesmente não consigo encontrar em qualquer parte do sistema a sua instalação. Existe um caminho específico onde é colocado quando um clique de publicação é executado um escudo de instalação?
Existe um problema lógico com suas perguntas.
Se você precisar instalar o pacote, você não tem o código-fonte (e é por isso que eu suponho que você continue tentando usar um clickonce), então você está basicamente morto na água com suas necessidades. Nenhuma fonte = falha épica.
Desculpe cara eu não entendi. Vamos passo a passo.
1. Vamos supor que você sabia onde o exe estava. Você lançou isso com um processo. Segundo o # 2 existem dependências, portanto o seu programa explode. Como você conserta isso? Você precisa instalar o programa antes de tentar executar o exe.
Vamos supor que eu não sei onde o exe é (porque eu não sei) porque não parece haver um após a instalação do clique uma vez instalar o escudo. Se existe outra forma de fazer um mecanismo de instalação para que eu tenha acesso a um exe. Você pode por favor fornecer o link para a documentação que mostra como fazer isso?
Eu tenho o arquivo de solução do programa original para visual studio desde que eu sou o autor. Se eu criei um pacote de instalador MSI e o eliminei como um arquivo MSI como você diz, poderei chamar o exe como processo? Onde será localizado? Você pode fornecer o link para a documentação sobre como criar o MSI se de fato ele instala um exe?
Se você precisar instalar o pacote, você não tem o código fonte (e é por isso que eu suponho que você continue tentando usar um clickonce), então você está basicamente morto na água com suas necessidades. Nenhuma fonte = falha épica.
Processo . Método WaitForExit ()
A documentação de referência da API. NET tem uma nova página. Visite o Navegador da API. NET em docs. microsoft para ver a nova experiência.
Instrui o componente Processo a aguardar indefinidamente que o processo associado seja encerrado.
Assembly: System (no System. dll)
A configuração de espera não pôde ser acessada.
Nenhuma identificação de processo foi definida e uma Handle da qual a propriedade Id pode ser determinada não existe.
Não há processo associado a este objeto Process.
Você está tentando chamar WaitForExit () para um processo que está sendo executado em um computador remoto. Este método está disponível apenas para processos em execução no computador local.
WaitForExit () faz com que o segmento atual espere até que o processo associado termine. Deve ser chamado depois que todos os outros métodos forem chamados no processo. Para evitar o bloqueio do segmento atual, use o evento Exited.
Este método instrui o componente Process a aguardar uma quantidade infinita de tempo para que os manipuladores de processo e evento saiam. Isso pode fazer com que um aplicativo pare de responder. Por exemplo, se você chamar CloseMainWindow para um processo que tenha uma interface com o usuário, a solicitação para o sistema operacional encerrar o processo associado pode não ser tratada se o processo for gravado para nunca inserir seu loop de mensagem.
No. NET Framework 3.5 e versões anteriores, a sobrecarga WaitForExit () aguardou milissegundos MaxValue (aproximadamente 24 dias), não indefinidamente. Além disso, as versões anteriores não esperavam que os manipuladores de eventos saíssem se o tempo máximo de MaxValue fosse atingido.
Essa sobrecarga assegura que todo o processamento tenha sido concluído, incluindo o tratamento de eventos assíncronos para saída padrão redirecionada. Você deve usar essa sobrecarga após uma chamada para a sobrecarga WaitForExit (Int32) quando a saída padrão tiver sido redirecionada para manipuladores de eventos assíncronos.
Quando um processo associado é encerrado (ou seja, quando é encerrado pelo sistema operacional por meio de uma finalização normal ou anormal), o sistema armazena informações administrativas sobre o processo e retorna ao componente que chamou WaitForExit (). O componente de processo pode acessar as informações, que inclui o ExitTime, usando o identificador para o processo de saída.
Como o processo associado foi encerrado, a propriedade Handle do componente não aponta mais para um recurso de processo existente. Em vez disso, o identificador pode ser usado apenas para acessar as informações do sistema operacional sobre o recurso do processo. O sistema está ciente de identificadores para processos que não foram liberados pelos componentes do processo, portanto, ele mantém as informações de ExitTime e identificador na memória até que o componente de processo especificamente libera os recursos. Por esse motivo, sempre que você chamar a instância Start for Process, chame Close quando o processo associado tiver terminado e você não precisar mais de nenhuma informação administrativa sobre ele. Close libera a memória alocada para o processo finalizado.
Waitforexit nenhum processo está associado a este objeto
Menina: (olhando) "Por que você precisa de um pepino gelado?"
“Quero denunciar uma fraude. O governo está mentindo para todos nós.
Menina: (olhando) "Por que você precisa de um pepino gelado?"
“Quero denunciar uma fraude. O governo está mentindo para todos nós.
Menina: (olhando) "Por que você precisa de um pepino gelado?"
“Quero denunciar uma fraude. O governo está mentindo para todos nós.
Thanx antecipadamente.
Eu fiz isso de acordo com o número de itens selecionados no ActiveExplorer.
Eu tenho um serviço do windows contendo este código:
A finalidade deste código é executar um extrato IFilter em um documento, usamos um processo separado porque alguns IFilters são notoriamente escamosos.
Agora este código roda perfeitamente nas caixas do Windows 7 e do Server 2008 R2, mas em um Windows Server 2003 o WaitForExit lança imediatamente uma exceção "Não há processo associado a este objeto de processo". O processo existe e conclui sua tarefa sem nenhum problema.
Alguém viu isso? Alguém pode lançar alguma luz sobre por que WaitForExit iria mostrar esse erro?
Se eu colocar este código em um aplicativo de console e executá-lo funciona bem na caixa do Windws Server 2003 também, portanto, parece ser um problema específico executando isso em um serviço em uma caixa do Windows Server 2003.
Ao iniciar processos, com a classe System. Diagnostics. Process, o sistema pode usar a função Win32 CreateProcess ou ShellExecuteEx. Ao usar o CreateProcess, somente arquivos executáveis podem ser iniciados. Ao usar ShellExecuteEx, qualquer arquivo que possa ser iniciado usando o comando "Iniciar-> Executar" a partir do shell.
No entanto, estas são formas completamente diferentes de iniciar processos. ShellExecuteEx envolve o shell e pode, por exemplo, reutilizar uma instância existente do Word ou do Excel para abrir um documento, usando as informações armazenadas sob o HKCR \ & lt; progid & gt; \ shell \ & lt; verb & gt; Chave do registro. Isso pode envolver, por exemplo, o uso de DDE para procurar e ativar uma instância existente do Excel.
Veja a documentação no SHELLEXECUTEINFO do ShellExecuteEx:
Observe que ShellExecuteEx pode ou não retornar um hProcess dependendo se um novo processo foi iniciado. Esse é o comportamento que você está vendo.
CreateProcess é uma função de nível inferior e cria um processo diretamente e simplesmente passa os argumentos equivalentes. Sempre retorna um identificador de processo.
Nota: Como você parece estar iniciando um arquivo executável, é um pouco surpreendente que nenhum hProcess seja retornado pelo ShellExecuteEx. No entanto, se você quiser garantir que você obtenha um identificador de processo, usar UseShellExecute = false é a coisa correta a ser feita.
Waitforexit nenhum processo está associado a este objeto
System. Diagnostics. Process SetupGUIProcess = new System. Diagnostics. Process ();
SetupGUIProcess. StartInfo = new System. Diagnostics. ProcessStartInfo (strStartMenuPath + & lt; \\ Programas \\ AXYZ International \\ A2MC Setup. appref-ms & quot;);
Quando o programa chega à linha WaitForExit, causa uma exceção & quot; Nenhum processo está associado a este objeto & quot ;. O processo começa ok. Eu estou tentando obter o segmento de chamada para bloquear até que o processo seja encerrado. Este é o caminho certo?
2. Aguarde até que o aplicativo termine a instalação usando o Process. WaitOne.
3. Inicie o executável como outro processo (// newlyinstalled exe).
4. WaitForProcess (); (processo do nome do executável //.
Marcado como Resposta Bin-ze Zhao segunda-feira, 5 de outubro de 2009 8:16.
Todas as respostas.
Eu sei com certeza que o processo ainda está em execução no momento em que WaitForExit é chamado. Eu percebo que estou iniciando o processo por meio de uma referência de clickonce. Eu tentei isso de todas as maneiras diferentes que você pode iniciar um processo e ocorre a mesma exceção. Se eu iniciar o processo apenas passando o caminho para start (). start retorna null. Existe outra maneira de iniciar um aplicativo que é instalado por um escudo de instalação clickonce outro que pela referência? Eu estaria interessado em ver se eu poderia ligar diretamente para o exe. Talvez então a função WaitForExit conheça o objeto de processo. Isso é intrigante. Obrigado pela resposta.
Os aplicativos ClickOnce são iniciados usando uma URL para o arquivo de manifesto de implantação (.application). Então você usa a sintaxe do parâmetro querystring web:
Eu não tenho um servidor. Eu só quero mandar pessoas com dois sheilds instalados. Eles os instalam. e um dos programas instalados pode chamar o outro como um processo e, em seguida, bloquear e aguardar até que seja feito. Ainda não está claro para mim o que eu tenho que fazer para que eu possa chamar o programa usando a sintaxe acima. eu preciso de um sever para fazer isso? Quando você diz parar de usar o ClickOnce. Você quer dizer parar de chamá-lo por sua referência ou você quer parar de usá-lo e usar algum outro método de pagamento? Eu acho que eu realmente não entendo o que o Click Once significa. O termo Clique uma vez apenas encapsula o significado de todos os escudos de instalação por meio da opção de publicação no Visual Studio? Eu espero que você veja com o que estou lutando. Tem que haver algo simples aqui que estou perdendo.
Eu tottally acordo com NoBugz (que muito provavelmente entende isso melhor do que eu). Então, vamos pensar sobre isso você e eu. Quando você visita uma URL, você não inicia um processo ao vivo. Você solicita ao servidor alguns dados e ele retorna alguns dados e, depois, sua vida útil. Não há estado persistente como um processo que você pode acessar. Você está tentando usar um aplicativo clickOnce que usa um URL, então é claro que não há processo por causa do que acabei de passar. Pare de usar o ClickOnce.
Crie um aplicativo instalável como este.
Chame assim.
Espere por isso assim.
Eu não concordo que as postagens estão se desviando da sua pergunta. Seu exemplo usa o ClickOnce, o único problema que você enfrenta é devido ao fato de estar usando o ClickOnce. É por isso que as pessoas dizem. "pare de usar o clickOnce". Talvez você não entenda o que é ClickOnce versus um executável? Este é um exemplo muito simples de exatamente o que você está tentando fazer, sem um clickonce.
Mais uma vez obrigado pela resposta.
1. O clique é uma referência de referência a um exe? Eu gostaria de ligar para o exe. Eu simplesmente não consigo encontrar em qualquer parte do sistema a sua instalação. Existe um caminho específico onde é colocado quando um clique de publicação é executado um escudo de instalação?
Mais uma vez obrigado pela resposta.
1. O clique é uma referência de referência a um exe? Eu gostaria de ligar para o exe. Eu simplesmente não consigo encontrar em qualquer parte do sistema a sua instalação. Existe um caminho específico onde é colocado quando um clique de publicação é executado um escudo de instalação?
Existe um problema lógico com suas perguntas.
Se você precisar instalar o pacote, você não tem o código-fonte (e é por isso que eu suponho que você continue tentando usar um clickonce), então você está basicamente morto na água com suas necessidades. Nenhuma fonte = falha épica.
Desculpe cara eu não entendi. Vamos passo a passo.
1. Vamos supor que você sabia onde o exe estava. Você lançou isso com um processo. Segundo o # 2 existem dependências, portanto o seu programa explode. Como você conserta isso? Você precisa instalar o programa antes de tentar executar o exe.
Vamos supor que eu não sei onde o exe é (porque eu não sei) porque não parece haver um após a instalação do clique uma vez instalar o escudo. Se existe outra forma de fazer um mecanismo de instalação para que eu tenha acesso a um exe. Você pode por favor fornecer o link para a documentação que mostra como fazer isso?
Eu tenho o arquivo de solução do programa original para visual studio desde que eu sou o autor. Se eu criei um pacote de instalador MSI e o eliminei como um arquivo MSI como você diz, poderei chamar o exe como processo? Onde será localizado? Você pode fornecer o link para a documentação sobre como criar o MSI se de fato ele instala um exe?
Se você precisar instalar o pacote, você não tem o código fonte (e é por isso que eu suponho que você continue tentando usar um clickonce), então você está basicamente morto na água com suas necessidades. Nenhuma fonte = falha épica.
Processo . Método WaitForExit ()
A documentação de referência da API. NET tem uma nova página. Visite o Navegador da API. NET em docs. microsoft para ver a nova experiência.
Instrui o componente Processo a aguardar indefinidamente que o processo associado seja encerrado.
Assembly: System (no System. dll)
A configuração de espera não pôde ser acessada.
Nenhuma identificação de processo foi definida e uma Handle da qual a propriedade Id pode ser determinada não existe.
Não há processo associado a este objeto Process.
Você está tentando chamar WaitForExit () para um processo que está sendo executado em um computador remoto. Este método está disponível apenas para processos em execução no computador local.
WaitForExit () faz com que o segmento atual espere até que o processo associado termine. Deve ser chamado depois que todos os outros métodos forem chamados no processo. Para evitar o bloqueio do segmento atual, use o evento Exited.
Este método instrui o componente Process a aguardar uma quantidade infinita de tempo para que os manipuladores de processo e evento saiam. Isso pode fazer com que um aplicativo pare de responder. Por exemplo, se você chamar CloseMainWindow para um processo que tenha uma interface com o usuário, a solicitação para o sistema operacional encerrar o processo associado pode não ser tratada se o processo for gravado para nunca inserir seu loop de mensagem.
No. NET Framework 3.5 e versões anteriores, a sobrecarga WaitForExit () aguardou milissegundos MaxValue (aproximadamente 24 dias), não indefinidamente. Além disso, as versões anteriores não esperavam que os manipuladores de eventos saíssem se o tempo máximo de MaxValue fosse atingido.
Essa sobrecarga assegura que todo o processamento tenha sido concluído, incluindo o tratamento de eventos assíncronos para saída padrão redirecionada. Você deve usar essa sobrecarga após uma chamada para a sobrecarga WaitForExit (Int32) quando a saída padrão tiver sido redirecionada para manipuladores de eventos assíncronos.
Quando um processo associado é encerrado (ou seja, quando é encerrado pelo sistema operacional por meio de uma finalização normal ou anormal), o sistema armazena informações administrativas sobre o processo e retorna ao componente que chamou WaitForExit (). O componente de processo pode acessar as informações, que inclui o ExitTime, usando o identificador para o processo de saída.
Como o processo associado foi encerrado, a propriedade Handle do componente não aponta mais para um recurso de processo existente. Em vez disso, o identificador pode ser usado apenas para acessar as informações do sistema operacional sobre o recurso do processo. O sistema está ciente de identificadores para processos que não foram liberados pelos componentes do processo, portanto, ele mantém as informações de ExitTime e identificador na memória até que o componente de processo especificamente libera os recursos. Por esse motivo, sempre que você chamar a instância Start for Process, chame Close quando o processo associado tiver terminado e você não precisar mais de nenhuma informação administrativa sobre ele. Close libera a memória alocada para o processo finalizado.
Waitforexit nenhum processo está associado a este objeto
Menina: (olhando) "Por que você precisa de um pepino gelado?"
“Quero denunciar uma fraude. O governo está mentindo para todos nós.
Menina: (olhando) "Por que você precisa de um pepino gelado?"
“Quero denunciar uma fraude. O governo está mentindo para todos nós.
Menina: (olhando) "Por que você precisa de um pepino gelado?"
“Quero denunciar uma fraude. O governo está mentindo para todos nós.
Thanx antecipadamente.
Eu fiz isso de acordo com o número de itens selecionados no ActiveExplorer.
Menina: (olhando) "Por que você precisa de um pepino gelado?"
“Quero denunciar uma fraude. O governo está mentindo para todos nós.
Menina: (olhando) "Por que você precisa de um pepino gelado?"
“Quero denunciar uma fraude. O governo está mentindo para todos nós.
Menina: (olhando) "Por que você precisa de um pepino gelado?"
“Quero denunciar uma fraude. O governo está mentindo para todos nós.
Thanx antecipadamente.
Eu fiz isso de acordo com o número de itens selecionados no ActiveExplorer.
Комментарии
Отправить комментарий