HRESULT MyMainClass::CreateLink(
const CString strPathObj,
const CString strPathLink,
const CString strDesc)
{
HRESULT hres;
IShellLink* psl;
CString strMyPath = strPathLink;
Der Aufruf der COM-Initialisierung durch CoInitialize(NULL) wird von der Funktion vorausgesetzt, so daß gleich das COM-Interface erzeugt werden kann.
hres = CoCreateInstance(CLSID_ShellLink, NULL,
CLSCTX_INPROC_SERVER,
IID_IShellLink, (LPVOID*) &psl);
if (SUCCEEDED(hres))
{
IPersistFile* ppf;
psl->SetPath(strPathObj);
psl->SetDescription(strDesc);
hres = psl->QueryInterface( IID_IPersistFile, (LPVOID *) &ppf);
if (SUCCEEDED(hres))
{
Es wird vorausgesetzt, daß der Name der Linkdatei ohne die Erweiterung „.LNK“ übergeben wurde, so daß dieser String von der Funktion automatisch angefügt wird.
strMyPath += ".lnk";
WORD wsz[MAX_PATH];
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, strMyPath, -1,
wsz, MAX_PATH);
Im Anschluß daran können der Link gespeichert und die Interfaces wieder freigegeben werden.
hres = ppf->Save(wsz, TRUE);
if (hres != S_OK )
MessageBox(NULL, "IPersistFile->Save() Fehler",
"Fehler", MB_OK);
ppf->Release();
}
psl->Release();
}
return hres;
}
Das Auslesen eines Links erfolgt analog über die COM-Schnittstelle des IShellLink-Interface. Zu einem vorgegebenen Dateinamen LinkFileName, der den Namen der Linkdatei bezeichnet, liefert die Funktion GetShortcutTarget das Ziel des Links, also die Datei, die ausgeführt werden soll, als Ergebnis zurück. Dem übergebenen Dateinamen wird, wenn nötig, die Erweiterung „.LNK“ hinzugefügt.
CString GetShortcutTarget(
const CString LinkFileName)
{
HRESULT hres;
CString Link, Temp = LinkFileName;
Temp.MakeLower();
if (Temp.Find(".lnk")==-1)
Link = LinkFileName + ".lnk";
else Link = LinkFileName;
Das Funktionsergebnis wird im Cstring-Info gesammelt.
CString Info;
Info.Empty();
Zunächst ist wiederum das Interface zu erzeugen und die Linkdatei über Load() zu laden.
IShellLink* psl;
hres = CoCreateInstance(CLSID_ShellLink, NULL,
CLSCTX_INPROC_SERVER,
IID_IShellLink, (LPVOID*) &psl);
if (SUCCEEDED(hres))
{
IPersistFile* ppf;
hres = psl->QueryInterface(IID_IPersistFile,(LPVOID *) &ppf);
if (SUCCEEDED(hres))
{
WORD wsz[MAX_PATH];
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, Link, -1, wsz,
MAX_PATH);
hres = ppf->Load(wsz, 0);
if (SUCCEEDED(hres))
{
Anschließend können der Anwendungspfad und die Argumente ausgelesen werden.
|