Announcement

Collapse
No announcement yet.

Wie kann ich eine Desktopverknüpfung anlegen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Wie kann ich eine Desktopverknüpfung anlegen

    Guten Morgen,

    ich versuche mit C++ Builder 2006 mehrere Desktopverknüpfungen anzulegen, habe mir im Netz auch schon Beispiele angeschaut. Leider bekomme ich immer eine Fehlermeldung

    [C++ Fehler] InfoSammeln.cpp(283): E2451 Undefiniertes Symbol 'CSIDL_PROGRAMS'
    [C++ Fehler] InfoSammeln.cpp(348): E2451 Undefiniertes Symbol 'IShellLink'
    [C++ Fehler] InfoSammeln.cpp(348): E2451 Undefiniertes Symbol 'psl'
    [C++ Fehler] InfoSammeln.cpp(354): E2451 Undefiniertes Symbol 'LPITEMIDLIST'

    Diese sind aber in der shlobj.hpp definiert. Was mache ich falsch. Für eine schnelle Hilfe wäre ich dankbar. Wie gesagt ich bin in Sachen C++ ein Neuling.

    Gruß Jörg

  • #2
    Originally posted by Jörg Hartmann View Post
    Guten Morgen,

    ich versuche mit C++ Builder 2006 mehrere Desktopverknüpfungen anzulegen, habe mir im Netz auch schon Beispiele angeschaut. Leider bekomme ich immer eine Fehlermeldung

    [C++ Fehler] InfoSammeln.cpp(283): E2451 Undefiniertes Symbol 'CSIDL_PROGRAMS'
    [C++ Fehler] InfoSammeln.cpp(348): E2451 Undefiniertes Symbol 'IShellLink'
    [C++ Fehler] InfoSammeln.cpp(348): E2451 Undefiniertes Symbol 'psl'
    [C++ Fehler] InfoSammeln.cpp(354): E2451 Undefiniertes Symbol 'LPITEMIDLIST'

    Diese sind aber in der shlobj.hpp definiert. Was mache ich falsch. Für eine schnelle Hilfe wäre ich dankbar. Wie gesagt ich bin in Sachen C++ ein Neuling.

    Gruß Jörg
    Guten Morgen Jörg,

    ich bin selber noch ein totaler C++ Neuling aber mir sieht das so aus als ob du die "shlobj.hpp" nicht mit einer #include-Anweisung in dein Projekt eingebunden hast. (z. B. so #include <shlobj.hpp>)

    Ansonsten kannst du - wenn du die Datei deinem Projekt über "Projekt->Dem Projekt hinzufügen..." hinzugefügt hast - die Datei auch auf folgendem Weg einschliessen. "Datei->Unit Header einschließen..."

    Naja das ist was mir da einfallen würde

    Gruß
    Rudi
    Lerne aus den fehlern Anderer! Du hast nicht die Zeit sie selbst zu machen.

    Comment


    • #3
      Versuch mal

      Projekt->Optionen->Verzeichisse/Bedingungen dort unter Bedingungen NO_WIN32_LEAN_AND_MEAN eintragen.
      Christian

      Comment


      • #4
        Danke Christian,

        hat geklappt, keine Fehlermeldung mehr, nun legt er aber den Schortcut nicht an ich habe folgenden Code

        TShortcutCfg sShortcut;
        sShortcut.slDestFile = sZiel+"\\VMenuScan.exe";
        sShortcut.slLnkDir = sZiel+"\\VMenuScan.exe";
        sShortcut.slShortcutName = "VMenu VScan";
        CreateShortcut(&sShortcut, CSIDL_PROGRAMS);

        und benutze diese Funktion :

        bool TFmInfoSammeln::CreateShortcut(TShortcutCfg* sCfg, int ilFolder)
        {
        char cBuf[MAX_PATH];
        bool blRetVal = true; // Rückgabewert
        wchar_t wsz [MAX_PATH]; // Buffer für Unicode String
        IShellLink *psl;
        AnsiString slShortcutFile;

        if(ilFolder >= 0)
        {
        // Shortcut-Verzeichnis bestimmen und den Namen der LNK-Datei erzeugen
        LPITEMIDLIST pidl;
        SHGetSpecialFolderLocation(0, ilFolder, &pidl);
        SHGetPathFromIDList(pidl, cBuf);
        if(DirectoryExists(AnsiString(cBuf)))
        {
        slShortcutFile = AnsiString(cBuf) + "\\" + sCfg->slShortcutName + ".lnk";
        slShortcutFile.WideChar(wsz, MAX_PATH);
        }
        else blRetVal = false;
        }
        else if(DirectoryExists(sCfg->slLnkDir))
        {
        slShortcutFile = IncludeTrailingBackslash(sCfg->slLnkDir) +
        sCfg->slShortcutName + ".lnk";
        slShortcutFile.WideChar(wsz, MAX_PATH);
        }
        else blRetVal = false;

        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;

        // Zeiger auf IPersistFile-Interface (zum Speichern der
        // Verknüpfung) besorgen
        blRetVal = psl->QueryInterface(IID_IPersistFile, (void **)&ppf) >= 0;
        if(blRetVal)
        {
        // Zieldatei der Verknüpfung setzen
        if(sCfg->slDestFile != EmptyStr)
        blRetVal = psl->SetPath(sCfg->slDestFile.c_str()) >= 0;

        // Übergabeparameter der Verknüpfung setzen
        if(blRetVal && sCfg->slArguments != EmptyStr)
        blRetVal = psl->SetArguments(sCfg->slArguments.c_str()) >= 0;

        // Icon zuweisen:
        if(blRetVal && sCfg->slIconFile != EmptyStr &&
        FileExists(sCfg->slIconFile))
        psl->SetIconLocation(sCfg->slIconFile.c_str(), sCfg->ilIconIndex);

        // Arbeitsverzeichnis für die Verknüpfung zuweisen:
        if(blRetVal && sCfg->slWorkingDir != EmptyStr)
        psl->SetWorkingDirectory(sCfg->slWorkingDir.c_str());

        // Kommentar für die Verknüpfung zuweisen
        // (Kommentar ist meines Wissens nur im Eigenscharten-
        // Dialog der Verknüpfung unter NT sichtbar)
        if(blRetVal && sCfg->slDescription != EmptyStr)
        psl->SetDescription(sCfg->slDescription.c_str());

        // Hotkey zuweisen:
        if(blRetVal && sCfg->wlHotKey != 0)
        psl->SetHotkey(sCfg->wlHotKey);

        // Fenster-Modus zuweisen:
        if(blRetVal && sCfg->ilShowCmd != 0)
        psl->SetShowCmd(sCfg->ilShowCmd);

        // Verknüpfung speichern
        if(blRetVal) blRetVal = ppf->Save (wsz, TRUE) >= 0;

        // Zeiger auf IPersistFile freigeben
        ppf->Release ();
        }
        // Zeiger auf IShellLink freigeben
        psl->Release ();
        }
        // COM-Bibliothek freigeben
        CoUninitialize();
        }
        }
        return blRetVal;
        }

        Habe ich irgendetwas falsch gemacht. Hat jemand ein anderes Beispiel. Danke noch mal für eure Hilf.

        Gruß Jörg

        Comment


        • #5
          Sorry, aber wer soll den Code hier im Trockenen durchgehen??

          Gibt es Fehler?
          Was gibt der bool aus

          bool TFmInfoSammeln::CreateShortcut

          zurück, tatsächlich true?? Wenn nicht, wann wird false daraus?




          Debugge das Programm Schritt für Schritt durch.

          Habe zu Hause eine Komponente die funktioniert. kann sie dir ggf. heute Abend senden. Habe sie von hier (welche weiss ich nicht mehr):

          http://www.torry.net/quicksearchd.ph...tcut&Title=Yes
          Zuletzt editiert von Christian Marquardt; 15.08.2007, 10:19.
          Christian

          Comment


          • #6
            Da du das Programm von Bytes & More hast???

            sollte es eigentlich gehen....

            Prüfe mal sZiel und wie der zusammengesetzte String aussehen würde

            Und in erster Linie dann auch die Hinweise lesen und beachten

            // Das Zielverzeichnis für die Verknüpfung kann ebenfalls in der slLnkDir-
            // Membervariablen der TShortcutCfg als Pfad definiert werden. In diesem
            // Fall muss der Wert von ilFolder auf -1 gesetzt werden.
            Christian

            Comment


            • #7
              Originally posted by Christian Marquardt View Post
              Da du das Programm von Bytes & More hast???

              sollte es eigentlich gehen....

              Prüfe mal sZiel und wie der zusammengesetzte String aussehen würde

              Und in erster Linie dann auch die Hinweise lesen und beachten

              // Das Zielverzeichnis für die Verknüpfung kann ebenfalls in der slLnkDir-
              // Membervariablen der TShortcutCfg als Pfad definiert werden. In diesem
              // Fall muss der Wert von ilFolder auf -1 gesetzt werden.
              War ein dummer Fehler statt CSIDL_PROGRAMS musste ich CSIDL_COMMON_DESKTOPDIRECTORY eintragen jetzt läuft alles, danke für eure Hilfe

              Comment

              Working...
              X