我正在使用这个基于win32的C程序来改变来自
的快捷方式的目标
[“C:\ Program Files \ YP \ YPseries \ Bin \ myexe.exe”]到
[“C:\ Program Files \ YP \ YPseries \ Bin \ myexe.exe” - 开始UDCDevicePage]
不包括方括号。
然而,当我使用
时
WCHAR newTargetPath [] = L“\”C:\ Program Files \ YP \ YP series \ Bin \ myexe.exe \“ - Start UDCDevicePage”;
在main中,SetPath返回一个E_INVALIDARG错误代码。
如何使用IShellLink :: SetPath函数将参数传递给myexe?
该计划如下:
HRESULT changeLinkTarget(LPCSTR pathLink, LPWSTR newTargetPath)
{
HRESULT hres;
IShellLink* psl;
WCHAR szGotPath[MAX_PATH];
WIN32_FIND_DATA wfd;
// Get a pointer to the IShellLink interface.
hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl);
if (SUCCEEDED(hres))
{
IPersistFile* ppf;
// Get a pointer to the IPersistFile interface.
hres = psl->QueryInterface(IID_IPersistFile, (void**)&ppf);
if (SUCCEEDED(hres))
{
WCHAR wsz[MAX_PATH];
// Ensure that the string is Unicode.
MultiByteToWideChar(CP_ACP, 0, pathLink, -1, wsz, MAX_PATH);
// Load the shortcut.
hres = ppf->Load(wsz, STGM_READ);
if (SUCCEEDED(hres))
{
// Get the path to the link target.
hres = psl->GetPath(szGotPath, MAX_PATH, (WIN32_FIND_DATA*)&wfd, SLGP_SHORTPATH);
if (SUCCEEDED(hres))
{
hres = psl->SetPath(newTargetPath);
hres = ppf->Save(wsz, TRUE); //save changes
}
else
{
// Handle the error
}
}
// Release the pointer to the IPersistFile interface.
ppf->Release();
}
// Release the pointer to the IShellLink interface.
psl->Release();
}
return hres;
}
int _tmain(int argc, _TCHAR* argv[])
{
char linkPath[128] = "C:\\Users\\Public\\Desktop\\YP series.lnk";
WCHAR newTargetPath[] = L"\"C:\\Program Files\\YP\\YP series\\Bin\\myexe.exe\" -Start UDCDevicePage";
CoInitialize(NULL); // initialize the COM subsystem
HRESULT ret = changeLinkTarget(linkPath, newTargetPath);
return 0;
}
答案 0 :(得分:3)
路径通常只是一个exe;你好像试图用一些命令行args将路径设置为可执行文件。尝试使用SetPath只是exe - 没有额外的引号 - 并使用IShellLink::SetArguments()作为命令行参数。 SetPath可能试图通过检查一个带有你传递的完整字符串名称的exe存在来验证param,这很可能导致错误。