Programmieren mit C++

Visual C++

Oberflächen

Dateilinks erzeugen und auslesen

Wie kann man mit möglichst wenig Aufwand aus einer eigenen Anwendung heraus einen Dateilink erzeugen?

Frage

Für das Erzeugen eines Dateilinks sind im wesentlichen drei Schritte notwendig. Zunächst muß das COM-Interface initialisiert werden, was über CoInitialize() und CoCreateInstance() erfolgt.

Lösung

CoInitialize(NULL); 
 
hres = CoCreateInstance(
            CLSID_ShellLink, NULL, 
            CLSCTX_INPROC_SERVER,
            IID_IShellLink, (LPVOID*) &psl);

Ist dieser Schritt gelungen, können der Programmpfad und die Beschreibung sowie die übrigen Parameter gesetzt werden. Das Durchschreiben auf Festplatte muß jedoch über ein IPersistFile-Interface erfolgen, das zunächst über QueryInterface() beschafft werden muß.

hres = psl->QueryInterface(IID_IPersistFile, 
                           (LPVOID *) &ppf);

Anschließend kann die Datei mit dem nachfolgenden Aufruf gespeichert werden.

 hres = ppf->Save(, TRUE);

Damit diese Aufrufe nicht immer wieder neu komplett eingetippt werden müssen, kann man das ganze zu einer Methode zusammenfassen, die einen Link über das IShellLink-Interface erzeugt.

Die Methode CreateLink() übergibt im Parameter strPathObj den Namen des Objekts mit seinem vollständigen Pfad. strPathLink zeigt auf den Pfad, in dem die Datei mit dem Link abgelegt werden soll, während strDesc die Beschreibung der Datei enthält, die unter dem Symbol des Links angezeigt wird.

COM-Interface initialisieren

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.

Methode CreateLink





Sachgebiet


© 2009-2012 by Alojado Publishing. Alle Rechte vorbehalten. Ausgewiesene Marken gehören ihren jeweiligen Eigentümern.
Mit der Benutzung dieser Seite erkennen Sie die Nutzungsbedingungen und die Datenschutzerklärung an. Der Betreiber übernimmt keine Haftung für den Inhalt verlinkter externer Internetseiten.
Seite erzeugt 2012-05-20 01:32:40 von textarchiv.alojado.de