Fehler mit IShellLink



  • Egal was ich tue: Die Fehler bleiben.
    Die Fehler treten auf, wenn ich folgenden Snippet von BytesAndMore anwende:

    bool ReadShortcut(TShortcutCfg* sCfg, AnsiString slFileName)
    {
      bool blRetVal = true;   // Rückgabewert
      wchar_t wsz [MAX_PATH]; // Buffer für Unicode String
      char buf[MAX_PATH];
      IShellLink *psl;
      slFileName.WideChar(wsz, MAX_PATH);
    
      if(blRetVal)
      {
        // COM-Bibliothek initialisieren
        blRetVal = CoInitialize(NULL) == S_OK;
        if(blRetVal)
        {
          // IShellLink Objekt erzeugen
          blRetVal = CoCreateInstance (CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
            IID_IShellLink, (void **)&psl) >= 0;
    
          if(blRetVal)
          {
            IPersistFile *ppf;
    
             // The IShellLink Interface supports the IPersistFile
             // interface. Get an interface pointer to it.
            blRetVal = psl->QueryInterface(IID_IPersistFile, (void **)&ppf) >= 0;
    
            // Zeiger auf IPersistFile-Interface (zum Speichern der
            // Verknüpfung) besorgen
            if(blRetVal)
            {
              // Verknüpfungsdatei laden:
              blRetVal = ppf->Load(wsz, TRUE) >= 0;
    
              // Zieldatei der Verknüpfung lesen
              if(blRetVal)
              {
                // Zieldatei der Verknüpfung lesen:
                psl->GetPath(buf, MAX_PATH, NULL, 0);
                sCfg->slDestFile = AnsiString(buf);
    
                // Übergabeparameter der Verknüpfung lesen
                psl->GetArguments(buf, MAX_PATH);
                sCfg->slArguments = AnsiString(buf);
    
                // Symbolinformationen lesen:
                int ilIndex = 0;
                if(psl->GetIconLocation(buf, MAX_PATH, &ilIndex) == NOERROR)
                {
                  sCfg->slIconFile = AnsiString(buf);
                  sCfg->ilIconIndex = ilIndex >= 0 ? ilIndex : 0;
                }
    
                // Arbeitsverzeichnis der Verknüpfung lesen
                psl->GetWorkingDirectory(buf, MAX_PATH);
                sCfg->slWorkingDir = AnsiString(buf);
    
                // Kommentar für die Verknüpfung lesen
                psl->GetDescription(buf, MAX_PATH);
                sCfg->slDescription = AnsiString(buf);
    
                // Hotkey zuweisen:
                psl->GetHotkey(&sCfg->wlHotKey);
    
                // Fenster-Modus zuweisen:
                psl->GetShowCmd(&sCfg->ilShowCmd);
    
              }
              // Zeiger auf IPersistFile freigeben
              ppf->Release ();
            }
    
            // Zeiger auf IShellLink freigeben
            psl->Release ();
          }
          // COM-Bibliothek freigeben
          CoUninitialize();
        }
        if(blRetVal)
        {
          sCfg->slLnkDir = IncludeTrailingBackslash(ExtractFilePath(slFileName));
          slFileName = ExtractFileName(slFileName);
          sCfg->slShortcutName = slFileName.Length() ? slFileName.
            SubString(1, slFileName.Length()-ExtractFileExt(
            slFileName).Length()) : EmptyStr;
        }
      }
      return blRetVal;
    }
    

    Folgende Header-Einstellungen habe ich schon drin:

    #define NO_WIN32_LEAN_AND_MEAN
    #include "shlobj.hpp"
    #include "filectrl.hpp"
    #include "Desktop.h"
    #include "objbase.h"
    

    Aber trotzdem erhalte ich diese Fehler:

    [C++ Error] Desktop.cpp(47): E2451 Undefined symbol 'IShellLink'
    [C++ Error] Desktop.cpp(47): E2451 Undefined symbol 'psl'
    [C++ Error] Desktop.cpp(57): E2451 Undefined symbol 'CLSID_ShellLink'
    [C++ Error] Desktop.cpp(58): E2451 Undefined symbol 'IID_IShellLink'
    


  • Evtl. noch shobjidl.h 😕



  • Mhh danke... leider erhalte ich ein paar multideklaration Fehler. Die fehlerverursachenden Fehler habe ich ganz vorsichtig auskommentiert. Nun läuft das Programm reibungslos, aber

    AnsiString Datei=Path+"\\"+FoundFile;
    TShortcutCfg *Shortcut;
    bool erfolg=ReadShortcut(Shortcut,Datei); //bis der Laufzeitfehler kommt ist erfolg immer 0
    ReadShortcut(Shortcut,Datei);
    

    es gibt einen Laufzeitfehler aus:

    Project Taskbar.exe raised exception class EAccessViolation with message
    'Access violation at address 00458B60 in module 'Taskbar.exe'. Read of address
    8B004D99'. Process stopped. Use Step or Run to continue.
    


  • Da ich von COM keine Ahnung habe kann ich dir zwar nicht direkt weiterhelfen, aber du kannst auf jeden Fall nicht einfach irgendwelche Zeilen auskommentieren.



  • Wie kann ich dann aber Fehler wegkriegen... Es liegt ja immerhin an den Headern und nicht an mir oder?



  • Diabolo schrieb:

    Wie kann ich dann aber Fehler wegkriegen... Es liegt ja immerhin an den Headern und nicht an mir oder?

    die Header sind OK, also Finger weg, Filectrl.hpp und shlobj.hpp reichen (WIN32_Le..... auch rein)

    Der Fehler liegt sicherlich woanders, an einstellungen von deinem BCB oder so, oder wie auch immer.

    bei mir funzt es einwandfrei


Log in to reply