Login-Item entfernen

  • Login-Item entfernen

    Hallo,

    ich benutze die Bibliothek aus diesem Beispiel von der Apple-Website, um mein Programm den Login Items zuzufügen und es zu entfernen. Letzteres kriege ich nicht hin, weil ich nicht weiss, wie ich an den entsprechenden Index komme. Hier ist mein Code:



    Quellcode

    1. CFArrayRef items;
    2. CFIndex itemCount;
    3. CFIndex itemIndex;
    4. OSStatus status;
    5. CFDictionaryRef dictRef;
    6. char * value;
    7. NSURL * url = [NSURL fileURLWithPath:[[NSWorkspace sharedWorkspace] fullPathForApplication:@"MyApp"]];
    8. items = NULL;
    9. status = LIAECopyLoginItems(&items);
    10. if (status == noErr) {
    11. itemCount = CFArrayGetCount(items);
    12. for(itemIndex = 0; itemIndex < itemCount; itemIndex++) {
    13. dictRef = (CFDictionaryRef) CFArrayGetValueAtIndex(items,itemIndex);
    14. value = (char *)CFDictionaryGetValue(dictRef,kLIAEURL);
    15. NSLog([NSString stringWithUTF8String:value]);
    16. if (strcmp(value,[[url absoluteString] UTF8String]) == 0) {
    17. status = LIAERemove(itemIndex);
    18. NSLog(@"status: %d\n",status);
    19. break;
    20. }
    21. }
    22. }
    Alles anzeigen


    value ist nicht NULL, aber hat auch keinen gescheiten wert... Was mache ich falsch?

    Gruss
    daniel
    There will always be skeptics.
    There will always be disbelievers.
    And there will always be Apple to prove them wrong.
  • Du bekommst eine CFStringRef, also müsste ein Cast den String bringen

    NSString *val = (NSString *) CFDictionaryGetValue(dictRef,kLIAEURL);

    Quellcode

    1. value = (char *)CFDictionaryGetValue(dictRef,kLIAEURL);
    2. NSLog([NSString stringWithUTF8String:value]);


    wird wohl den ganzen Speicher den die CFStringRef belegt als utf8 interpretieren und das wird mehr sein als die rohdaten
    Seminare, Artikel, Code. ObjectiveCeeds - alles für die Apfelzucht.
  • NSLog von value gibt aus (für jedes Login Item):
    2007-05-23 15:42:17.082 java[1505] `0

    unabhängig vom encoding (utf8, ascii,macroman,nextstep,isolatin1)
    There will always be skeptics.
    There will always be disbelievers.
    And there will always be Apple to prove them wrong.
  • Quellcode

    1. CFArrayRef items;
    2. CFIndex itemCount;
    3. CFIndex itemIndex;
    4. OSStatus status;
    5. CFDictionaryRef dictRef;
    6. //char * value;
    7. //NSURL * url = [NSURL fileURLWithPath:[[NSWorkspace sharedWorkspace] fullPathForApplication:@"MyApp"]];
    8. items = NULL;
    9. status = LIAECopyLoginItems(&items);
    10. if (status == noErr) {
    11. itemCount = CFArrayGetCount(items);
    12. for(itemIndex = 0; itemIndex < itemCount; itemIndex++) {
    13. dictRef = (CFDictionaryRef) CFArrayGetValueAtIndex(items,itemIndex);
    14. NSString *value = (NSString *)CFDictionaryGetValue(dictRef,kLIAEURL);
    15. NSLog(@"%@", value);
    16. //if (strcmp(value,[[url absoluteString] UTF8String]) == 0) {
    17. // status = LIAERemove(itemIndex);
    18. // NSLog(@"status: %d\n",status);
    19. // break;
    20. //}
    21. }
    22. }
    Alles anzeigen

    so gehts.

    Den check auf den Pfad der gesuchten App hab ich mal rausgenommen, Nebensache.

    Einen CFString wandelst du per cast in NSString. Zwar ist es schon richtig, daß CF und NSString utf8 verwenden, aber die Referenz auf den CFString zeigt nicht einfach auf die Rohdaten des Strings, sonden auf das ganze "Objekt" im Speicher.

    EDIT: Du könntest rein theoretisch auch frühr zu Cocoa wechseln.

    NSArray *cocoaItems = (NSArray *)items;
    Seminare, Artikel, Code. ObjectiveCeeds - alles für die Apfelzucht.
  • So, Problem gelöst. :) Dein Cast auf NSString hat indirekt geholfen. Damit habe ich bei der Ausgabe eine Exception bekommen, aus der hervorging, dass das zurückgegebene Objekt vom Typ NSURL ist :)

    Jetzt nur noch eine Frage: Kann ich zwei NSURL-Objekte direkt mit isEqual vergleichen oder muss ich über einen String geben?

    Gruss
    daniel
    There will always be skeptics.
    There will always be disbelievers.
    And there will always be Apple to prove them wrong.
  • Also, bei mir funktioniert

    Quellcode

    1. NSURL *val = (NSURL *) CFDictionaryGetValue(dictRef,kLIAEURL);
    2. if ([val isEqualTo:url]) {
    3. status = LIAERemove(itemIndex);
    4. NSLog(@"status: %d\n",status);
    5. break;
    6. }


    Bleibt die Frage, ob ich davon ausgehen kann, dass es immer funktioniert...

    Der Cast selber hatte auch keine Probleme gemacht, sondern die Ausgabe mit NSLog.
    There will always be skeptics.
    There will always be disbelievers.
    And there will always be Apple to prove them wrong.