Getting Shortcuts (.lnk) - Target and Arguments | CodeGuru

Getting Shortcuts (.lnk) – Target and Arguments

Environment: VC6.0 SP2 I saw Michael Taupitz’s idea of creating Links (shortcuts) and I realized that there are many times when we stumble across a link in command prompt mode and we have no idea what this .lnk file points to. Here’s a function I wrote which returns the Target and Arguments of a .lnk […]

Written By
CodeGuru Staff
CodeGuru Staff
Feb 13, 1999
1 minute read
CodeGuru content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More

Environment: VC6.0 SP2

I saw Michael Taupitz’s idea of creating Links (shortcuts) and
I realized that there are many times when we stumble across
a link in command prompt mode and we have no idea what this .lnk
file points to.

Here’s a function I wrote which returns the Target and Arguments
of a .lnk file in a CString. Hope you find it helpful.

CString GetShortcutTarget(const CString LinkFileName)
{
	HRESULT hres;
	CString Link, Temp = LinkFileName;
	Temp.MakeLower();
	if (Temp.Find(“.lnk”)==-1)           //Check if the name ends with .lnk
		Link = LinkFileName + “.lnk”;   //if not, append it
	else
		Link = LinkFileName;
	CString Info;
	Info.Empty();
	IShellLink* psl;
	//Create the ShellLink object
	hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
				IID_IShellLink, (LPVOID*) &psl);
	if (SUCCEEDED(hres))
	{
		IPersistFile* ppf;
		//Bind the ShellLink object to the Persistent File
		hres = psl->QueryInterface( IID_IPersistFile, (LPVOID *) &ppf);
		if (SUCCEEDED(hres))
		{
			WORD wsz[MAX_PATH];
			//Get a UNICODE wide string wsz from the Link path
			MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, Link, -1, wsz, 					    MAX_PATH);
			//Read the link into the persistent file
			hres = ppf->Load(wsz, 0);
			if (SUCCEEDED(hres))
			{
				//Read the target information from the link object
				//UNC paths are supported (SLGP_UNCPRIORITY)
				psl->GetPath(Temp.GetBuffer(1024), 1024, NULL, 				             SLGP_UNCPRIORITY);
				Temp.ReleaseBuffer();
				Info = Temp;
				//Read the arguments from the link object
				psl->GetArguments(Temp.GetBuffer(1024), 1024);
				Temp.ReleaseBuffer();
				Info += ” ” + Temp;
			}
		}
	}
	psl->Release();
	//Return the Target and the Argument as a CString
	return Info;
}

Date Posted: 13/02/99

CodeGuru Logo

CodeGuru covers topics related to Microsoft-related software development, mobile development, database management, and web application programming. In addition to tutorials and how-tos that teach programmers how to code in Microsoft-related languages and frameworks like C# and .Net, we also publish articles on software development tools, the latest in developer news, and advice for project managers. Cloud services such as Microsoft Azure and database options including SQL Server and MSSQL are also frequently covered.

Property of TechnologyAdvice. © 2026 TechnologyAdvice. All Rights Reserved

Advertiser Disclosure: Some of the products that appear on this site are from companies from which TechnologyAdvice receives compensation. This compensation may impact how and where products appear on this site including, for example, the order in which they appear. TechnologyAdvice does not include all companies or all types of products available in the marketplace.