Estoy intentando iniciar una aplicación (desde el sistema operativo, mi aplicación y la aplicación que deseo iniciar son todos los 32 bits) desde .NET 3.51.Problema al iniciar un System.Diagnostics.Process en Windows 7
El código que inicia el Proceso se usa para otras aplicaciones, pero hay uno que nos causa dolor de cabeza. Si hacemos "doble clic" en el ícono de la aplicación, funciona como se espera, lo que significa que funciona bien como una aplicación en la computadora. Hacer doble clic directamente en .exe también funciona.
El sistema operativo es Windows 7 32Bits (Hogar y/o Profesional).
Nuestra aplicación .NET está compilada con x86 para evitar problemas. El código que inicia "Procesos" se encuentra dentro de una DLL (también 32 bits) hecha por nosotros, básicamente es una DLL simple que contiene un "Código común" en general, métodos comunes, funciones y cosas que usamos a lo largo de todo el documento. nuestro código Uno de esos métodos se parecen a esto:
public static bool FireUpProcess(Process process, string path, bool enableRaisingEvents,
ProcessWindowStyle windowStyle, string arguments)
{
if (process != null)
{
try
{
process.StartInfo.FileName = @path;
if (arguments != null)
{
if (arguments != String.Empty)
{
process.StartInfo.Arguments = arguments;
}
}
process.StartInfo.WindowStyle = windowStyle;
process.EnableRaisingEvents = enableRaisingEvents;
process.Start();
}
catch
{
try
{
process.Kill();
}
catch (InvalidOperationException)
{
} // The process is not even created
return false;
}
}
else
{
return false;
}
return true;
}
no sé que escribió este método, pero se ha estado trabajando durante aproximadamente seis años con diferentes aplicaciones, por lo tanto, supongo que es “ok”. Sin embargo, tenemos un cliente con un software que no se ejecutará cuando pase por ese argumento.
Los argumentos son:
- proceso es un System.Diagnostics.Process creado con un simple "nuevo Proceso();”
- camino es una ruta completa al. exe. “c: /path/to/my.exe”
- EnableRaisingEvents es falsa
- windowStyle está maximizado (pero lo han intentado otros).
Da un mensaje de caja de mierda ... que felizmente he inmortalizado. Está en español, pero la traducción debería ser fácil:
Dice:
Error de aplicación ha producido una excepción inesperada para el programa (0x0eedfade) a las ...
buscar en Google que 0x0eedfade arroja resultados extraños que dan miedo, pero la verdad es que si voy al archivo .exe que intento abrir y hago doble clic en él, funciona perfectamente.
For The Record: Si yo intento poner en marcha otras cosas (es decir .: Notepad.exe, Adobe Acrobat Reader) funciona, pero Firefox no se abre y no muestra un error.
Este comportamiento de "algo de trabajo, algunos no" me lleva a pensar que puede haber un problema con un mecanismo de seguridad de Windows 7 o similar que no conozco.
¿Qué me falta o hacer mal?
ACTUALIZACIÓN: Ok; Obtuve una copia del software. Es un software sucio pero funciona. Ahora que puedo depurar, veo que el programa da un error cuando se inicia con mi método FireUpProcess
.
Como sugirió he añadido el código WorkingDirectory, pero aquí está el código:
public static bool FireUpProcess(Process process, string path, bool enableRaisingEvents, ProcessWindowStyle windowStyle)
{
if (process != null)
{
try
{
if (!String.IsNullOrEmpty(@path))
{
process.StartInfo.FileName = @path;
process.StartInfo.WorkingDirectory = System.IO.Path.GetDirectoryName(@path);
process.StartInfo.WindowStyle = windowStyle;
// Suscribe to the exit notification
process.EnableRaisingEvents = enableRaisingEvents;
// Disable to prevent multiple launchs
Framework.Check.LogWarning("LAUNCHING EXTERNAL DEVICE WITH PATH: " + path);
process.Start(); // HERE The program reports the following:
Eso significa, “El programa no pudo iniciarse debido ddip.dll falta ... intente volver a instalar bla bla ".
La cosa es, si ejecuto el mismo @path desde la línea de comandos, el programa abre la perfección:
que abre el programa. Y lo mismo ocurre si hago clic en el "acceso directo" que se encuentra en el menú "programas". No hay ningún parámetro en ese acceso directo, es una simple llamada al archivo ejecutable.
Así que la pregunta es ahora: ¿Cuál es la diferencia entre mi código y los otros métodos?
Tiene que haber algo diferente que hace que mi proceso no comience.
¿Alguna idea?
ACTUALIZACIÓN Y SOLUCIÓN
Hice que funcione mediante el uso de una de las respuestas proporcionadas a continuación. Resulta que ninguno me indicó directamente la solución, pero todos me dieron buenas ideas aquí y allá.
Agregué un manifiesto de aplicación a nuestra aplicación (debería haberlo tenido desde la edad de vista, no sé por qué no estaba allí en el 1er lugar). El manifiesto de la aplicación que agregué al usar VStudio 2008 agrega el archivo -> manifiesto de la aplicación.
En él, se aseguró de que tenemos esto:
<requestedExecutionLevel level=“asInvoker” uiAccess=“false” />
No necesitamos administrador o algo por el estilo, pero al parecer Vista/7 necesidad de conocerla.
Después de eso, el proceso se inició correctamente.
nota: UseShellExecute es cierto por defecto (como se sugiere por algunos), usted tiene que convertir explícitamente en false si eso es lo que quiere.
lo sé, eso no es la cuestión, pero se puede simplificar el '' if' a if (! String.IsNullOrEmpty (argumentos)) '. SCNR – Bobby
¿Qué es 'DBSWIN.EXE'? Según muchos sitios podría ser un problema con una extensión de terceros para IE ... ¿podría la PC estar infectada? – Bobby
@Bobby DBSWIN.EXE es parte del software utilizan estos tipos: http://www.duerrdental.de/en/home-dd/ (en realidad es la siguiente: http://www.duerrdental.de/en/products/ Imaging/dbswin-image-software /) –