2015-04-30 17 views
11

nasıl başlatılır? Bir sınıf kimliği (GUID), genellikle, tire ile ayrılmış bir altı sayı ile belirtilir, örn. {557cf406-1a04-11d3-9a73-0000f81ef32e}. Bu, bir CLSID yapısını doğrudan başlatmak için kullanılabilecek bir hazır bilgi değildir.Bir sabit CLSID

Yapısını başlatmak için iki yol keşfettim, ancak ikisi de garip. Birincisi, const no'lu beyan edilmesine izin vermez ve çalışma zamanında yapılmalıdır, ikincisi ise hex sabitlerinin kapsamlı bir şekilde yeniden biçimlendirilmesini gerektirir.

CLSID clsid1; 
CLSIDFromString(CComBSTR("{557cf406-1a04-11d3-9a73-0000f81ef32e}"), &clsid1); 

const CLSID clsid2 = { 0x557cf406, 0x1a04, 0x11d3, { 0x9a,0x73,0x00,0x00,0xf8,0x1e,0xf3,0x2e } }; 

Sana __uuidof operator kullanarak, bir UUID ile ilişkili bir türü varsa, Visual Studio otomatik bir tane oluşturabilirsiniz biliyoruz. Sadece altıgen dizginiz varsa bunu yapmanın bir yolu var mı?

+0

Ahem: http://stackoverflow.com/questions/5345803/does-gdi-have-standard-image-encoder-clsids –

+1

Her zaman "CLSIDFromString" diyen bir fabrika işlevi kullanabilirsiniz - const CLSID clsid1 gibi bir şey = GUIDFactoryFunc ("{557cf406-1a04-11d3-9a73-0000f81ef32e}") ' –

+1

@i_am_jorf neden soruyu sorduğumu düşünüyorsunuz? Bu sorunun cevabını yeni bir programda kullanmam gerekiyor ve geri yazdığım kod işten önce ve artık referans olarak kullanılamıyor. –

cevap

2

GUID oluşturmak için bir yardımcı işlev kullanın.

#include <Windows.h> 
#include <atlbase.h> 

template<class S> 
CLSID CreateGUID(const S& hexString) 
{ 
    CLSID clsid; 
    CLSIDFromString(CComBSTR(hexString), &clsid); 

    return clsid; 
} 

int main() 
{ 
    const CLSID clsid1 = CreateGUID("{557cf406-1a04-11d3-9a73-0000f81ef32e}"); 
    const CLSID clsid2 = CreateGUID(L"{557cf406-1a04-11d3-9a73-0000f81ef32e}"); 
} 
7

Statik CLSID (çalışma zamanı dönüşüm yardımcı gerekli) dizisinden başlatma:

class __declspec(uuid("{557cf406-1a04-11d3-9a73-0000f81ef32e}")) Foo; 
static const CLSID CLSID_Foo = __uuidof(Foo);  
// ... 
CComPtr<IUnknown> pUnknown; 
pUnknown.CoCreateInstance(CLSID_Foo); 

veya __uuidof basitçe doğrudan kullanımı (derleyici bir sabit olarak GUID değerini tedavi etmek ve gerekli minimum kod oluşturur):

class __declspec(uuid("{557cf406-1a04-11d3-9a73-0000f81ef32e}")) Foo; 
// ... 
CComPtr<IUnknown> pUnknown; 
pUnknown.CoCreateInstance(__uuidof(Foo)); 

özel bir şey değildir: tip kütüphaneler #import ed olduğunda örneğin, aynı buluştu hod, sınıf tabanlı türlere CLSID s iliştirmek için kullanılır ve additionally requested ise CLSID_xxx tanımlayıcıları eklenebilir.

+0

İyi bir tane. Tek liner yapmak için biraz makro da kullanabilir. – Noseratio

+0

Aslında 'CLSID_Foo' tanımlamanıza gerek yoktur, çünkü '__uuidof (Foo)' doğrudan kullanılabilir (onu zaten bir tek liner haline getirir). –

+0

Bence OP bir “const CLSID” istiyor, bu yüzden makrodan bahsetmiştim. – Noseratio