I am using this win32 based C program to change the target of a shortcut from
[“C:\Program Files\YP\YPseries\Bin\myexe.exe”] to
[“C:\Program Files\YP\YPseries\Bin\myexe.exe” -Start UDCDevicePage]
excluding the square braces.
However when i use
WCHAR newTargetPath[] = L”\”C:\Program Files\YP\YP series\Bin\myexe.exe\” -Start UDCDevicePage”;
in main, SetPath returns an E_INVALIDARG error code.
How can i pass an argument to myexe using IShellLink::SetPath function?
The program is given below:
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;
}
Paths are usually just an exe; you seem to be trying to set the path to be an executable with some command-line args. Try instead using SetPath to just the exe – without the extra quotes – and use IShellLink::SetArguments() for the command-line parameters. SetPath is perhaps attempting to validate the param by checking that an exe with the name of the full string you pass it exists, which is likely failing causing the error.