Probleme ber Erstellung einer Verknüpfung



  • Hi Leute,

    also ich bin grad am c++ lernen, und beschäftige mich nebenher mit c++/cli.
    Jetzt hab ich ein Problem:
    Textdateien erstellen und in sie schreiben funktioniert mit dem StreamWriter ja sehr einfach, doch jetzt will ich eine Verknüpfung erstellen.
    Gibt es nicht schon eine Klasse im Framework die das für mich übernimmt, oder muss ich per Hand selber eine Methode dafür schreiben?
    Ich hab jetzt schon sehr lange gesucht (google und Forum), finde aber nichts passendes (auch MSDN hat mir nicht viel geholfen).

    Wäre super wenn mir einer da was empfehlen könnte...

    Danke schonmal im voraus!



  • AFAIK gibt es im .NET-Framework dafür nichts...
    Nimm folgendes:
    http://www.codeproject.com/shell/create_shortcut.asp



  • Danke erstmal für den Link.

    Durch den Code steige ich leider (noch) nicht durch. Nach kopieren bekomme ich logischerweise einen Berg Fehlermeldungen.
    1. hunderte unbekannte Datentypen (ist ja irgendwie klar)
    2. einen Haufen von fehlenden Semikolonen (was ist denn das Plural von Semikolon?)

    Naja, eventuell zaubert meine Unwissenheit ein Lächeln auf eure Gesichter, dann hat sich das hier wenigstens gelohnt ^^

    EDIT:
    Ich hab in den Comments gesucht und ein paar Header gesehen die ich wohl includen müsste, aber danach bekomme ich statt 16 Errors gleich 116.
    Vielleicht sollte ichs einfach lassen...

    PS: die Funktionen sind doch natives c++, oder irre ich mich?



  • Tobias W schrieb:

    PS: die Funktionen sind doch natives c++, oder irre ich mich?

    Die kannst Du aber trotzdem in C++/CLI verwenden.

    PS: Du musst folgendes einbinden...

    #include <windows.h>
    #include <objbase.h>
    #include <shlobj.h>
    

    Vielleicht hilft auch folgendes:
    http://www.codeproject.com/useritems/managed_shell_link.asp



  • Das ich natives c++ auch verwenden kann wusste ich, es war nur eine Verständnisfrage.

    Danke für die Infos. Nachdem ich die 3 eingebunden habe, erkennt er trotzdem die Datentypen "CComPtr", "CComQIPtr" und "ipShellLink" nicht.

    Den Text werd ich mir mal am Wochenende durchlesen...



  • Tobias W schrieb:

    Danke für die Infos. Nachdem ich die 3 eingebunden habe, erkennt er trotzdem die Datentypen "CComPtr", "CComQIPtr" und "ipShellLink" nicht.

    Blödes Beispiel... dazu brauchst Du noch die ATL/MFC... aber es geht auch ohne...
    Auf Codeproject gibt es AFAIK auch ein Beispiel ohne ATL/MFC...



  • Aaah, jetzt hab ich auch gesehen das der Artikel unter MFC steht.

    Das andere Beispiel hab ich auch gefunden: http://www.codeproject.com/managedcpp/mcppshortcuts.asp
    Leider weiß ich nicht wie ich eine DLL erstelle. Hab mein VS2005 nur für c++ und dem ganzen Zeug installiert, und finde kein Projekt für DLLs...



  • Du brauchst keine DLL!!! Nimm doch einfach das Beispiel von dort und bau es bei Dir ein!
    (also das was unter "_CreateLink" steht!)



  • Aber für ganz faule hab ich hier ein Beispiel für C++/CLI:

    #include <windows.h>
    #include <Shlobj.h>
    #include <tchar.h>
    #include <vcclr.h>
    #pragma comment(lib, "ole32.lib")
    
    #using <mscorlib.dll> 
    using namespace System; 
    
    HRESULT CreateLinkUnmanaged(LPCWSTR filePath, LPCWSTR lnkPath, LPCWSTR lnkDesc, LPCWSTR workDir)
    {
      HRESULT hrCoInit = CoInitialize(NULL);
      IShellLinkW* psl;
      HRESULT  hres = CoCreateInstance(CLSID_ShellLink, NULL, 
        CLSCTX_INPROC_SERVER, IID_IShellLinkW, (LPVOID*) &psl);
      if (SUCCEEDED(hres))
      {
        psl->SetPath(filePath);
        psl->SetWorkingDirectory(workDir);
        psl->SetDescription(lnkDesc);
        IPersistFile* ppf;
        hres = psl->QueryInterface(IID_IPersistFile,(LPVOID*)&ppf);
        if (SUCCEEDED(hres))
        {
          hres = ppf->Save(lnkPath, TRUE);
          ppf->Release();
        }
        psl->Release();
      }
      if (SUCCEEDED(hrCoInit))
        CoUninitialize();
      return hres;
    }
    
    bool CreateLink(String ^filePath, String ^lnkPath, String ^lnkDesc, String ^workDir)
    {
      pin_ptr<const wchar_t> szFilePath = PtrToStringChars(filePath);
      pin_ptr<const wchar_t> szLnkPath = PtrToStringChars(lnkPath);
      pin_ptr<const wchar_t> szLnkDesc = PtrToStringChars(lnkDesc);
      pin_ptr<const wchar_t> szWorkDir = PtrToStringChars(workDir);
      if (FAILED(CreateLinkUnmanaged(szFilePath, szLnkPath, szLnkDesc, szWorkDir)))
        return false;
      return true;
    }
    
    int main(array<System::String ^> ^args)
    { 
      //CreateLinkUnmanaged(L"f:\\a.xml", L"f:\\a.lnk", L"Keine Ahnung", L"f:\\");
      String ^filePath = "f:\\a.xml";
      String ^lnkPath = "f:\\a.lnk";
      String ^lnkDesc = "Keine Ahnung";
      String ^workDir= "f:\\";
      CreateLink(filePath, lnkPath, lnkDesc, workDir);
      return 0;
    }
    


  • WoW, vielen Dank.

    Wegen der Dll: eventuell hab ichs beim schnellen lesen missverstanden, aber dort stand doch was von Dll. Na egal, jetzt weiß ich es ja besser.

    Nochmals Danke...

    Edit:
    Na jetzt meckert der Linker rum, egal welchen Code ich nehme. Langsam wirds langsam peinlich, ich glaub ich lass es jetzt erstmal...



  • Tobias W schrieb:

    Wegen der Dll: eventuell hab ichs beim schnellen lesen missverstanden, aber dort stand doch was von Dll. Na egal, jetzt weiß ich es ja besser.

    Der Artikel bezog sich ja primäre auf die verwendung von IShellLink aus C# und nicht C++/CLI...

    Tobias W schrieb:

    Na jetzt meckert der Linker rum, egal welchen Code ich nehme.

    Was meckert er denn?



  • Wenn ich es in das Projekt einbinde, egal ob direkt in eine Klasse oder als Header, meckert er mit folgenden Fehlermeldungen: "LNK2001: unresolved external symbol xxx".
    xxx = {CLSID_ShellLink, IID_IPersistFile, IID_IShellLinkW}

    Weitere Fehler resultieren aus diesen dreien (so weit ich das erkennen kann).

    In Forenbeiträgen, welche ich per google gefunden habe, lag das immer an einem falsch angelegten Projekt...


Anmelden zum Antworten