Как программно (C ++) запустить приложение из ярлыка Windows (файл .lnk)? - PullRequest
0 голосов
/ 10 декабря 2010

как я могу программно запустить приложение из ярлыка Windows (файл .lnk)?

Я пытался использовать API ShellExecute, и, похоже, он работает.Любое предостережение?

Спасибо.

Вот фрагмент моего текущего кода:

#include <windows.h>

#include <map>
#include <string>
#include <iostream>

int main( int, char** )
{
   std::map< int, std::wstring > errors;
   errors[0]                      = L"The operating system is out of memory or resources.";
   errors[ERROR_FILE_NOT_FOUND]   = L"The specified file was not found."; 
   errors[ERROR_PATH_NOT_FOUND]   = L"The specified path was not found."; 
   errors[ERROR_BAD_FORMAT]       = L"The .exe file is invalid (non-Microsoft Win32 .exe or error in .exe image).";
   errors[SE_ERR_ACCESSDENIED]    = L"The operating system denied access to the specified file.";
   errors[SE_ERR_ASSOCINCOMPLETE] = L"The file name association is incomplete or invalid.";
   errors[SE_ERR_DDEBUSY]         = L"The Dynamic Data Exchange (DDE) transaction could not be completed because other DDE transactions were being processed.";
   errors[SE_ERR_DDEFAIL]         = L"The DDE transaction failed.";
   errors[SE_ERR_DDETIMEOUT]      = L"The DDE transaction could not be completed because the request timed out.";
   errors[SE_ERR_DLLNOTFOUND]     = L"The specified DLL was not found.";
   errors[SE_ERR_FNF]             = L"The specified file was not found.";
   errors[SE_ERR_NOASSOC]         = L"There is no application associated with the given file name extension. This error will also be returned if you attempt to print a file that is not printable.";
   errors[SE_ERR_OOM]             = L"There was not enough memory to complete the operation.";
   errors[SE_ERR_PNF]             = L"The specified path was not found.";
   errors[SE_ERR_SHARE]           = L"A sharing violation occurred.";

   int ret = reinterpret_cast< int >( ::ShellExecute(0,L"open",L"\"C:\\Documents and Settings\\All Users\\Start Menu\\Programs\\Accessories\\Calculator.lnk\"",0,0,SW_SHOW) );
   const int minimumRetOK = 33;
   if ( ret < minimumRetOK ) {
      if ( errors.count( ret ) ) {
         std::wcout << L"Error " << ret << L" " << errors[ ret ];
      } else {
         std::wcout << L"Error " << ret << L" undocumented error";
      }
   }

    return 0;
}

Ответы [ 3 ]

1 голос
/ 10 декабря 2010

Я не уверен, в чем вы не уверены, наблюдаемое вами поведение задокументировано .

Операция ShellExecute «open» будет делать все, что делает оболочка, когда вы «открываете» файл, на который ссылается аргумент file (вы можете щелкнуть правой кнопкой мыши ярлык и выбрать «Open» явно, но это также операция по умолчанию) для .lnk, так же, как двойной щелчок).

«Открывая» ярлык, он «открывает» цель, если цель - исполняемый файл, который он запускает, если это документ или файл данных, он открывается в связанной программе или запрашивает запрограммируйте, если ни один не связан.

1 голос
/ 10 декабря 2010

ShellExecute должно работать.

Но, ...

int main( int, wchar_t* )

... нет компилятора, который я знаю, поддерживает эту подпись. Просто напишите:

int main()

Кроме того, для служебных сообщений просто используйте функцию FormatMessage Windows API или, если код предназначен исключительно для Visual C ++, используйте соответствующий класс поддержки, который связан с этим компилятором.

Приветствия & hth.,

1 голос
/ 10 декабря 2010

ShellExecute или CreateProcess должны иметь возможность открыть файл ссылки. Если они не могут найти связанный файл и / или программу, вы всегда можете использовать эти API и делегировать тяжелую работу «cmd start» или «explorer». Например. ShellExecute(0, "open", "explorer", linkfile, 0, SW_SHOW);

...