Desktop-Verknüpfung erstellen



  • Hallo Leute,

    Mein Projekt ist nun fast Fertig und ich wollte das er beim ersten Start
    eine Desktop-Verknüpfung setzt.

    Ich habe mich dazu an dem Code von folgender Seite bedient:

    http://www.bytesandmore.de/rad/cpp/snipp/sc03002.php

    leider bekome ich aber immer nur false zurück, also es haut
    nicht hin. Ich muß es nicht unbedingt drinn haben, aber macht schon
    bissel was her und morgen ist Abgabe.

    Weiß einer die Lösung oder ein Hinweis, oder sonst nen kleinen Tip,
    in der Zwischenzeit, experimentiere ich mal weiter um es hin zu bekommen.

    Danke im Vorraus.



  • Ich macjh's so fuer "AUTOSTART- Ordner":

    void CreateShortCut(int SpecialFolder, AnsiString file,
                                 AnsiString Path,AnsiString Description,
                                 AnsiString WorkDir,AnsiString Args)
    {
        // IShellLink allows us to create the shortcut. IPersistFile allows us
        // to save the link to the hard drive.
        IShellLink*   pLink;
        IPersistFile* pPersistFile;
        LPMALLOC      ShellMalloc;
        LPITEMIDLIST  DesktopPidl;
        char DesktopDir[MAX_PATH];
    
        if(FAILED(SHGetMalloc(&ShellMalloc)))
            return;
    
        if(FAILED(SHGetSpecialFolderLocation(NULL, SpecialFolder , &DesktopPidl)))
            return;
    
        if(!SHGetPathFromIDList(DesktopPidl, DesktopDir))
        {
            ShellMalloc->Free(DesktopPidl);
            ShellMalloc->Release();
            return;
        }
    
        ShellMalloc->Free(DesktopPidl);
        ShellMalloc->Release();
    
        // First, we have to initialize the COM library
        if(SUCCEEDED(CoInitialize(NULL)))
        {
            // If CoInitialize doesn't fail, then instantiate an IShellLink object
            // by calling CoCreateInstance.
            if(SUCCEEDED(CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
                                         IID_IShellLink, (void **) &pLink)))
            {
                // if that succeeds, then fill in the shortcut attributes
                pLink->SetPath(Path.c_str());
                pLink->SetDescription(Description.c_str());
                pLink->SetWorkingDirectory(WorkDir.c_str());
                pLink->SetArguments(Args.c_str());
                pLink->SetShowCmd(SW_SHOW);
    
                // Now we need to save the shortcut to the hard drive. The IShellLink
                // object also doubles as an IPersistFile object. Fetch the IPersistFile
                // part of the object by calling QueryInterface.
                if (SUCCEEDED (pLink->QueryInterface(IID_IPersistFile, (void **) &pPersistFile)))
                {
                    // If that succeeds, then call the Save method of the
                    // IPersistFile object to write the shortcut to the desktop.
                    WideString strShortCutLocation(DesktopDir);
                    strShortCutLocation += "\\";
                    strShortCutLocation += file.c_str();
                    pPersistFile->Save(strShortCutLocation.c_bstr(), TRUE);
                    pPersistFile->Release();
                }
                pLink->Release();
            }
    
            // Calls to CoInitialize need a corresponding CoUninitialize call
            CoUninitialize();
        }
    }
    ****************************************
    Im Hauptformular, bei OnDestroy o. ä.:
    
      SLFile->CreateShortCut(CSIDL_STARTUP,"Backup.lnk",Application->ExeName,"Backup Automatic","",Params->Text);
    

    Du muestest CSIDL_DESKTOP oder so aehnlich uebergeben!



  • Altenburger:
    Warum gibst du nicht einfach die Quelle an?



  • Jansen:

    Sorry, aber hatte die URL nicht gefunden. Nur den Code in meiner Komponente.



  • Ich habe den Code von der URL von Jansen probiert, aber da kommt ne Fehlermeldung:

    [C++ Fehler] shobjidl.h(2193): E2238 Bezeichner 'FOLDERSETTINGS' mehrfach deklariert
    [C++ Fehler] shobjidl.h(8095): E2238 Bezeichner 'DESKBANDINFO' mehrfach deklariert
    [C++ Fehler] shlobj.h(1422): E2238 Bezeichner 'FVSHOWINFO' mehrfach deklariert
    [C++ Fehler] shlobj.h(3457): E2238 Bezeichner 'SHELLFLAGSTATE' mehrfach deklariert

    Und um erlich zu sein will ich nicht in dieser Headerdatei rumdoktorn



  • Siehe FAQ unter "shlobj.h-Problem".



  • Hallo Jansen

    #define NO_WIN32_LEAN_AND_MEAN

    hatte ich bereits mit drinn, und auch über Proj.-Optionen probiert
    aber dann kommen halt jedemenge anderer Fehlermeldungen.

    [C++ Fehler] shlobj.h(1439): E2176 Zu viele Typen in der Deklaration
    [C++ Fehler] shlobj.h(1448): E2293 ) erwartet
    [C++ Fehler] shlobj.h(1452): E2175 Zu viele Speicherklassen in der Deklaration
    [C++ Fehler] shlobj.h(1452): E2257 , erwartet
    [C++ Fehler] shlobj.h(1466): E2293 ) erwartet
    [C++ Fehler] shlobj.h(3481): E2175 Zu viele Speicherklassen in der Deklaration
    [C++ Fehler] shlobj.h(3481): E2040 Deklaration nicht ordnungsgemäß abgeschlossen
    [C++ Fehler] ShlObj.hpp(151): E2257 , erwartet
    [C++ Fehler] ShlObj.hpp(243): E2257 , erwartet

    Vermutlich sind diese Dateien bei mir nicht korekt,
    kann man die irgendwo runterladen, oder kann mir
    jemand diese zusenden, damit es halt mit
    #define NO_WIN32_LEAN_AND_MEAN
    funktioniert

    ??



  • Man bin ich Blöd...

    Ich Frage danach ob ich irgendwo die Datei Shlobj.h herbekomme oder
    mir jemand diese zusendet, da meine wohl defekt ist.

    Die ist doch auf der Borland-CD

    Logisch...

    Jetz habe ich die von der CD neu rüber kopiert, und.....

    jetzt geht es..

    Danke noch an alle.


Anmelden zum Antworten