Verknüpfung erstellen



  • Hallo !

    Mit unten stehendem Code versuche ich eine Verknüpfung zu erstellen. Mein Rückgabewert ist True aber es ist keine Verknüpfung vorhanden, d.h. es wurde keine Verknüpfung erstellt. Weiß jemand woran das liegen kann ?

    //----- Typedefs -------------------------------------------------------
    
    typedef IShellLink *LPSHELLLINK;
    
    typedef IPersistFile *LPPERSISTFILE;
    
    /**********************************************************************/
    
    /* CreateShortcut : Hilfsfunktion zur Erzeugung eines Shortcuts       */
    
    /*--------------------------------------------------------------------*/
    
    /* Parameter :    pszPath       - Pfad, auf den der Shortcut verweist */
    
    /*                pszArguments  - Programmargumente                   */
    
    /*                pszLocation   - Wo und unter welchem Namen soll der */
    
    /*                                Shortcut gespeichert werden?        */
    
    /*                pszWorkingDir - Arbeitsverzeichnis                  */
    
    /*                        pszIcon          - Icon                                             */
    
    /*                nCmdShow      - Wie soll das Applikationsfenster    */
    
    /*                                nach dem Start dargestellt werden?  */
    
    /* Rückgabewert : TRUE  - Shortcut wurde erzeugt                      */
    
    /*                FALSE - Fehler                                      */
    
    /**********************************************************************/
    
    BOOL CreateShortcut( LPSTR pszPath,
    
                         LPSTR pszArguments,
    
                         LPSTR pszLocation,
    
                         LPSTR pszWorkingDir,
    
                         LPSTR pszIcon,
    
                         int   nCmdShow )
    
    {
    
      LPSHELLLINK pShellLink;
    
      HRESULT hrCoInit;                        // OLE-Installations-Ergebnis
    
      HRESULT hr;                             // Ergebnis der Objektmethoden
    
      hrCoInit = CoInitialize( NULL );                 // OLE initialisieren
    
      hr = CoCreateInstance(   CLSID_ShellLink, // ShellLink-Objekt erzeugen
    
                               NULL,
    
                               CLSCTX_INPROC_SERVER,
    
                               IID_IShellLink,
    
                               (void**)&pShellLink );
    
      if( SUCCEEDED( hr ) )
    
      {
    
        LPPERSISTFILE pPersistFile;
    
        // PersistFile Interface ermitteln   -------------------------------
    
        if(SUCCEEDED(pShellLink->QueryInterface(IID_IPersistFile,(void**)&pPersistFile)))
    
        {
    
          WORD wsz[ MAX_PATH ];
    
          // Programmpfad setzen  ------------------------------------------
    
          hr = pShellLink->SetPath(pszPath);
    
          // Argumente setzen ----------------------------------------------
    
          if( SUCCEEDED( hr ) )
    
            hr = pShellLink->SetArguments(pszArguments);
    
          // Arbeitsverzeichnis setzen -------------------------------------
    
          if( SUCCEEDED( hr ) )
    
            hr = pShellLink->SetWorkingDirectory(pszWorkingDir );
    
          // Icon setzen ---------------------------------------------------
    
          if (SUCCEEDED(hr))
    
              hr = pShellLink->SetIconLocation(pszIcon,0);
    
          // ShowCommand setzen --------------------------------------------
    
          if( SUCCEEDED( hr ) )
    
            hr = pShellLink->SetShowCmd(nCmdShow );
    
          // Pfad setzen, an dem Shortcut abgespeichert werden soll  -------
    
          if( SUCCEEDED( hr ) )
    
          {
    
            MultiByteToWideChar( CP_ACP, 0, pszLocation, -1, wsz, MAX_PATH);
    
            hr = pPersistFile->Save( wsz, TRUE );
    
            hr = pPersistFile->SaveCompleted( wsz );
    
          }
    
    //    *************************************
    
    //
    
    //      hr = pPersistFileRelease( );
    
    //
    
    //    *************************************
    
        }
    
        pShellLink->Release( );
    
      }
    
      // Wenn OLE hier initialisiert wurde, muß es auch hier wieder de-
    
      // installiert werden.
    
      if( SUCCEEDED( hrCoInit ) ) CoUninitialize();
    
      return SUCCEEDED( hr );
    
    }
    


  • Michael__W. schrieb:

    hr = pPersistFile->Save( wsz, TRUE );
    
    hr = pPersistFile->SaveCompleted( wsz );
    

    Und was gibt IPersistFile::Save zurück? Diese Rückgabe wird bei Dir leider komplett irgnoriert.



  • -King- schrieb:

    Und was gibt IPersistFile::Save zurück? Diese Rückgabe wird bei Dir leider komplett irgnoriert.

    Ja sehe ich auch gerade. IPersistFile->Save(wsz, TRUE); gibt einen Fehlercode(?)

    -2147024891
    

    zurück.
    Weiß jemand wofür der Error Code steht ?



  • Michael__W. schrieb:

    Ja sehe ich auch gerade. IPersistFile->Save(wsz, TRUE); gibt einen Fehlercode(?)

    -2147024891
    

    zurück.
    Weiß jemand wofür der Error Code steht ?

    Ja, ich weiß das:
    -2147024891 = 0x80070005

    winerror.h schrieb:

    //
    // MessageId: E_ACCESSDENIED
    //
    // MessageText:
    //
    //  General access denied error
    //
    #define E_ACCESSDENIED                   _HRESULT_TYPEDEF_(0x80070005L)
    


  • So. Danke für die Fehlernummer. 😉

    Problem hat sich jetzt erledigt. Und zwar hat sich ein Leerzeichen durch einen API Aufruf SHGetSpecialFolder eingeschlichen, was zu einer ungültigen Pfadangabe in pszLocation führte. Jetzt klappt alles. Wie schön.

    Danke nochmals


Anmelden zum Antworten