Wie kann ich eine Mac OS Component Manager-Komponente erhalte für andere Prozesse sichtbar zu sein?

StackOverflow https://stackoverflow.com/questions/1855049

  •  13-09-2019
  •  | 
  •  

Frage

Das ist ein bisschen esoterisch, aber es hat hier ein paar Leute, die wissen, wie OS X Carbon Component Manager arbeiten. Ich habe ein paar kleine Anwendungen, die mit Herstellung Komponenten zu spielen, um (siehe hier für einige Hintergrundinformationen). Eigentlich eine der Anwendungen ist ein Beispielprogramm direkt von Apple ‚Fiendishthngs‘ genannt. Es listet alle Komponenten, die den Komponenten-Manager verfügbar macht. Mein Programm ist eine einfache kleine Sache, die eine Komponente registriert, wird alle Komponenten, die der Komponenten-Manager hat, und wartet dann darauf, um auf unbestimmte Zeit (zu vermeiden, dass die Komponente Spülen, dass sie registriert).

Auf meinem System, das Component Manager verfolgt 873 Komponenten (meistens Codecs von einer Art eines anderen). Mein Programm, das eine Komponente registriert registriert sich, und zählt dann 874 Komponenten, weil es nur ein selbst registriert, natürlich). Hier ist die Quelle:

void RegisterBasicComponent()
{
    ComponentDescription desc;
    desc.componentType = kMyComponentType;
    desc.componentSubType = kMyComponentSubType;
    desc.componentManufacturer = kMyComponentManufacturer;
    desc.componentFlags = 0;
    desc.componentFlagsMask = cmpIsMissing;

    ComponentRoutineUPP MyComponentRoutineUPP 
        = NewComponentRoutineUPP( &MyComponentRoutineProc );

    //  Handle name_handle = NewHandle( sizeof( kMyComponentName ) );
    //strcpy( *(char**)name_handle, kMyComponentName );

    //RegisterComponent( &desc, MyComponentRoutineUPP, registerComponentGlobal, name_handle, NULL, NULL );
    Component component = RegisterComponent( &desc, MyComponentRoutineUPP, registerComponentGlobal, NULL, NULL, NULL );
    if ( NULL != component )
        printf("The registration seems to have worked!\n");
    else
        printf("Nope - didn't work for some reason.\n");

}


int main( void )
{
    RegisterBasicComponent();

    ComponentDescription looking;
//  OSType              componentType;          /* A unique 4-byte code indentifying the command set */
//  OSType              componentSubType;       /* Particular flavor of this instance */
//  OSType              componentManufacturer;  /* Vendor indentification */
//  UInt32              componentFlags;         /* 8 each for Component,Type,SubType,Manuf/revision */
//  UInt32              componentFlagsMask;     /* Mask for specifying which flags to consider in search, zero during registration */
    looking.componentType           = kAnyComponentType;          
    looking.componentSubType        = kAnyComponentSubType;
//  looking.componentSubType        = kComponentResourceType
    looking.componentManufacturer   = kAnyComponentManufacturer;
    looking.componentFlags          = 0;
    looking.componentFlagsMask      = cmpIsMissing;

    long numComponents = CountComponents ( &looking );

    printf("Found %ld components.\n", numComponents);

    Component component = 0;
    int i = 0;
    while (true) 
    {
        component = FindNextComponent(component, &looking);

        if ( 0 == component )
            break;

        ComponentDescription desc;
        Handle componentName = NewHandle(256);
        Handle componentInfo = NewHandle(1024);
        Handle componentIcon = 0;
        OSErr err = GetComponentInfo( component,
                                &desc,
                                componentName,
                                componentInfo,
                                componentIcon );

        if ( err != noErr )
        {
            printf("Couldn't find any info on component %d of %ld in list!\n", i
                   , numComponents);
            break;
        }


        printf( "%d of %ld: '%c%c%c%c', '%c%c%c%c', '%c%c%c%c', '%s'\n", 
            i, numComponents,
            SPLAT_WORD( desc.componentManufacturer ),
            SPLAT_WORD( desc.componentType ),
            SPLAT_WORD( desc.componentSubType ),
            *componentName );

        RecoverHandle( *componentName );
        RecoverHandle( *componentInfo );

        ++i;
    }

    while (true) 
    {
        printf("Waiting around for someone to use me...\n");
        sleep( 3 );
    }
}

Wie auch immer, wenn ich das laufen, halten Sie es läuft (so würde die Komponente vermutlich mit dem Component Manager registriert bleiben) und dann Fiendishthngs ausführen, können Fiendishthngs nicht meine Test Komponente sehen, dass ich registrieren - es sieht nur 873 Komponenten. Die Flagge besteht ‚registerComponentGlobal‘ in RegisterComponent () sollte die Komponente für andere Prozesse machen, aber es scheint, wie etwas schief geht.

Irgendwelche Ideen?

War es hilfreich?

Lösung

Nun, verließ ich dieses Problem hinter, mich auf die Tatsache, dass ausscheid Component Manager OS X wahrscheinlich nicht die ‚globale‘ Option nicht unterstützt mehr.

Dies würde sehr viel Sinn machen, wirklich. Erstellen der Komponente ‚global‘ aus dem Prozess auf andere Prozesse erfordern würde Aufruf Rangier out-of-Prozess, wie mit RPC, mit OS X. Auf der anderen Seite, in O 9 und früher, wäre es durchaus Sinn machen, da alle Prozesse lebten in einem gemeinsamen Adressraum. Für 9 OS wäre es trivial sein, um eine Komponente global für alle Prozesse zur Verfügung zu stellen.

Wie auch immer, heute war ich Auseinanderbauen RegisterComponentFileRefEntries (), in dem der entsprechenden Code, und sicher genug zu wohnen scheint, ich sehe dies in der Präambel auf die Funktion (die Kommentare von mir):

0x9841a026  <+0018>  mov    eax, DWORD PTR [ebp+0x8]        // load param spec
0x9841a029  <+0021>  mov    DWORD PTR [ebp-0xdc],eax        // local spec = param spec
0x9841a02f  <+0027>  mov    edx,DWORD PTR [ebp+0x10]        // load param toRegister
0x9841a032  <+0030>  mov    DWORD PTR [ebp-0xe0],edx        // local toRegister = param toRegister

Die Signatur für RegisterComponentFileRefEntries ist

extern OSErr 
RegisterComponentFileEntries(
  const FSSpec *                spec,
  short                         global,
  const ComponentDescription *  toRegister,          /* can be NULL */
  UInt32                        registerCount)   

Die einzigen zwei Parameter, die RegisterComponentFileRefEntries mit sind spec stört (bei ebp + 0x8) und toRegister (bei ebp + 0x10). global (bei ebp + 0xc) und registerCount (bei ebp + 0x14) vollständig ignoriert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top