【发布时间】:2011-05-02 08:54:26
【问题描述】:
我正在尝试从 .NET 3.51 启动一个应用程序(操作系统、我的应用程序和我要启动的应用程序都是 32 位)。
启动进程的代码用于其他应用程序,但有一个让我们头疼。如果我们“双击”应用程序的图标,它会按预期工作,这意味着它可以作为计算机中的应用程序正常工作。直接双击.exe也可以。
操作系统是 Windows 7 32Bits(家庭版和/或专业版)。
我们的 .NET 应用程序是用 x86 编译的,以避免出现问题。
启动“进程”的代码位于我们制作的 DLL(也是 32 位)中,基本上它是一个简单的 DLL,包含一些“通用代码”、通用方法、函数和我们在整个过程中使用的东西代码。其中一种方法如下所示:
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;
}
我不知道这个方法是谁写的,但它已经在不同的应用程序上工作了大约六年,因此我认为它“没问题”。但是,我们有一个客户的软件在通过该参数时无法启动。
参数是:
- process 是使用简单的“new Process();”创建的 System.Diagnostics.Process;
- path 是 .exe “c:/path/to/my.exe” 的完整路径。
- enableRaisingEvents 为假
- windowStyle 已最大化(但已尝试其他)。
它给出了一个糟糕的消息框……我很高兴地让它永垂不朽。它是西班牙语,但翻译应该很容易:
上面写着:
应用程序错误 程序 (0x0eedfade) 发生意外异常...
谷歌搜索 0x0eedfade 给出的奇怪结果看起来很吓人,但事实是,如果我转到我尝试启动的 .exe 并双击它,它会完美运行。
记录:如果我尝试启动其他东西(例如:Notepad.exe、Adobe Acrobat Reader),它可以工作,但是 Firefox 无法打开并且不会'不显示错误。
这种“有些有效,有些无效”的行为让我相信 Windows 7 安全机制或类似的问题可能存在我不知道的问题。
我错过了什么或做错了什么?
更新:好的;我得到了软件的副本。这是一个凌乱的软件,但它可以工作。现在我可以调试了,我看到程序在使用我的FireUpProcess 方法启动时出现错误。
按照建议,我添加了 WorkingDirectory 代码,但代码如下:
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:
这意味着,“程序无法启动,因为 ddip.dll 丢失...尝试重新安装 bla bla”。
问题是,如果我从命令行执行相同的@path,程序会完美打开:
这将打开程序。如果我单击位于“程序”菜单中的“快捷方式”,也会发生同样的情况。该快捷方式中没有任何参数,它是对可执行文件的简单调用。
所以现在的问题是:我的代码和其他方法有什么区别?
一定有一些不同的东西导致我的进程无法启动。
有什么想法吗?
更新和解决方案
我通过使用以下提供的答案之一使其工作。事实证明,没有人直接向我指出解决方案,但他们都在这里和那里给了我很好的想法。
我在 我们的 应用程序中添加了一个应用程序清单(应该在 vista 时代就拥有它,不知道为什么一开始就没有它)。我使用 VStudio 2008 添加文件 -> 应用程序清单添加的应用程序清单。
在里面,我确定我们有这个:
<requestedExecutionLevel level=“asInvoker” uiAccess=“false” />
我们不需要管理员或类似的东西,但显然 Vista/7 需要知道它。
添加后,进程正确启动。
注意:UseShellExecute 默认为 true(如某些人所建议的那样),如果您需要,您必须明确将其设置为 false。
【问题讨论】:
-
我知道,这不是问题,但您可以将
if简化为if ( !String.IsNullOrEmpty(arguments) )。 SCNR -
什么是
DBSWIN.EXE?根据许多网站的说法,这可能是 IE 的第 3 方扩展的问题……PC 会被感染吗? -
@Bobby DBSWIN.EXE 是这些家伙使用的软件的一部分:duerrdental.de/en/home-dd(实际上是这个:duerrdental.de/en/products/imaging/dbswin-imaging-software)
-
@Bobby 是的,我刚刚注意到,感谢您指出这一点。这段代码来自 .NET 1.0 或 1.1,并且“多年来”没有受到任何影响,所以上帝知道还有哪些其他“未优化”的东西。
-
恶意软件/病毒扫描是否带来了什么?
标签: c# .net windows-7 system.diagnostics