Не удается запустить PowerPoint из ярлыка меню Пуск в C # - PullRequest
3 голосов
/ 16 декабря 2010

Я пытаюсь запустить программу на основе ярлыка в меню «Пуск».В частности, я пытаюсь запустить powerpoint на основе ярлыка в меню «Пуск».Для этого я использую IWshRuntimeLibrary.

static void Main(string[] args)
{
    string searchTerm = "powerpoint";

    string startMenu = Environment
        .GetFolderPath(Environment.SpecialFolder.CommonStartMenu);

    string shortcutPath = Directory
        .GetFiles(startMenu, "*.lnk", SearchOption.AllDirectories)
        .OrderBy(p => p.Length)
        .First(p => p.ToLower().Contains(searchTerm));

    WshShell shell = new WshShell();

    IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(shortcutPath);

    Console.WriteLine(shortcut.TargetPath); //prints: C:\Windows\Installer\{90140000-0011-0000-0000-0000000FF1CE}\pptico.exe

    Process.Start(shortcut.TargetPath, shortcut.Arguments);
}

Я могу успешно найти ярлык, а также создать объект IWshShortcut.Однако, как только я пытаюсь запустить приложение поддержки ярлыка (через Process.Start (shortcut.TargetPath, shortcut.Arguments)), возникает исключение Win32Exception:

System.ComponentModel.Win32Exception was unhandled
  Message=The specified executable is not a valid application for this OS platform.
  Source=System
  ErrorCode=-2147467259
  NativeErrorCode=193
  StackTrace:
       at System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)
       at System.Diagnostics.Process.Start()
       at System.Diagnostics.Process.Start(ProcessStartInfo startInfo)
       at System.Diagnostics.Process.Start(String fileName, String arguments)
       at Scratch.Program.Main(String[] args) in C:\Users\jhampton\Documents\Visual Studio 2010\Projects\Scratch\Scratch\Program.cs:line 26
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException:

Единственный связанный ответ, который я мог найти, был в этом обсуждение .Мой проект уже создавался как приложение x86

Поскольку это кажется актуальным, вот некоторые сведения о моей системе.Я использую 64-разрядную версию Windows 7 Professional и установил Microsoft Office 2010.Это часть консольного приложения, написанного в Visual Studio 2010, предназначенного для клиентского профиля .NET Framework 4.

В настоящее время я изучаю следующие альтернативные решения:

Код API WindowsПакет: http://code.msdn.microsoft.com/WindowsAPICodePack
Ярлыки без IWshRuntimeLibrary: Как разрешить .lnk в c #

Извините за отсутствие разумных ссылок.Это мой первый пост, и, очевидно, я не могу вставить более одного, используя теги.

1 Ответ

2 голосов
/ 16 декабря 2010

Это должно просто сработать:

Process.Start(shortcutPath);

Вам не нужно открывать lnk, просто попросите Windows выполнить его.За кулисами Process.Start сделает ShellExecute , который знает, как обрабатывать .lnk.

...