class WIN32OLE::TypeLib
WIN32OLE::TypeLib 对象代表 OLE 类型库信息。
公共类方法
源代码
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;
}
返回一个新的 WIN32OLE::TypeLib 对象。
第一个参数 typelib 指定 OLE 类型库名称或 GUID 或 OLE 库文件。第二个参数是类型库的主版本或版本。第三个参数是次版本。第二个和第三个参数是可选的。如果第一个参数是类型库名称,则第二个和第三个参数将被忽略。
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'
源代码
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
返回 WIN32OLE::TypeLib 对象的数组。
tlibs = WIN32OLE::TypeLib.typelibs
公共实例方法
源代码
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;
}
返回指定类型库的 guid 字符串。
tlib = WIN32OLE::TypeLib.new('Microsoft Excel 9.0 Object Library') guid = tlib.guid # -> '{00020813-0000-0000-C000-000000000046}'
源代码
static VALUE
foletypelib_inspect(VALUE self)
{
return default_inspect(self, "WIN32OLE::TypeLib");
}
返回带有类名称的类型库名称。
tlib = WIN32OLE::TypeLib.new('Microsoft Excel 9.0 Object Library') tlib.inspect # => "<#WIN32OLE::TypeLib:Microsoft Excel 9.0 Object Library>"
源代码
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;
}
library_name → 字符串
tlib = WIN32OLE::TypeLib.new('Microsoft Excel 9.0 Object Library') tlib.library_name # => Excel
源代码
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;
}
major_version → 类型库主版本。
tlib = WIN32OLE::TypeLib.new('Microsoft Excel 9.0 Object Library') puts tlib.major_version # -> 1
源代码
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;
}
minor_version → 类型库次版本。
tlib = WIN32OLE::TypeLib.new('Microsoft Excel 9.0 Object Library') puts tlib.minor_version # -> 3
源代码
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;
}
name → 类型库名称
tlib = WIN32OLE::TypeLib.new('Microsoft Excel 9.0 Object Library') name = tlib.name # -> 'Microsoft Excel 9.0 Object Library'
返回类型库名称。
也别名为: to_s
源代码
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;
}
返回类型库文件路径。
tlib = WIN32OLE::TypeLib.new('Microsoft Excel 9.0 Object Library') classes = tlib.ole_types.collect{|k| k.name} # -> ['AddIn', 'AddIns' ...]
也别名为: ole_classes
源代码
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;
}
返回类型库文件路径。
tlib = WIN32OLE::TypeLib.new('Microsoft Excel 9.0 Object Library') puts tlib.path #-> 'C:\...\EXCEL9.OLB'
源代码
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;
}
返回类型库版本。
tlib = WIN32OLE::TypeLib.new('Microsoft Excel 9.0 Object Library') puts tlib.version #-> "1.3"
源代码
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;
}
visible? → Boolean
tlib = WIN32OLE::TypeLib.new('Microsoft Excel 9.0 Object Library') tlib.visible? # => true