2009-09-08 5 views

cevap

17

Sen anonim fabrika sınıfına bir arayüz olarak CoCreateInstance() düşünebiliriz.

OOP bu sadece bir oluşturma yöntemini çağırın ve tam olarak bu arayüzde arkasında ne sınıf bilmek zorunda kalmadan bir arabirim işaretçisi/referans almak için bir fabrika deseni kullanılması genellikle makul. Ama yine de bir fabrika olarak kullanmak için hangi sınıf bilmek gerekir. Bunu küresel bir işleve sahip olarak da gizleyebilirsiniz, ancak yine de adını ve çağrı kurallarını bilmeniz gerekir.

CoCreateInstance daha da ileri gider - fabrika sınıfını da gizler ve sistem çapında bir global işlev sağlar. Sağladığınız tek şey bir sınıf kimliğidir - ki bu sadece bir GUID - ve bir arayüz kimliği - ki bu da bir GUID'dir. Uygulamanın nerede olduğunu ve hangi dilde olduğunu bilmiyorsunuz - COM, sisteminizde, belirtilen arabirim kimliği için bir arabirim oluşturan, belirtilen sınıf kimliğinin uygulanmasını içeren bir COM sunucusu bulunduğundan, tüm bunlarla ilgilenir.

Sistem çapında global CoCreateInstance() çağırırsanız, COM sunucusunu bulur (veya başarısız), başlatır, bir nesne oluşturmasını ister (başarısız olabilir), bu arabirime bir arabirim işaretçisi alır (başarısız olabilir)) ve bu arayüz işaretçisini size döndürür.

3

koyun basitçe, bir sınıfın örneğini oluşturmak için kullanılan, sınıf bir GUID tarafından belirtilen ediliyor.

HRESULT CoCreateInstance(
    __in REFCLSID rclsid, // which class you want 
    __in LPUNKNOWN pUnkOuter, // used in aggregation 
    __in DWORD dwClsContext, // how/where you want the object created 
    __in REFIID riid, // which of the object's interfaces you want to use 
    __out LPVOID *ppv // where the pointer to the created object is placed 
); 

fazla bilgi için, documentation okuyun.