//guid 唯一标识 import util.metaProperty; namespace win; class guid{ ctor(d1,d2,d3,d4,...){ if(type.isString(d1)){ return ..win.guid.fromString(d1); } this.Data1 = d1; this.Data2 = d2; this.Data3 = d3; this.Data4 = d4; if( ...!== null ) this.Data4 = ..string.pack(d4,...); }; INT Data1; WORD Data2; WORD Data3; BYTE Data4[8]; @_metaProperty; } namespace guid{ ::Ole32 := ..raw.loadDll("Ole32.dll"); Rpcrt4 := ..raw.loadDll("Rpcrt4.dll"); _metaProperty = ..util.metaProperty( _eq = function(b){ return owner.Data1 == b.Data1 && owner.Data2 == b.Data2 && owner.Data3 == b.Data3 && owner.Data4 == b.Data4; }; isNull = function(){ return !(owner.Data1 || owner.Data2 || owner.Data3 || #owner.Data4); }; _tostring = function(lower,clsId) { if(type(lower)==="string") { if(lower==="%X") lower = "%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X"; elseif(lower==="%x") lower = "%08x%04x%04x%02x%02x%02x%02x%02x%02x%02x%02x"; return..string.format(lower,owner.unpack() ); } var ps = {ptr p}; var re = Rpcrt4.UuidToString(owner,ps) if( ps.p ){ var str = ..string.fromUtf16(ps.p,,true ); Rpcrt4.RpcStringFree(ps); if(str){ if(!lower) str = ..string.upper(str); if(clsId) str = "{" + str + "}"; return str; }; } }; create = function(){ Rpcrt4.UuidCreate(owner); return owner; }; hex = function(prefix){ return ..string.hex(..raw.buffer(owner),prefix); }; fromString = function(progId){ if(progId[1]=='{'# ){ return ::Ole32.CLSIDFromStringW(progId,owner ) >=0/*_SUCCEEDED*/ ? owner : null; } else { var uuid; if(#progId == 32 && ..string.match(progId,"\x{32}") ){ uuid = ..string.replace(progId,"^(\x{8})(\x{4})(\x{4})(\x{4})","\1-\2-\3-\4-") } else uuid = ..string.match(progId,"\x{8}-\x{4}-\x{4}-\x{4}-\x{12}"); if(uuid){ return ( Rpcrt4.UuidFromString (uuid,owner) == 0/*_RPC_S_OK*/ ) ? owner : null; } } if( (::Ole32.CLSIDFromProgID( ..string.toUtf16(progId),owner))>=0/*_SUCCEEDED*/ ) return owner; }; toProgId = function(){ var hr,,progId = ::Ole32.ProgIDFromCLSID(owner,{ptr value}); if( (hr)>=0/*_SUCCEEDED*/ ){ var str = ..string.fromUtf16(progId.value,,true); ::Ole32.CoTaskMemFree(progId.value) return str; }; }; unpack = function(){ return owner.Data1,owner.Data2,owner.Data3, owner.Data4[1],owner.Data4[2],owner.Data4[3],owner.Data4[4], owner.Data4[5],owner.Data4[6],owner.Data4[7],owner.Data4[8] }; _json = lambda() owner.toString(,true); _concat = function(b){ return tostring(owner) ++ tostring(b); }; _add = function(b){ return tostring(owner) ++ tostring(b); }; ) _metaProperty.toString = _metaProperty._tostring; create = function() { return ..win.guid().create(); }; fromString = function(progId){ return ..win.guid().fromString(progId); } toProgId = function(guid){ if( type(guid) == "string" ) guid = ..win.guid().fromString(guid); return guid.toProgId(); } var _guid = ..win.guid(); valid = function(guid){ if( type(guid) == "string" ) guid = fromString(guid); if( _guid._struct == guid[["_struct"]] ) return guid; }; } /**intellisense() win.guid.create() = 创建 GUID 结构体并初始化为唯一值。\n!win_guid. win.guid() = 创建 GUID 结构体,初始化为空值。\n\n可使用 win.guid.create 函数创建 GUID 结构体并初始化为唯一值。\n\n返回的 win.guid 对象通过 `++` 或 `+` 操作符连接时会自动转换为字符串。\n\nwin.guid 对象可以使用 tostring 函数转换为大写字符串。\ntostring 参数 @2 指定是否小写,参数@3指定是否添加大括号,\ntostring 参数@2 也可用字符串指定11个数值参数的格式化串,\n!win_guid. win.guid(.(数值,数值,数值,'\x00\x00\x00\x00\x00\x00\x00\x00') = 创建GUID结构体\n参数@4也可以改为包含8个字节数值的数组或者展开为8个数值参数 win.guid(.("GUID、CLSID、ProgID等") = 字符串转换为 GUID,\n参数支持ProgID,CLSID,GUID,\n失败返回null空值 win.guid.fromString("__/*可输入 ProgID,CLSID,GUID*/") = 字符串转换为 GUID 结构体。\n参数支持 ProgID,CLSID,GUID (32 个 16 进制字符以及可选的 4 个短横线)格式字符串,\n失败返回 null 空值。\n\n注意 win.guid 对象可以使用 tostring 函数转换为字符串,\ntostring 参数 @1 指定是否小写(或指定格式化字符串),参数 @2 指定是否添加大括号,\n!win_guid. win.guid.toProgId("__/*请输入GUID*/") = GUID转换为字符串格式的 ProgId\n失败返回null空值 win.guid.valid(.(GUID对象) = 判断是否有效GUID对象,\n如果参数是ProgID,CLSID,GUID,则尝试转换,\n转换成功则返回GUID对象,否则返回空 win.guid.valid() = !win_guid. win.guid.fromString() = !win_guid. !win_guid.Data1 = INT类型 !win_guid.Data2 = WORD类型 !win_guid.Data3 = WORD类型 !win_guid.Data4 = 字符串值,也可以指定包含多个字节值的数组 !win_guid.unpack() = 转换并返回 11 个数值 !win_guid.hex() = 转换为 16 进制格式字符串。\n可选使用参数 @1 自定义 16 进制前缀字符,默认为空字符串。 !win_guid.isNull() = 是否等于GUID_NULL,也就是结构体内存的所有字节值为0 !win_guid.create() = 初始化为唯一值,返回自身\n!win_guid. !win_guid.fromString("__/*请输入ProgID*/") = 字符串转换为 GUID 结构体,返回自身,\n也可以直接写到 win.guid 参数中,\n可使用 tostring 函数将 GUID 结构体重新转换为字符串\ntostring 参数@2指定是否小写,参数@3指定是否添加大括号,\ntostring 参数@2 也可用字符串指定11个数值参数的格式化串\n!win_guid. !win_guid.toString( = 转换为字符串,也支持通过 tostring 自动调用此函数 !win_guid.toString(.(是否小写,是否添加大括号) = 转换为字符串,生成格式:\n00000000-0000-0000-0000-000000000000 !win_guid.toString(.("%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X") = 转换为字符串,自定义 11 个数值参数的格式化串 !win_guid.toString(.("%X") = 转换为 32 位 16 进制字符串,大写,无短横线。\n参数 %X" 自动转换为 "%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X"。 \n也可以写为 `tostring(guid,"%X")` 。 !win_guid.toString(.("%x") = 转换为 32 位 16 进制字符串,小写,无短横线。\n参数 %x" 自动转换为 "%08x%04x%04x%02x%02x%02x%02x%02x%02x%02x%02x"。\n也可以写为 `tostring(guid,"%x")` 。 !win_guid.toProgId() = CLSID转换为ProgId,返回字符串 end intellisense**/