Sample Code The following code shows how to obtain the filename or path and description of a given link file: #include <windows.h> #include <shlobj.h> // GetLinkInfo() fills the filename and path buffer // with relevant information. // hWnd - calling application's window handle. // // lpszLinkName - name of the link file passed into the function. // // lpszPath - the buffer that receives the file's path name. // // lpszDescription - the buffer that receives the file's // description. HRESULT GetLinkInfo( HWND hWnd, LPCTSTR lpszLinkName, LPSTR lpszPath, LPSTR lpszDescription) { HRESULT hres; IShellLink *pShLink; WIN32_FIND_DATA wfd; // Initialize the return parameters to null strings. *lpszPath = '\0'; *lpszDescription = '\0'; // Call CoCreateInstance to obtain the IShellLink // Interface pointer. This call fails if // CoInitialize is not called, so it is assumed that // CoInitialize has been called. hres = CoCreateInstance( &CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &IID_IShellLink, (LPVOID *)&pShLink ); if (SUCCEEDED(hres)) { IPersistFile *ppf; // The IShellLink Interface supports the IPersistFile // interface. Get an interface pointer to it. hres = pShLink->lpVtbl->QueryInterface(pShLink, &IID_IPersistFile, (LPVOID *)&ppf ); if (SUCCEEDED(hres)) { WORD wsz[MAX_PATH]; // Convert the given link name string to a wide character string. MultiByteToWideChar( CP_ACP, 0, lpszLinkName, -1, wsz, MAX_PATH ); // Load the file. hres = ppf->lpVtbl->Load(ppf, wsz, STGM_READ ); if (SUCCEEDED(hres)) { // Resolve the link by calling the Resolve() interface function. // This enables us to find the file the link points to even if // it has been moved or renamed. hres = pShLink->lpVtbl->Resolve(pShLink, hWnd, SLR_ANY_MATCH | SLR_NO_UI); if (SUCCEEDED(hres)) { // Get the path of the file the link points to. hres = pShLink->lpVtbl->GetPath( pShLink, lpszPath, MAX_PATH, &wfd, SLGP_SHORTPATH ); // Only get the description if we successfully got the path // (We can't return immediately because we need to release ppf & // pShLink.) if(SUCCEEDED(hres)) { // Get the description of the link. hres = pShLink->lpVtbl->GetDescription(pShLink, lpszDescription, MAX_PATH ); } } } ppf->lpVtbl->Release(ppf); } pShLink->lpVtbl->Release(pShLink); } return hres; }
The following code shows how to obtain the filename or path and description of a given link file:
#include <windows.h>
#include <shlobj.h> // GetLinkInfo() fills the filename and path buffer
// with relevant information.
// hWnd - calling application's window handle.
//
// lpszLinkName - name of the link file passed into the function.
//
// lpszPath - the buffer that receives the file's path name.
//
// lpszDescription - the buffer that receives the file's
// description.
HRESULT
GetLinkInfo( HWND hWnd,
LPCTSTR lpszLinkName,
LPSTR lpszPath,
LPSTR lpszDescription)
{ HRESULT hres;
IShellLink *pShLink;
WIN32_FIND_DATA wfd; // Initialize the return parameters to null strings.
*lpszPath = '\0';
*lpszDescription = '\0'; // Call CoCreateInstance to obtain the IShellLink
// Interface pointer. This call fails if
// CoInitialize is not called, so it is assumed that
// CoInitialize has been called.
hres = CoCreateInstance( &CLSID_ShellLink,
NULL,
CLSCTX_INPROC_SERVER,
&IID_IShellLink,
(LPVOID *)&pShLink ); if (SUCCEEDED(hres))
{
IPersistFile *ppf; // The IShellLink Interface supports the IPersistFile
// interface. Get an interface pointer to it.
hres = pShLink->lpVtbl->QueryInterface(pShLink,
&IID_IPersistFile,
(LPVOID *)&ppf );
if (SUCCEEDED(hres))
{
WORD wsz[MAX_PATH]; // Convert the given link name string to a wide character string.
MultiByteToWideChar( CP_ACP, 0,
lpszLinkName,
-1, wsz, MAX_PATH );
// Load the file.
hres = ppf->lpVtbl->Load(ppf, wsz, STGM_READ );
if (SUCCEEDED(hres))
{
// Resolve the link by calling the Resolve() interface function.
// This enables us to find the file the link points to even if
// it has been moved or renamed.
hres = pShLink->lpVtbl->Resolve(pShLink, hWnd,
SLR_ANY_MATCH | SLR_NO_UI);
if (SUCCEEDED(hres))
{
// Get the path of the file the link points to.
hres = pShLink->lpVtbl->GetPath( pShLink, lpszPath,
MAX_PATH,
&wfd,
SLGP_SHORTPATH ); // Only get the description if we successfully got the path
// (We can't return immediately because we need to release ppf &
// pShLink.)
if(SUCCEEDED(hres))
{
// Get the description of the link.
hres = pShLink->lpVtbl->GetDescription(pShLink,
lpszDescription,
MAX_PATH );
}
}
}
ppf->lpVtbl->Release(ppf);
}
pShLink->lpVtbl->Release(pShLink);
}
return hres;
}
这段代码可度性不是很好,我找了段代码,跟你提供的差不多,不过个人觉得更好点
http://www.vckbase.com/document/viewdoc/?id=1595恩 谢谢大家了