3

我在 C:\Temp 文件夹中为 Wifi 网络连接创建了一个快捷方式(特殊类型的快捷方式)

我正在尝试使用 C# 启动它

System.Diagnostics.Process myProc = new System.Diagnostics.Process();
myProc.StartInfo.FileName = "C:\\Temp\\wifi.lnk";
myProc.Start();

当我运行上面的代码时,什么都没有发生。当我设置“UseShellExecutable = False”和“RedirectStandardError = True”时,我收到一个异常提示“指定的可执行文件不是有效的 Win32 应用程序”

我试图通过调用“FindExecutable()”方法来查找可执行文件,但它返回空字符串。

任何帮助是极大的赞赏。

4

5 回答 5

1

您的路径中缺少一个冒号。我在桌面上创建了快捷方式,然后运行以下命令,它按预期工作......

System.Diagnostics.Process myProc = new System.Diagnostics.Process();
myProc.StartInfo.FileName = @"C:\Users\scott\Desktop\wifi.lnk";
myProc.Start();
于 2009-07-07T20:54:28.193 回答
1

是的,我已经确认这在 WinXP 上不起作用。如果查看lnk文件的快捷方式选项卡,会发现targettype实际上是一个GUID(映射到指定网卡的guid)。

我的猜测是,当在 XP 下使用 process.start 时,shell 没有正确处理必要的 guid 翻译。您可能必须尝试在 XP 下启动快捷方式的不同方式,例如使用 Win32 com 互操作调用来启动快捷方式。查看 pinvoke 网站以获取函数标题。

编辑:其实我不是指 FindExecutable 签名,我指的是 http://www.pinvoke.net/default.aspx/shell32.ShellExecute

还尝试了 cmd.exe /k ,但这也不起作用。pinvoke 或 .bat 文件是你唯一的朋友,似乎是布拉德曼。

于 2009-07-07T23:23:12.543 回答
0
using System;
// add a reference to the com component
// "Windows Script Host Object Model" for IWshRuntimeLibrary
using IWshRuntimeLibrary;

namespace ConsoleApplicationCSharp
{  
  public class Foo
  {
    public static void Main(string[] args)
    {
      string pathLnk = @"C:\Users\scott\Desktop\wifi.lnk";

      WshShell shell = new WshShell();
      IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(pathLnk);
      Console.WriteLine("target path: " + shortcut.TargetPath);
      Console.WriteLine("argument: " + shortcut.Arguments);
      Console.WriteLine("working dir: " + shortcut.WorkingDirectory);
      return;

    }
  }
}

此代码是否能够从您的 wifi.lnk 中提取信息?

于 2009-07-07T21:13:42.447 回答
0

也许如果你执行 .lnk?

使用rundll32?

于 2009-07-07T20:37:09.913 回答
0

如前所述,快捷方式的目标是 GUID,因此 FindExecutable 将无法提供帮助,但如果您有兴趣,这里是它的签名:

    [DllImport("shell32.dll")]
    static extern IntPtr FindExecutable(string file, string directory, [Out] StringBuilder result);

有趣的是,运行“start wifi.lnk”可以在命令提示符下运行,但这不会:

class Program
{        
    static void Main(string[] args)
    {
        Process p = new Process();
        p.StartInfo.Arguments = "/c start wifi.lnk";
        p.StartInfo.FileName = "cmd.exe";
        p.StartInfo.WorkingDirectory = @"C:\Documents and Settings\Administrator\Desktop";
        p.Start();
    }
}

任何人都想冒险猜测为什么?

如果你真的,真的,真的需要这个工作,你可以把“start wifi.lnk”放到一个批处理文件中,然后从你的程序中启动它,但这绝对是一个杂项。

于 2009-07-07T23:41:51.007 回答