Saturday 14 October 2017

Waitforexit Nenhum Processo Está Associado A Este Objeto


Eu tenho um serviço do Windows contendo este código: O objetivo deste código é executar um extrato de IFilter em um documento, usamos um processo separado porque alguns IFilters são notoriamente escamosos. Agora, este código corre perfeitamente bem nas caixas do Windows 7 e do Server 2008 R2, mas em um Windows Server 2003, o WaitForExit imediatamente lança um. Não há nenhum processo associado a esta exceção de objeto Processo. O processo existe e completa sua tarefa sem problema. Qualquer um visto isso Pode alguém lançar alguma luz sobre porque o WaitForExit aumentaria 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, então, parece ser um problema específico ao executar isso em Um serviço em uma caixa do Windows Server 2003. O erro ocorre quando você não obtém um MANUSEAMENTO para o processo (portanto, não pode esperar). Certifique-se de que está especificando UseShellExecutefalse, para evitar a reutilização de um processo. Também você pode descrever o bitness 32 vs 64 do serviço vs. o executável Finalmente, tente o Process Monitor e veja o que mostra acontecer. Ndash Ben 2 de fevereiro 12 às 12:51 ben: Eu vou dar uma chance ao UseShellExecutefalse. Bitness é um bom ponto. O servidor Windows 2003 é um servidor de 32 bits para que tanto o serviço como o executável sejam executados como 32 bits. No entanto, as máquinas Windows 7 ans 2008 R2 são de 64 bits e tanto o serviço como o executável são executados em 64 bits. Então, pode ser que esta seja a diferença não a versão do sistema operacional. Ndash AnthonyWJones 2 de fevereiro 12 às 14:33 Ao iniciar os processos, com a classe System. Diagnostics. Process, o sistema pode usar a função CreateProcess ou ShellExecuteEx Win32. Ao usar CreateProcess, somente arquivos executáveis ​​podem ser iniciados. Ao usar o ShellExecuteEx. Qualquer arquivo que possa ser iniciado usando o comando Iniciar-Executar 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 a chave de registro HKCRltprogidgtshellltverbgt. Isso pode envolver, por exemplo, usando o DDE para procurar e, em seguida, ativar uma instância do Excel existente. Consulte a documentação sobre ShellEXecuteEx s SHELLEXECUTEINFO. Observe que ShellExecuteEx pode ou não retornar um hProcess, dependendo se um novo processo foi iniciado. Este é 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. Ele 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 falso é a coisa correta a fazer. Comece o processo como este System. Diagnostics. Process SetupGUIProcesso de System. Diagnostics. Process () SetupGUIProcess. StartInfo novo System. Diagnostics. ProcessStartInfo (strStartMenuPath quotProgramsAXYZ InternationalA2MC Setup. appref-msquot) SetupGUIProcess. Start () SetupGUIProcess. WaitForExit () Quando o programa chega à linha WaitForExit, ele faz com que uma exceção quotNo Processo esteja associada a este objeto. O processo começa ok. Estou tentando obter o segmento de chamada para bloquear até que o processo seja encerrado. É este o jeito certo quinta-feira, 01 de outubro de 2009 8:31 PM Vamos acertar o botão de reinicialização de maneira rápida. Ok, agora você quer fazer isso: 1. Instale o aplicativo (veja o artigo do códigoprojeto sobre como usar o msiexec para fazê-lo). Processo de uso (ExecuteableOnCodeProject). 2. Aguarde até que o aplicativo termine de instalar usando Process. WaitOne 3. Inicie Executable como outro Processo (exe recentemente instalado). 4. WaitForProcess () (Processo de Nomes Executáveis.) E você tem o código-fonte. Sim, tudo que você precisa fazer é criar o msi e instalá-lo usando a técnica acima. Eu não vou passar por todo esse processo de instalação de um MSI porque Eu não posso fazer um trabalho tão bom como o artigo faz para explicar tal coisa. Não exagere isso. Siga as instruções e leia o artigo. Isso não será copi-colar, mas é por isso que você recebe o dinheiro muito bem. Bom A codificação envolve conhecer os limites lógicos e expandi-los conforme necessário. Marcado como resposta por Bin-ze Zhao Segunda-feira, 05 de outubro de 2009 8:16 AM Sexta-feira, 02 de outubro de 2009 21:25 Todas as respostas Isso parece com o código correto. Im Não sei o que poderia estar errado, a menos que o processo que você está iniciando apenas comece com outro e, em seguida, termina, o que significaria que o processo referenciado pelo SetupGUIProcess teria terminado não existe mais e, portanto, WaitForExit pode ser ilegal. Como alternativa, talvez WaitForExit não seja válido Quando algo eu É aberto através de uma associação, em vez de abrir um programa específico. E o nome do arquivo que você especificou não parece um exe (embora possa ser). Quinta-feira, 01 de outubro de 2009 8:55 PM quot Você pode iniciar um aplicativo ClickOnce especificando o local (por exemplo, um endereço da Web) do qual você instalou originalmente o aplicativo. Não inicie um aplicativo ClickOnce especificando seu local instalado no seu disco rígido. Então, você não deve fazer isso especificando o arquivo de referência do aplicativo, você deve especificar o local do arquivo urloriginal para iniciar o processo. Você pode ver essa localização abrindo o arquivo appref-ms com um editor de texto. Quinta-feira, 01 de outubro de 2009 9:00 PM Eu sei com certeza que o processo ainda está sendo executado no momento em que WaitForExit é chamado. Eu percebo que estou iniciando o processo por meio de uma referência 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 iniciar (). Start retorna nulo. Existe outra maneira de iniciar um aplicativo que é instalado por um escudo de instalação de clique e outro que, pela referência, estaria interessado em ver se eu poderia chamar o exe diretamente. Talvez então a função WaitForExit conheça o objeto do processo. Isso é intrigante. Obrigado pela resposta quinta-feira, 01 de outubro de 2009 9:04 PM Nós passamos por isso antes em seu tópico anterior. Pare de usar o ClickOnce. Hans Passant Sexta-feira, 02 de outubro de 2009 12:09 AM Estou tendo um pequeno problema em colocar tudo isso. Eu acho que não entendo essa declaração no link para o primeiro artigo que você me deu na outra publicação: eu não tenho um servidor. Eu só quero enviar as pessoas 2 instalando sheilds zipped up. Eles os instalam. E um dos programas instalados pode chamar o outro como um processo e depois bloquear e aguardar até que seja feito. Ainda não está claro para mim o que tenho que fazer para que eu possa chamar o programa usando a sytax acima. Preciso de um sever para fazer isso Quando você diz, pare de usar o ClickOnce. Você quer dizer parar de chamá-lo por sua referência ou quer dizer que detém de usá-lo e use algum outro método de jogo. Eu acho que realmente não entendo o que o Click Once significa. O termo Click Once simplesmente encapsula o significado de todos os protetores de instalação por meio da opção de publicação no Visual Studio, espero que você veja com o que estou lutando. Tem que haver algo simples aqui, estou faltando. Sexta-feira, 02 de outubro de 2009 2:29 PM Eu concordo totalmente com NoBugz (que provavelmente entende isso melhor do que eu). Então, vamos pensar sobre isso você e eu. Quando você visita um URL, não desencadeia um processo ao vivo. Você solicita ao servidor alguns dados e retorna alguns dados e, em seguida, o seu fora de sua vida. Não existe um estado persistente como um processo ao qual você pode acessar. Você está tentando usar um aplicativo ClickOnce que usa um URL, então, claro, não há nenhum processo devido exatamente ao que acabei de passar. Pare de usar o ClickOnce. Sexta-feira, 02 de outubro de 2009 2:37 PM Uh Eu sei que vocês estão tentando ajudar e eu aprecio isso, mas eu ainda não entendo. Eu poderia me importar menos o que acontece quando eu via um URL e como eu disse antes não sei o que você quer dizer quando diz que não use o clique uma vez. Se você quiser fazer um comentário como esse, você pode sugerir uma alternativa. Eu só quero dar a alguém uma maneira de instalar dois programas que eu fiz e chamar um do outro e bloquear o processo de chamada até o processo chamado retornar. Parece haver algum tipo de diferença entre o que estou tentando fazer e o que vocês estão tentando explicar. Sinto que as duas publicações que fiz fizeram se afastaram até agora do meu problema real. Por favor, alguém pode dividir isso em algum tipo de termos ou etapas simples Talvez algo assim Etapa 1 --------- Crie um aplicativo instalável como este. Passo 2. ---------- Chame-o Como nesta sexta-feira, 02 de outubro de 2009 às 15h43. Eu não concordo que as postagens estão se desviando da sua pergunta. Seu exemplo usa ClickOnce, o único problema que sua experiência é devido ao fato de você estar usando o ClickOnce. É por isso que as pessoas dizem. Pare de usar o ClickOnce. Talvez você não entenda o que ClickOnce é vs um executável. Este é um exemplo muito simples de exatamente o que você está tentando fazer SEM clique em um clique. Sexta-feira, 02 de outubro de 2009 3:47 PM Agora, se você usou um MSI e execute o msiexec. exe para instalar o aplicativo primeiro (use WaitForExit para que termine. Se você tiver algum problema, veja o link do códigoprojeto para uma alternativa), então Após esse processo, execute o arquivo EXE dos processos, nesse momento você deve poder chamar WaitForExit () para o seu programa recém-instalado. Se você deseja verificar as versões existentes do aplicativo, então você obtém um nível mais complicado e deve olhar para essa amostra do códigoprojeto. Sexta-feira, 02 de outubro de 2009 5:05 PM Obrigado novamente pela resposta. Eu entendo o que você diz. Todo o problema é porque eu estou chamando o clique uma vez que a referência e não uma exe real. Eu tenho algumas perguntas. 1. É o clique uma vez que faz referência a uma exe, eu gostaria de chamar o exe. Eu simplesmente não consigo encontrar em qualquer lugar no sistema em que foi iniciado. Existe um caminho específico onde é colocado quando um clique de publicação clique em um escudo de instalação é executado 2. Se a resposta para a pergunta acima for não. Então, isso se torna um problema de instalar o primeiro aplicativo com o processo exe Estou tentando ligar e todas as suas dependências Obrigado por sua paciência sexta-feira, 02 de outubro de 2009 5:12 PM Obrigado novamente pela resposta. Eu entendo o que você diz. Todo o problema é porque eu estou chamando o clique uma vez que a referência e não uma exe real. Eu tenho algumas perguntas. 1. É o clique uma vez que faz referência a uma exe, eu gostaria de chamar o exe. Eu simplesmente não consigo encontrar em qualquer lugar no sistema em que foi iniciado. Existe um caminho específico onde é colocado quando um clique de publicação clique em um escudo de instalação é executado 2. Se a resposta para a pergunta acima for não. Então, isso se torna um problema de instalar o primeiro aplicativo com o processo exe Estou tentando ligar e todas as suas dependências Obrigado pela sua paciência Don Há um problema de lógica com suas perguntas. 1. Assumimos que você sabia onde estava o exe. Você o lançou com um processo. De acordo com 2 há dependências, portanto, seu programa explode. Como você corrige isso Você precisa instalar o programa antes de tentar executar o exe. Então, o que você faz Você precisa localizar o arquivo de solução de programas originais para o Visual Studio e criar um pacote de instalação e destruí-lo como um arquivo MSI. Então você pode usar a técnica que postei anteriormente para instalar o pacote e executá-lo. Problema: se você precisa instalar o pacote, você não possui o código-fonte (é por isso que eu assumiria que você continuasse tentando usar um clique), então você está essencialmente morto na água com seus requisitos. Nenhum épico fonte falha. Sexta-feira, 02 de outubro de 2009 17:33 Desculpe o homem, eu não entendo. Leta vai passo a passo. Seu comentário 1. Suponhamos que você soubesse onde estava o exe. Você o lançou com um processo. De acordo com 2 há dependências, portanto, seu programa explode. Como você corrige isso Você precisa instalar o programa antes de tentar executar o exe. Meu Comitê Suponho que eu não sei onde o exe é (porque eu não) porque não parece ser um depois de instalar o botão uma vez instalado o escudo. Se houver outra maneira de criar uma estrutura de instalação para que eu tenha acesso a um exe. Você pode fornecer o link para a documentação que mostra como fazê-lo. Você precisa localizar o arquivo de solução de programas original para o Visual Studio e criar um pacote de instalação e destruí-lo como um arquivo MSI. Então você pode usar a técnica que postei anteriormente para instalar o pacote e executá-lo. Meu comentário Eu tenho o arquivo de solução de programas original para o visual studio desde que eu sou o autor. Se eu criei um pacote de instalação do MSI e o destrua como um arquivo MSI, como você diz, então eu poderei chamar o exe up como processo. Onde estará localizado? Você pode fornecer o link para a documentação sobre como criar o MSI se Na verdade, ele irá instalar um exe Problema: se você precisa instalar o pacote, você não tem o código-fonte (é por isso que eu assumiria que você continuasse tentando usar um clique), então você está essencialmente morto na água com seus requisitos. Nenhum épico fonte falha. Meu comentário eu tenho absolutamente o código-fonte e o projeto. A razão pela qual eu estou usando o clique uma vez é porque parecia ser fácil para meus clientes instalar meu aplicativo com todas as condições. Então eu tenho todos esses clientes com o meu aplicativo instalado usando a abordagem de clique uma vez. Agora, tudo o que quero fazer é escrever outro aplicativo com um botão que chama o primeiro e aguarda até que seja feito. É a chave para isso realmente empacotar o primeiro aplicativo (aquele que eu quero chamar) como um arquivo msi novamente Obrigado pela sua paciência sexta-feira, 02 de outubro de 2009 9:00 pau Para acertar o botão de reiniciar muito rápido. Ok, agora você quer fazer isso: 1. Instale o aplicativo (veja o artigo do códigoprojeto sobre como usar o msiexec para fazê-lo). Processo de uso (ExecuteableOnCodeProject). 2. Aguarde até que o aplicativo termine de instalar usando Process. WaitOne 3. Inicie Executable como outro Processo (exe recentemente instalado). 4. WaitForProcess () (Processo de Nomes Executáveis.) E você tem o código-fonte. Sim, tudo que você precisa fazer é criar o msi e instalá-lo usando a técnica acima. Eu não vou passar por todo esse processo de instalação de um MSI porque Eu não posso fazer um trabalho tão bom como o artigo faz para explicar tal coisa. Não exagere isso. Siga as instruções e leia o artigo. Isso não será copi-colar, mas é por isso que você recebe o dinheiro muito bem. Bom A codificação envolve conhecer os limites lógicos e expandi-los conforme necessário. Marcado como resposta por Bin-ze Zhao Segunda-feira, 5 de outubro de 2009 8:16 AM Sexta-feira, 02 de outubro de 2009 21:25 A Microsoft está realizando uma pesquisa on-line para entender sua opinião Do site da Msdn. Se você optar por participar, a pesquisa on-line será apresentada quando você deixar o site da Msdn. Deseja participar

No comments:

Post a Comment