# class WIN32OLE::TypeLib

`WIN32OLE::TypeLib` objects represent OLE tyblib information.

### Public Class Methods

new(typelib [, version1, version2]) → WIN32OLE::TypeLib object
Source

    static VALUE
    foletypelib_initialize(VALUE self, VALUE args)
    {
        VALUE found = Qfalse;
        VALUE typelib = Qnil;
        int len = 0;
        OLECHAR * pbuf;
        ITypeLib *pTypeLib;
        HRESULT hr = S_OK;

        len = RARRAY_LEN(args);
        rb_check_arity(len, 1, 3);

        typelib = rb_ary_entry(args, 0);

        SafeStringValue(typelib);

        found = oletypelib_search_registry(self, typelib);
        if (found == Qfalse) {
            found = oletypelib_search_registry2(self, args);
        }
        if (found == Qfalse) {
            pbuf = ole_vstr2wc(typelib);
            hr = LoadTypeLibEx(pbuf, REGKIND_NONE, &pTypeLib);
            SysFreeString(pbuf);
            if (SUCCEEDED(hr)) {
                found = Qtrue;
                oletypelib_set_member(self, pTypeLib);
            }
        }

        if (found == Qfalse) {
            rb_raise(eWIN32OLERuntimeError, "not found type library `%s`",
                     StringValuePtr(typelib));
        }
        return self;
    }

Returns a new `WIN32OLE::TypeLib` object.

The first argument typelib specifies OLE type library name or GUID or OLE library file. The second argument is major version or version of the type library. The third argument is minor version. The second argument and third argument are optional. If the first argument is type library name, then the second and third argument are ignored.

    tlib1 = WIN32OLE::TypeLib.new('Microsoft Excel 9.0 Object Library')
    tlib2 = WIN32OLE::TypeLib.new('{00020813-0000-0000-C000-000000000046}')
    tlib3 = WIN32OLE::TypeLib.new('{00020813-0000-0000-C000-000000000046}', 1.3)
    tlib4 = WIN32OLE::TypeLib.new('{00020813-0000-0000-C000-000000000046}', 1, 3)
    tlib5 = WIN32OLE::TypeLib.new("C:\\WINNT\\SYSTEM32\\SHELL32.DLL")
    puts tlib1.name  # -> 'Microsoft Excel 9.0 Object Library'
    puts tlib2.name  # -> 'Microsoft Excel 9.0 Object Library'
    puts tlib3.name  # -> 'Microsoft Excel 9.0 Object Library'
    puts tlib4.name  # -> 'Microsoft Excel 9.0 Object Library'
    puts tlib5.name  # -> 'Microsoft Shell Controls And Automation'

typelibs ()
Source

    static VALUE
    foletypelib_s_typelibs(VALUE self)
    {
        HKEY htypelib, hguid;
        DWORD i, j;
        LONG err;
        VALUE guid;
        VALUE version;
        VALUE name = Qnil;
        VALUE typelibs = rb_ary_new();
        VALUE typelib = Qnil;
        HRESULT hr;
        ITypeLib *pTypeLib;

        err = reg_open_key(HKEY_CLASSES_ROOT, "TypeLib", &htypelib);
        if(err != ERROR_SUCCESS) {
            return typelibs;
        }
        for(i = 0; ; i++) {
            guid = reg_enum_key(htypelib, i);
            if (guid == Qnil)
                break;
            err = reg_open_vkey(htypelib, guid, &hguid);
            if (err != ERROR_SUCCESS)
                continue;
            for(j = 0; ; j++) {
                version = reg_enum_key(hguid, j);
                if (version == Qnil)
                    break;
                if ( (name = reg_get_val2(hguid, StringValuePtr(version))) != Qnil ) {
                    hr = oletypelib_from_guid(guid, version, &pTypeLib);
                    if (SUCCEEDED(hr)) {
                        typelib = create_win32ole_typelib(pTypeLib);
                        rb_ary_push(typelibs, typelib);
                    }
                }
            }
            RegCloseKey(hguid);
        }
        RegCloseKey(htypelib);
        return typelibs;
    }

    typelibs

Returns the array of `WIN32OLE::TypeLib` object.

    tlibs = WIN32OLE::TypeLib.typelibs

### Public Instance Methods

guid → The guid string.
Source

    static VALUE
    foletypelib_guid(VALUE self)
    {
        ITypeLib *pTypeLib;
        OLECHAR bstr[80];
        VALUE guid = Qnil;
        int len;
        TLIBATTR *pTLibAttr;

        pTypeLib = itypelib(self);
        oletypelib_get_libattr(pTypeLib, &pTLibAttr);
        len = StringFromGUID2(&pTLibAttr->guid, bstr, sizeof(bstr)/sizeof(OLECHAR));
        if (len > 3) {
            guid = ole_wc2vstr(bstr, FALSE);
        }
        pTypeLib->lpVtbl->ReleaseTLibAttr(pTypeLib, pTLibAttr);
        return guid;
    }

Returns guid string which specifies type library.

    tlib = WIN32OLE::TypeLib.new('Microsoft Excel 9.0 Object Library')
    guid = tlib.guid # -> '{00020813-0000-0000-C000-000000000046}'

inspect → String
Source

    static VALUE
    foletypelib_inspect(VALUE self)
    {
        return default_inspect(self, "WIN32OLE::TypeLib");
    }

Returns the type library name with class name.

    tlib = WIN32OLE::TypeLib.new('Microsoft Excel 9.0 Object Library')
    tlib.inspect # => "<#WIN32OLE::TypeLib:Microsoft Excel 9.0 Object Library>"

library_name
Source

    static VALUE
    foletypelib_library_name(VALUE self)
    {
        HRESULT hr;
        ITypeLib *pTypeLib = NULL;
        VALUE libname = Qnil;
        BSTR bstr;

        pTypeLib = itypelib(self);
        hr = pTypeLib->lpVtbl->GetDocumentation(pTypeLib, -1,
                                                &bstr, NULL, NULL, NULL);
        if (FAILED(hr)) {
            ole_raise(hr, eWIN32OLERuntimeError, "failed to get library name");
        }
        libname = WC2VSTR(bstr);
        return libname;
    }

Returns library name. If the method fails to access library name, `WIN32OLE::RuntimeError` is raised.

    tlib = WIN32OLE::TypeLib.new('Microsoft Excel 9.0 Object Library')
    tlib.library_name # => Excel

major_version → The type library major version.
Source

    static VALUE
    foletypelib_major_version(VALUE self)
    {
        TLIBATTR *pTLibAttr;
        VALUE major;
        ITypeLib *pTypeLib;
        pTypeLib = itypelib(self);
        oletypelib_get_libattr(pTypeLib, &pTLibAttr);

        major =  RB_INT2NUM(pTLibAttr->wMajorVerNum);
        pTypeLib->lpVtbl->ReleaseTLibAttr(pTypeLib, pTLibAttr);
        return major;
    }

Returns the type library major version.

    tlib = WIN32OLE::TypeLib.new('Microsoft Excel 9.0 Object Library')
    puts tlib.major_version # -> 1

minor_version → The type library minor version.
Source

    static VALUE
    foletypelib_minor_version(VALUE self)
    {
        TLIBATTR *pTLibAttr;
        VALUE minor;
        ITypeLib *pTypeLib;
        pTypeLib = itypelib(self);
        oletypelib_get_libattr(pTypeLib, &pTLibAttr);
        minor =  RB_INT2NUM(pTLibAttr->wMinorVerNum);
        pTypeLib->lpVtbl->ReleaseTLibAttr(pTypeLib, pTLibAttr);
        return minor;
    }

Returns the type library minor version.

    tlib = WIN32OLE::TypeLib.new('Microsoft Excel 9.0 Object Library')
    puts tlib.minor_version # -> 3

name → The type library name
Source

    static VALUE
    foletypelib_name(VALUE self)
    {
        ITypeLib *pTypeLib;
        HRESULT hr;
        BSTR bstr;
        VALUE name;
        pTypeLib = itypelib(self);
        hr = pTypeLib->lpVtbl->GetDocumentation(pTypeLib, -1,
                                                NULL, &bstr, NULL, NULL);

        if (FAILED(hr)) {
            ole_raise(hr, eWIN32OLERuntimeError, "failed to get name from ITypeLib");
        }
        name = WC2VSTR(bstr);
        return name;
    }

Returns the type library name.

    tlib = WIN32OLE::TypeLib.new('Microsoft Excel 9.0 Object Library')
    name = tlib.name # -> 'Microsoft Excel 9.0 Object Library'

Also aliased as: to_s
ole_classes
Alias for: ole_types
ole_types → The array of WIN32OLE::Type object included the type library.
Source

    static VALUE
    foletypelib_ole_types(VALUE self)
    {
        ITypeLib *pTypeLib = NULL;
        VALUE classes = rb_ary_new();
        pTypeLib = itypelib(self);
        ole_types_from_typelib(pTypeLib, classes);
        return classes;
    }

Returns the type library file path.

    tlib = WIN32OLE::TypeLib.new('Microsoft Excel 9.0 Object Library')
    classes = tlib.ole_types.collect{|k| k.name} # -> ['AddIn', 'AddIns' ...]

Also aliased as: ole_classes
path → The type library file path.
Source

    static VALUE
    foletypelib_path(VALUE self)
    {
        TLIBATTR *pTLibAttr;
        HRESULT hr = S_OK;
        BSTR bstr;
        LCID lcid = cWIN32OLE_lcid;
        VALUE path;
        ITypeLib *pTypeLib;

        pTypeLib = itypelib(self);
        oletypelib_get_libattr(pTypeLib, &pTLibAttr);
        hr = QueryPathOfRegTypeLib(&pTLibAttr->guid,
                                   pTLibAttr->wMajorVerNum,
                                   pTLibAttr->wMinorVerNum,
                                   lcid,
                                   &bstr);
        if (FAILED(hr)) {
            pTypeLib->lpVtbl->ReleaseTLibAttr(pTypeLib, pTLibAttr);
            ole_raise(hr, eWIN32OLERuntimeError, "failed to QueryPathOfRegTypeTypeLib");
        }

        pTypeLib->lpVtbl->ReleaseTLibAttr(pTypeLib, pTLibAttr);
        path = WC2VSTR(bstr);
        return path;
    }

Returns the type library file path.

    tlib = WIN32OLE::TypeLib.new('Microsoft Excel 9.0 Object Library')
    puts tlib.path #-> 'C:\...\EXCEL9.OLB'

to_s
Alias for: name
version → The type library version String object.
Source

    static VALUE
    foletypelib_version(VALUE self)
    {
        TLIBATTR *pTLibAttr;
        ITypeLib *pTypeLib;
        VALUE version;

        pTypeLib = itypelib(self);
        oletypelib_get_libattr(pTypeLib, &pTLibAttr);
        version = rb_sprintf("%d.%d", pTLibAttr->wMajorVerNum, pTLibAttr->wMinorVerNum);
        pTypeLib->lpVtbl->ReleaseTLibAttr(pTypeLib, pTLibAttr);
        return version;
    }

Returns the type library version.

    tlib = WIN32OLE::TypeLib.new('Microsoft Excel 9.0 Object Library')
    puts tlib.version #-> "1.3"

visible?
Source

    static VALUE
    foletypelib_visible(VALUE self)
    {
        ITypeLib *pTypeLib = NULL;
        VALUE visible = Qtrue;
        TLIBATTR *pTLibAttr;

        pTypeLib = itypelib(self);
        oletypelib_get_libattr(pTypeLib, &pTLibAttr);

        if ((pTLibAttr->wLibFlags == 0) ||
            (pTLibAttr->wLibFlags & LIBFLAG_FRESTRICTED) ||
            (pTLibAttr->wLibFlags & LIBFLAG_FHIDDEN)) {
            visible = Qfalse;
        }
        pTypeLib->lpVtbl->ReleaseTLibAttr(pTypeLib, pTLibAttr);
        return visible;
    }

Returns true if the type library information is not hidden. If wLibFlags of TLIBATTR is 0 or LIBFLAG_FRESTRICTED or LIBFLAG_FHIDDEN, the method returns false, otherwise, returns true. If the method fails to access the TLIBATTR information, then `WIN32OLE::RuntimeError` is raised.

    tlib = WIN32OLE::TypeLib.new('Microsoft Excel 9.0 Object Library')
    tlib.visible? # => true