?? func.cs
字號:
?using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices.ComTypes;
using System.Runtime.InteropServices;
using FUNCDESC = System.Runtime.InteropServices.ComTypes.FUNCDESC;
using INVOKEKIND = System.Runtime.InteropServices.ComTypes.INVOKEKIND;
using FUNCFLAGS = System.Runtime.InteropServices.ComTypes.FUNCFLAGS;
namespace IDLTest
{
/// <summary>
/// 函數
/// </summary>
class Func
{
#region 屬性
public INVOKEKIND InvokeKind
{
get { return fd.invkind; }
}
/// <summary>
/// 在 VTBL 中的偏移量
/// </summary>
public short OffVft
{
get { return fd.oVft; }
}
/// <summary>
/// 函數名
/// </summary>
public String Name;
public override string ToString()
{
String s = "[" + Address.ToString("X") + "+" + OffVft.ToString("X") + "] ";
s += "[" + FuncAddress.ToString("X") + "] ";
s += Name;
s += " (";
if (fd.cParams > 0) s += fd.cParams.ToString();
s += ") ";
switch (InvokeKind)
{
case INVOKEKIND.INVOKE_FUNC:
s += "[方法]";
break;
case INVOKEKIND.INVOKE_PROPERTYGET:
s += "[Get]";
break;
case INVOKEKIND.INVOKE_PROPERTYPUT:
s += "[Set]";
break;
case INVOKEKIND.INVOKE_PROPERTYPUTREF:
s += "[Ref]";
break;
default:
s += "[未知]";
break;
}
if (((FUNCFLAGS)fd.wFuncFlags & FUNCFLAGS.FUNCFLAG_FHIDDEN) != 0) s += " [隱]";
return s;
}
/// <summary>
/// 地址
/// </summary>
public IntPtr Address
{
get
{
if (info.BaseAddress == IntPtr.Zero) return IntPtr.Zero;
return (IntPtr)(info.BaseAddress.ToInt32() + OffVft);
}
}
public IntPtr FuncAddress
{
get { return Address == IntPtr.Zero ? IntPtr.Zero : Marshal.ReadIntPtr(Address); }
}
/// <summary>
/// 函數名
/// </summary>
public String FuncName
{
get
{
if (InvokeKind == INVOKEKIND.INVOKE_PROPERTYGET)
return "Get_" + Name;
else if (InvokeKind == INVOKEKIND.INVOKE_PROPERTYPUT)
return "Set_" + Name;
else if (InvokeKind == INVOKEKIND.INVOKE_PROPERTYPUTREF)
return "Ref_" + Name;
else
return Name;
}
}
#endregion
#region 原有屬性
public FUNCDESC fd;
public TypeInfo info;
#endregion
#region 構造函數
public Func(IntPtr ip)
{
if (ip == IntPtr.Zero) return;
fd = (FUNCDESC)Marshal.PtrToStructure(ip, typeof(FUNCDESC));
}
#endregion
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -