How can I launch programmatically (C++) an application from a Windows shortcut (.lnk file)?
how can I launch programmatically an application from a Windows shortcut (.lnk file)?
I tried to use the API ShellExecute and it seems to work. Any caveat?
Thank you.
Here it is a snippet of my current code:
#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 开发者_如何学JAVAExchange (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;
}
I am not sure what you are uncertain about, the behaviour you observe is documented.
The ShellExecute "open" operation, will do whatever the shell does when you "open" the file referenced by the file argument (you can right-click a shortcut and select "Open" explicitly, but that is also the default operation for .lnk, so is the same as a double-click).
"Opening" a short-cut file it will "open" the target, if the target is an executable it will run, if it is a document or data file, it will open in the associated program, or prompt for a program if none associated.
ShellExecute
or CreateProcess
should be able to open link file. If they can't find the associated file and/or the program, you can always use those API and delegate the hard work to "cmd start" or "explorer". E.g. ShellExecute(0, "open", "explorer", linkfile, 0, SW_SHOW);
ShellExecute
should work.
But, ...
int main( int, wchar_t* )
... no compiler I know of supports this signature. Just write:
int main()
Also, for the dignostic messages, just use the FormatMessage
Windows API function, or, if the code is exclusively for Visual C++, use the appropriate support class that's bundled with that compiler.
Cheers & hth.,
精彩评论