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