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

はい、これが WinXP で動作しないことを確認しました。lnk ファイルのショートカット タブを確認すると、targettype が実際には GUID (指定されたネットワーク カードの GUID にマップされる) であることがわかります。

私の推測では、XP で process.start が使用されている場合、必要な GUID 変換がシェルによって適切に処理されていません。Win32 com 相互運用呼び出しを使用してショートカットを開始するなど、XP でショートカットを開始する別の方法を試す必要がある場合があります。関数ヘッダーについては、pinvoke Web サイトを参照してください。

編集: 実際、私は FindExecutable 署名を参照していませんでした 。http: //www.pinvoke.net/default.aspx/shell32.ShellExecute を参照していました。

cmd.exe /k も試しましたが、どちらも機能しません。pinvoke または .bat ファイルは、ブラッドマンのように見える唯一の友達です。

于 2009-07-07T23:23:12.543 に答える
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 に答える
0

前述のように、ショートカットのターゲットはGUIDであるため、FindExecutableは役に立ちませんが、興味がある場合は、次の署名を使用してください。

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

興味深いことに、「startwifi.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();
    }
}

誰もが理由について推測したいですか?

あなたが本当に、本当に、本当にこれが機能する必要があるなら、あなたは「startwifi.lnk」をバッチファイルに入れてあなたのプログラムからそれを起動することができます、しかしそれは間違いなく恨みです。

于 2009-07-07T23:41:51.007 に答える
0

おそらく、.lnk をシェルで実行するとどうなるでしょうか?

rundll32 を使用しますか?

于 2009-07-07T20:37:09.913 に答える
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 に答える