.lnk file format

it's been a while since i've messed with that, but i dug up the following
source code. it has been so long that i can't remember if this was the file
i got working, so someone should test it out (i don't have time). however,
it basically decodes the windows .lnk file format to find out what it is a
shortcut to, and determines if that is a directory (i was going to write a
unix type ln command using .lnk file formats.....). there are 2 files here.
one is a c version, the other is a c++ version.... hope this helps....
                                -donald murray
============================================
c version
============================================
#include <windows.h>
#include <windowsx.h>
#include <objbase.h>
#include <shlobj.h>
#include <stdio.h>
#include <initguid.h>
#include <string.h>
main(int ac, char *av[])
{
ishelllink *psl;
hresult hres;
win32_find_data wfd;
char szgotpath[max_path];
ipersistfile *ppf;
    if (ac != 2)
{
printf("syntax: ln <pathname>\n");
return 0;
}
    hres = coinitialize(null);
if (!succeeded(hres))
printf("could not open the com library\n");
    hres = cocreateinstance(&clsid_shelllink, null, clsctx_inproc_server,
&iid_ishelllink, (lpvoid *)&psl);
if (succeeded(hres))
{
hres = psl->lpvtbl->queryinterface(psl, &iid_ipersistfile, &ppf);
        if (succeeded(hres))
{
word wsz[max_path];
            multibytetowidechar(cp_acp, 0, av[1], -1, wsz, max_path);
            hres = ppf->lpvtbl->load(ppf, wsz, stgm_read);
if (succeeded(hres))
{
hres = psl->lpvtbl->resolve(psl, 0, slr_any_match);
                if (succeeded(hres))
{
strcpy(szgotpath, av[1]);
                   hres = psl->lpvtbl->getpath(psl, szgotpath, max_path,
(win32_find_data *)&wfd, slgp_shortpath );
if (!succeeded(hres))
printf("getpath failed!\n");
                   printf("this points to %s\n", wfd.cfilename);
if (wfd.dwfileattributes & file_attribute_directory)
printf("this is a directory\n");
}
}
else
printf("ipersistfile load error\n");
ppf->lpvtbl->release(ppf);
}
else
printf("queryinterface error\n");
psl->lpvtbl->release(psl);
}
else
printf("cocreateinstance error - hres = %08x\n", hres);
return 0;
}
==================================
c++ version
==================================
#include <windowsx.h>
#include <objbase.h>
#include <shlobj.h>
#include <stdio.h>
#include <initguid.h>
#include <stdlib.h>
#include <io.h>
#include <string.h>
// this program should print out whether the file is a link and where it
// points to and whether it is a directory or not.
//
main(int ac, char *av[])
{
if (ac != 2)
{
printf("syntax: ln <pathname>\n");
return 0;
}
    ishelllink *psl;                            // pointer to ishelllink i/f
hresult hres;
win32_find_data wfd;
char szgotpath[max_path];
    // get pointer to the ishelllink interface.
    hres = cocreateinstance(clsid_shelllink, null, clsctx_inproc_server,
iid_ishelllink, (lpvoid *)&psl);
    if (succeeded(hres))
{
// get pointer to the ipersistfile interface.
        ipersistfile *ppf;
hres = psl->queryinterface(iid_ipersistfile, (lpvoid *)&ppf);
        if (succeeded(hres))
{
word wsz[max_path];
            // ensure string is unicode.
multibytetowidechar(cp_acp, 0, av[1], -1, wsz, max_path);
            // load the shell link
hres = ppf->load(wsz, stgm_read);
if (succeeded(hres))
{
// resolve the link.
                hres = psl->resolve(0, slr_any_match);
//                  ^
// using 0 instead -| of hwnd, as hwnd is only used if
// interface needs to prompt for more information. should use
// hwnd from current console in the long run.
                if (succeeded(hres))
{
strcpy(szgotpath, av[1]);
                    hres = psl->getpath(szgotpath, max_path,
(win32_find_data *)&wfd, slgp_shortpath );
if (!succeeded(hres))
printf("getpath failed!\n");
                    printf("this points to %s\n", wfd.cfilename);
if (wfd.dwfileattributes & file_attribute_directory)
printf("this is a directory\n");
}
}
else
printf("ipersistfile load error\n");
ppf->release();
}
else
printf("queryinterface error\n");
psl->release();
}
else
printf("cocreateinstance error - hres = %08x\n", hres);
return 0;
}