Processo de diagnóstico do sistema start waitforexit


Process. WaitForExit () retorna exceção de referência nula.
Quando eu recupero jpg e outros arquivos de imagem do banco de dados (também alguns mp3 que são abertos com o winamp - que é definido como o aplicativo padrão) parece que ele retorna um valor nulo, causando uma Exceção de Referência Nula a ser lançada e o programa irá falhar (agradeça a Deus pelo Try-Catch!). Eu pesquisei por algum tempo e descobri que o processo que é chamado é o dllhost. exe.
Ainda retorna nulo. Agora, se eu alterar o aplicativo padrão que um arquivo está usando para abri-lo, ele funciona muito bem.
O problema é que não quero alterar os aplicativos padrão, pois o aplicativo que estou desenvolvendo vai ser instalado em diversos PCs, com diferentes usuários e diferentes preferências.
Abaixo está o código que eu uso para recuperar e abrir os arquivos.
Estou um pouco perdido aqui e pude realmente usar sua ajuda.
Por favor, sinta-se à vontade para perguntar qualquer detalhe que possa ajudar.

System. Diagnostics. Process 执行. EXE.
C : C # + WINFORM 2009-04-05 21:09 459 人 阅读 评论 (0) 收藏 举报.
Process. Start (String, String)
Process. Start (String, String, SecureString, String)
Process. Start (String, String, String, SecureString, String)
System. Diagnostics. Process ie = new System. Diagnostics. Process ();
string mathonPath = @ "C: / Arquivos de Programas / Maxthon // Maxthon. exe";
System. Diagnostics. Process p = new System. Diagnostics. Process (); // 设定 程序 名.
System. Diagnostics. Process. Start ("rundll32.exe", @ "shell32.dll, Control_RunDLL appwiz. cpl, 1");
WinExec ('rundll32.exe shell32.dll, Control_RunDLL sysdm. cpl', SW_SHOW);
R 列: shell32.dll rundll32.exe, Control_RunDLL.
R 列: rundll32.exe shell32.dll, Control_RunDLL access. cpl ,, 1.
R 列: shell32.dll rundll32.exe, Control_RunDLL access. cpl ,, 2.
R 列: rundll32.exe shell32.dll, Control_RunDLL access. cpl ,, 3.
R 列: shell32.dll rundll32.exe, Control_RunDLL access. cpl ,, 4.
R 列: rundll32.exe shell32.dll, Control_RunDLL access. cpl ,, 5.
R 列: rundll32.exe shell32.dll, Control_RunDLL sysdm. cpl @ 1.
: Rdll32.exe shell32.dll, SHHelpShortcuts_RunDLL AddPrinter.
R 列: rundll32.exe shell32.dll, Control_RunDLL appwiz. cpl, 1.
R 列: rundll32.exe shell32.dll, Control_RunDLL appwiz. cpl, 2.
功能: 显示 & ldquo; 控制 面板 - 添加 / 删除 程式 - 安装 Windows & rdquo;面板。
R 列: shell32.dll rundll32.exe, appwiz. cpl Control_RunDLL, 3.
R 列: rundll32.exe syncui. dll, Briefcase_Create.
R 列: rundll32.exe diskcopy. dll, DiskCopyRunDll.
R 列: rundll32.exe apwiz. cpl, NewLinkHere % 1.
R 列: rundll32.exe shell32.dll, Control_RunDLL timedate. cpl, 0.
R 列: rundll32.exe shell32.dll, Control_RunDLL timedate. cpl, 1.
R 列: rundll32.exe rnaui. dll, RnaDial [某个 拨号 连接 的 名称]
R 列: rundll32.exe rnaui. dll, RnaWizard.
R 列: rundll32.exe shell32.dll, Control_RunDLL desk. cpl, 0.
R 列: rundll32.exe shell32.dll, Control_RunDLL desk. cpl ,, 1.
R 列: rundll32.exe shell32.dll, Control_RunDLL desk. cpl, 2.
R 列: rundll32.exe shell32.dll, Control_RunDLL desk. cpl ,, 3.
R 列: shell32.dll rundll32.exe, SHHelpShortcuts_RunDLL FontsFolder.
R 列: rundll32.exe shell32.dll, Control_RunDLL main. cpl @ 3.
R: 同样 是 显示 显示 显示 显示 显示 显示 显示 列 列 列 r: rundll32.exe shell32.dll, SHFormatDrive.
R 列: rundll32.exe shell32.dll, Control_RunDLL joy. cpl, 0.
R 列: rundll32.exe shell32.dll, Control_RunDLL joy. cpl, 1.
R 列: rundll32.exe mshtml. dll, PrintHTML (HTML 文档)
R 列: shell32.dll rundll32.exe, Control_RunDLL mlcfg32.cpl.
功能: 显示 Microsoft Exchange 一般 选项 视窗。
R 列: rundll32.exe shell32.dll, Control_RunDLL main. cpl @ 0.
R 列: rundll32.exe shell32.dll, Control_RunDLL main. cpl @ 1.
R 列: rundll32.exe shell32.dll, Control_RunDLL main. cpl @ 1,, 1.
R 列: rundll32.exe shell32.dll, Control_RunDLL main. cpl @ 2.
R 列: rundll32.exe shell32.dll, Control_RunDLL main. cpl @ 3.
R 列: rundll32.exe shell32.dll, Control_RunDLL main. cpl @ 4.
R 列: rundll32.exe shell32.dll, Control_RunDLL modem. cpl, adicionar.
R 列: rundll32.exe shell32.dll, Control_RunDLL mmsys. cpl, 0.
R 列: shell32.dll rundll32.exe, mmsys. cpl Control_RunDLL, 1.
R 列: shell32.dll rundll32.exe, mmsys. cpl Control_RunDLL, 2.
R 列: shell32.dll rundll32.exe, mmsys. cpl, Control_RunDLL, 3.
R 列: shell32.dll rundll32.exe, mmsys. cpl Control_RunDLL, 4.
R: 显示 & ldquo; 控制 面板 - 多媒体 属性 - 设备 & rdquo; 属性 页。 命令 列: rundll32.exe shell32.dll, Control_RunDLL mmsys. cpl @ 1.
R 列: shell32.dll rundll32.exe, Control_RunDLL netcpl. cpl.
R 列: rundll32.exe shell32.dll, Control_RunDLL odbccp32.cpl.
R 列: shell32.dll rundll32.exe, OpenAs_RunDLL.
R 列: rundll32.exe shell32.dll, Control_RunDLL password. cpl.
R 列: rundll32.exe shell32.dll, Control_RunDLL powercfg. cpl.
R 列: shell32.dll rundll32.exe, SHHelpShortcuts_RunDLL PrintersFolder.
显示: 显示 Windows & ldquo; 印表 机 & rdquo; 档案 夹。 (rundll32.exe shell32.dll, Control_RunDLL main. cpl @ 2)
R 列: rundll32.exe shell32.dll, Control_RunDLL intl. cpl, 0.
R 列: rundll32.exe shell32.dll, Control_RunDLL intl. cpl ,, 1.
R 列: rundll32.exe shell32.dll, Control_RunDLL intl. cpl, 2.
R 列: rundll32.exe shell32.dll, Control_RunDLL intl. cpl ,, 3.
R 列: rundll32.exe shell32.dll, Control_RunDLL intl. cpl ,, 4.
R 列: rundll32.exe desk. cpl, InstallScreenSaver [萤 屏 保护 档案 名]
R 列: shell32.dll rundll32.exe, sysdm. cpl Control_RunDLL, 0.
R 列: rundll32.exe shell32.dll, Control_RunDLL sysdm. cpl, 1.
R 列: shell32.dll rundll32.exe, sysdm. cpl Control_RunDLL, 2.
R 列: shell32.dll rundll32.exe, sysdm. cpl Control_RunDLL, 3.
R: 显示 & ldquo; 控制 面板 - 系统 属性 - 性能 & rdquo; 属性 视窗。 命令 列: rundll32.exe user. exe, restartwindows.
R 列: rundll32.exe user. exe, exitwindows.
R 列: shell32.dll rundll32.exe, telephon. cpl Control_RunDLL.
R 列: rundll32.exe shell32.dll, Control_RunDLL themes. cpl.
2010-09-03 16: 36: 25 | 2005 : 2005 (c #) | 字号 订阅.
using System. Diagnostics; // 引入 Process 类.
classe parcial pública Form1: Form.
private string ExeName = "DOS_XXT";
private string ExePath = @ "E: \ DOS_XXT. exe";
private bool RunFlag = false;
Processo privado [] MyProcesses;
private void timer1_Tick (remetente do objeto, EventArgs e)
> privado void whbtask ()
foreach (Processar MyProcess em MyProcesses)
if (MyProcess. ProcessNamepareTo (ExeName) == 0)
listBox1.Items. Add (DateTime. Now. ToString () + ":" + ExePath + "程序 重新 启动 一次!");
private void button1_Click (remetente do objeto, EventArgs e)
Vazio particular Form1_Load (remetente do objeto, EventArgs e)
listBox1.Items. Add ("说明 : 程序 为" + ExePath + "Ex 监控 程序 , 每 1 小时 轮询 一次 , 如果" + ExePath + "异).
Publicado em 2011-06-02 15:15 CodeNote 阅读 (645) 评论 (0) 编辑 收藏.
方法 用来 创建 一个 新 新 的 的 的 比如说 比如说 比如说 你 在 某个 程序 的 的 上 上 加 加 个 超 链接 链接 到 百度 百度 知道 知道 那么 就 可以 可以 用 这个 方法 来 实现.

VBlog do Lucian VBlog Lucian.
Às vezes, você quer iniciar um utilitário externo e enviar entrada para ele e também capturar sua saída. Mas é fácil entrar em um impasse desse jeito.
Usando p como novo System. Diagnostics. Process.
p. StandardInput. Write ("world" & amp; vbCrLf & amp; "hello")
'deadlock aqui se p precisa escrever mais de 12k para StandardOutput.
Dim op = p. StandardOutput. ReadToEnd ()
Console. WriteLine ("OUTPUT:"): Console. WriteLine (op)
O impasse neste caso surge porque "cat" (um utilitário unix padrão) primeiro lê a partir de StandardInput, em seguida, escreve para StandardOutput, em seguida, lê novamente, e assim por diante, até que não haja mais nada para ler. Mas se o seu StandardOutput enche ninguém para lê-lo, então ele não pode mais escrever e bloquear.
O número "12k" é arbitrário e eu não confiaria nele.
Usando p como novo System. Diagnostics. Process.
'deadlock aqui se p precisa escrever mais de 12k para StandardError.
Dim op = p. StandardOutput. ReadToEnd ()
Dim err = p. StandardError. ReadToEnd ()
Console. WriteLine ("OUTPUT:"): Console. WriteLine (op)
Console. WriteLine ("ERROR:"): Console. WriteLine (err)
A documentação do MSDN diz, "Você pode usar operações de leitura assíncronas para evitar essas dependências e seu potencial de deadlock. Como alternativa, você pode evitar a condição de deadlock criando dois threads e lendo a saída de cada fluxo em um thread separado." 'Eu vou fazer.
Usando encadeamentos para redirecionar sem deadlock.
'BOM CÓDIGO: isso não será um impasse.
Usando p como novo diagnóstico. Processo.
'não WaitForExit ainda desde que introduziria deadlocks.
p. InputAndOutputToEnd ("world" & amp; vbCrLf & amp; "hello", op, Nothing)
Console. WriteLine ("OUTPUT:"): Console. WriteLine (op)
'' 'InputAndOutputToEnd: uma maneira prática de usar entrada / saída / erro redirecionado em uma p.
'' '& lt; nome do parametro = "p" & gt; O p para redirecionar. Tem de ter UseShellExecute definido como falso. & Lt; / param & gt;
'' '& lt; param name = "StandardInput" & gt; Esta string será enviada como entrada para a p. (deve ser Nothing, se não for StartInfo. RedirectStandardInput) & lt; / param & gt;
'' '& lt; param name = "StandardOutput" & gt; A saída de p será coletada nesta string ByRef. (deve ser Nothing se não for StartInfo. RedirectStandardOutput) & lt; / param & gt;
'' '& lt; nome do parametro = "StandardError" & gt; O erro do p será coletado nesta string ByRef. (deve ser Nothing se não for StartInfo. RedirectStandardError) & lt; / param & gt;
'' '& lt; remarks & gt; Esta função resolve o problema de deadlock mencionado em msdn. microsoft/pt-br/library/system. diagnostics. p.standardoutput. aspx</remarks>
& lt; RuntimepilerServices. Extension () & gt; Sub InputAndOutputToEnd (ByVal p Como Diagnostics. Process, ByVal StandardInput como String, ByRef StandardOutput como String, ByRef StandardError como String)
Se p não é nada, em seguida, lança novo ArgumentException ("p deve ser não-nulo")
'Suponha que p começou. Infelizmente não há como checar.
Se p. StartInfo. UseShellExecute Em seguida, lançar novo ArgumentException ("Set StartInfo. UseShellExecute to false")
If (p. StartInfo. RedirectStandardInput & lt; (gt; StandardInput IsNot Nothing)) Em seguida, lançar novo ArgumentException ("Fornecer uma entrada não nula somente quando StartInfo. RedirectStandardInput")
If (p. StartInfo. RedirectStandardOutput & lt; (StandardOutput IsNot Nothing)) Em seguida, lançar novo ArgumentException ("Fornecer uma saída não nula somente quando StartInfo. RedirectStandardOutput")
If (p. StartInfo. RedirectStandardError & lt; (gt; StandardError IsNot Nothing)) Em seguida, lançar novo ArgumentException ("Fornecer um erro não nulo somente quando StartInfo. RedirectStandardError")
Dim outputData As New InputAndOutputToEndData.
Dim errorData As New InputAndOutputToEndData.
Se p. StartInfo. RedirectStandardOutput Então.
outputData. Thread = Novo Threading. Thread (AddressOf InputAndOutputToEndProc)
Se p. StartInfo. RedirectStandardError Então.
errorData. Thread = Novo Threading. Thread (AddressOf InputAndOutputToEndProc)
Se p. StartInfo. RedirectStandardInput Então.
If p. StartInfo. RedirectStandardOutput Then outputData. Thread. Join (): StandardOutput = outputData. Output.
Se p. StartInfo. RedirectStandardError Então, errorData. Thread. Join (): StandardError = errorData. Output.
Se outputData. Exception IsNot Nothing Então lance outputData. Exception.
If errorData. Exception IsNot Nothing Em seguida, lance errorData. Exception.
Classe privada InputAndOutputToEndData.
Public Thread As Threading. Thread.
Fluxo público como IO. StreamReader.
Saída Pública como String.
Exceção pública como exceção.
Private Sub InputAndOutputToEndProc (ByVal data_ como objeto)
Dim dados = DirectCast (data_, InputAndOutputToEndData)
Tente: data. Output = data. Stream. ReadToEnd: captura e como exceção: data. Exception = e: End Try.
Cancelar resposta.
Por que não usar process. OutputDataReceived e process. ErrorDataReceived?
Dessa forma, você pode ecoar (ou capturar) a saída de ambos na ordem recebida.
Isso parece muito mais simples que async ou threading para mim.

Processo . Método WaitForExit (Int32)
A documentação de referência da API tem uma nova casa. Visite o Navegador da API em docs. microsoft para ver a nova experiência.
Instrui o componente Processo a aguardar o número especificado de milissegundos para o processo associado sair.
Assembly: System (no System. dll)
Parâmetros
O período de tempo, em milissegundos, para aguardar a saída do processo associado. O máximo é o maior valor possível de um inteiro de 32 bits, que representa infinito para o sistema operacional.
Valor de retorno.
true se o processo associado tiver saído; Caso contrário, false.
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 (Int32) 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 (Int32) 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 finita de tempo para o processo sair. Se o processo associado não sair no final do intervalo porque a solicitação para finalizar é negada, false é retornado para o procedimento de chamada. Você pode especificar um número negativo (Infinito) por milissegundos e Processo. WaitForExit (Int32) se comportará da mesma maneira que a sobrecarga WaitForExit (). Se você passar 0 (zero) para o método, ele retornará true somente se o processo já tiver saído; caso contrário, retorna imediatamente false.
No Framework 3.5 e em versões anteriores, se milissegundos fosse -1, a sobrecarga WaitForExit (Int32) aguardava milissegundos MaxValue (aproximadamente 24 dias), não indefinidamente.
Quando a saída padrão foi redirecionada para manipuladores de eventos assíncronos, é possível que o processamento de saída não seja concluído quando esse método retornar. Para garantir que o tratamento assíncrono de eventos tenha sido concluído, chame a sobrecarga WaitForExit () que não recebe nenhum parâmetro após receber um valor verdadeiro dessa sobrecarga. Para ajudar a garantir que o evento Exited seja tratado corretamente nos aplicativos do Windows Forms, defina a propriedade SynchronizingObject.
Quando um processo associado sai (é desligado 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 (Int32). 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.

Como usar System. Diagnostics. Process corretamente.
Eu vi muitas perguntas no stackoverflow e em outros lugares sobre a execução de um processo e a captura da saída. Usando o System. Diagnostics. Process corretamente não é fácil e na maioria das vezes é feito errado.
Alguns erros comuns com System. Diagnostics. Process:
Não capturar os dois fluxos de saída (erro e saída) Não redirecionar a entrada pode fazer com que os aplicativos travem Não fechar entrada redirecionada pode fazer com que os aplicativos travem Não chamar BeginOutputReadLine / BeginErrorReadLine ao usar eventos Usar OutputDataReceived / ErrorDataReceived sem aguardar null Não verificar null em OutputDataReceived / ErrorDataReceived handlers Esquecendo de setar EnableRaisingEvents = true; ao usar o evento Exited Forgetting ErrorDialog, CreateNoWindow ou UseShellExecute settings Manipulação incorreta dos leitores de fluxo StandardOutput ou StandardError.
Então, com isto dito, aqui estão algumas diretrizes básicas:
Use os eventos OutputDataReceived / ErrorDataRecieved NOT o StandardOutput ou StandardError. Isso poupará muita dor de cabeça e gerenciamento desnecessário de encadeamentos. Sempre capture todas as saídas E entradas, se você não planeja fornecer entrada, feche o fluxo imediatamente. Seu processo não é feito até que ele tenha saído E você leu todos os dados. OutputDataReceived CAN E será disparado após uma chamada para WaitForExit () retornar. Você precisará de identificadores de espera para cada fluxo de saída e definirá o identificador de espera assim que receber dados (nulos).

System. diagnostics. process. start waitforexit
Resumo Especifica um conjunto de valores usados ​​ao iniciar um processo. Sintaxe C #:
Você pode usar a classe ProcessStartInfo para obter maior controle sobre o processo iniciado. Você deve definir pelo menos a propriedade ProcessStartInfo. FileName, manualmente ou usando o construtor. O nome do arquivo é qualquer aplicativo ou documento. Aqui, um documento é definido como qualquer tipo de arquivo que tenha uma ação aberta ou padrão associada a ele. Você pode ver os tipos de arquivos registrados e seus aplicativos associados ao seu computador usando a caixa de diálogo Opções de Pasta disponível no sistema operacional. O botão Avançado leva a uma caixa de diálogo que mostra se há uma ação aberta associada a um tipo de arquivo registrado específico.
Além disso, você pode definir outras propriedades que definem ações a serem executadas com esse arquivo. Você pode especificar um valor específico para o tipo da propriedade ProcessStartInfo. FileName para a propriedade System. Diagnostics. ProcessStartInfo. Verb (não suportada na CLI de origem compartilhada). Por exemplo, você pode especificar "imprimir" para um tipo de documento. Além disso, você pode especificar valores de propriedade ProcessStartInfo. Arguments para serem argumentos de linha de comando para passar para o procedimento aberto do arquivo. Por exemplo, se você especificar um aplicativo de editor de texto na propriedade ProcessStartInfo. FileName, poderá usar a propriedade ProcessStartInfo. Arguments para especificar um arquivo de texto a ser aberto pelo editor.
A entrada padrão geralmente é o teclado, e a saída padrão e o erro geralmente são a tela do monitor. No entanto, você pode usar as propriedades ProcessStartInfo. RedirectStandardInput, ProcessStartInfo. RedirectStandardOutput e ProcessStartInfo. RedirectStandardError para fazer com que o processo obtenha entrada ou retorne a saída para um arquivo ou outro dispositivo. Se você usar as propriedades Process. StandardInput, Process. StandardOutput ou Process. StandardError no componente Process, deverá primeiro definir o valor correspondente na propriedade ProcessStartInfo. Caso contrário, o sistema lançará uma exceção quando você ler ou gravar no fluxo.
Configure ProcessStartInfo. UseShellExecute para especificar se deve iniciar o processo usando o shell do sistema operacional.
Você pode alterar o valor de qualquer propriedade ProcessStartInfo até a hora em que o processo é iniciado. Depois de iniciar o processo, alterar esses valores não tem efeito.
Lista de Membros System. Diagnostics. ProcessStartInfo:
Inicializa uma nova instância da classe ProcessStartInfo sem especificar um nome de arquivo com o qual iniciar o processo.

Comments