如何从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;
}
答案 0 :(得分:1)
ShellExecute
或CreateProcess
应该可以打开链接文件。如果他们找不到相关文件和/或程序,您可以随时使用这些API并将辛苦工作委托给“cmd start”或“explorer”。例如。 ShellExecute(0, "open", "explorer", linkfile, 0, SW_SHOW);
答案 1 :(得分:1)
我不确定你不确定的是什么,你观察到的行为是documented。
ShellExecute“打开”操作,将执行shell“打开”文件参数引用的文件时执行的操作(您可以右键单击快捷方式并明确选择“打开”,但这也是默认操作对于.lnk,所以与双击相同)。
“打开”一个快捷方式文件,它将“打开”目标,如果目标是可运行的目标,如果它是文档或数据文件,它将在相关程序中打开,或者提示输入程序,如果没有关联。
答案 2 :(得分:1)
ShellExecute
应该有用。
但是,......
int main( int, wchar_t* )
...我知道没有编译器支持此签名。只需写下:
int main()
此外,对于dignostic消息,只需使用FormatMessage
Windows API函数,或者,如果代码专门用于Visual C ++,请使用与该编译器捆绑在一起的相应支持类。
干杯&amp;第h。,