package y11.m04; import java.lang.reflect.Method; public class d28t01 { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { // Test polymorphism in reflection Object invoker = new Invoker(); Class clazz = invoker.getClass(); Dialer p1 = new Phone("12345"); Phone p2 = new Phone("234567"); CellPhone p3 = new CellPhone("345678"); // cause java.lang.NosuchMethodException try { Method m1 = clazz.getDeclaredMethod("use", p1.getClass()); m1.invoke(invoker, p1); } catch (Exception e) { e.printStackTrace(); } try { Method m2 = clazz.getDeclaredMethod("use", p2.getClass()); m2.invoke(invoker, p1); } catch (Exception e) { e.printStackTrace(); } try { Method m3 = clazz.getDeclaredMethod("use", p3.getClass()); m3.invoke(invoker, p1); } catch (Exception e) { e.printStackTrace(); } Method[] ms = clazz.getDeclaredMethods(); for (Method m : ms) { if (m.getName().equals("use")) { Class[] paramTypes = m.getParameterTypes(); if (paramTypes.length == 1 && paramTypes[0].isAssignableFrom(p1.getClass())) { m.invoke(invoker, p1); } } if (m.getName().equals("use")) { Class[] paramTypes = m.getParameterTypes(); if (paramTypes.length == 1 && paramTypes[0].isAssignableFrom(p2.getClass())) { m.invoke(invoker, p2); } } if (m.getName().equals("use")) { Class[] paramTypes = m.getParameterTypes(); if (paramTypes.length == 1 && paramTypes[0].isAssignableFrom(p3.getClass())) { m.invoke(invoker, p3); } } } } } class Invoker { public void use(Dialer dialer) { if (dialer != null) dialer.call(); } } interface Dialer { void call(); } class Phone implements Dialer { public String number; public Phone(String number) { this.number = number; } public void call() { System.out.printf("Call %s%n", number); } } class CellPhone extends Phone { public CellPhone(String number) { super(number); } @Override public void call() { System.out.printf("Dial %s%n", number); } }
2011/04/28
Test polymorphism in reflection method invoke
2011/04/13
Share folder info (netapi32)
class MainConsole { [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] struct SHARE_INFO_2 { [MarshalAs(UnmanagedType.LPWStr)] public string shi2_netname; public uint shi2_type; [MarshalAs(UnmanagedType.LPWStr)] public string shi2_remark; public uint shi2_permissions; public uint shi2_max_uses; public uint shi2_current_uses; [MarshalAs(UnmanagedType.LPWStr)] public string shi2_path; [MarshalAs(UnmanagedType.LPWStr)] public string shi2_passwd; } static string FormatMessage(int errCode) { switch (errCode) { case ERROR_ACCESS_DENIED: return "The user does not have access to the requested information."; case ERROR_INVALID_LEVEL: return "The value specified for the level parameter is invalid."; case ERROR_INVALID_PARAMETER: return "The specified parameter is invalid."; case ERROR_MORE_DATA: return "More entries are available. Specify a large enough buffer to receive all entries."; case ERROR_NOT_ENOUGH_MEMORY: return "Insufficient memory is available."; case NERR_BufTooSmall: return "The supplied buffer is too small."; case NERR_NetNameNotFound: return "The share name does not exist."; }; return null; } [DllImport("Netapi32", CharSet = CharSet.Auto)] static extern int NetApiBufferFree(IntPtr Buffer); [DllImport("Netapi32", CharSet = CharSet.Auto)] static extern int NetShareGetInfo([MarshalAs(UnmanagedType.LPWStr)] string servername, [MarshalAs(UnmanagedType.LPWStr)] string netname, int level, ref IntPtr bufptr); /// <summary> /// Retrieves the local path for the given server and share name. /// </summary> /// <remarks>serverName must start with \\</remarks> static string NetShareGetPath(string serverName, string netName) { string path = null; IntPtr ptr = IntPtr.Zero; int errCode = NetShareGetInfo(serverName, netName, 2, ref ptr); if (errCode == NERR_Success) { SHARE_INFO_2 shareInfo = (SHARE_INFO_2)Marshal.PtrToStructure(ptr, typeof(SHARE_INFO_2)); var members = from m in shareInfo.GetType().GetFields() select m; foreach (var m in members) { Console.WriteLine("{0}={1}", m.Name, m.GetValue(shareInfo)); } path = shareInfo.shi2_path; NetApiBufferFree(ptr); } else Console.WriteLine(FormatMessage(errCode)); return path; } /// <summary> /// The Main method is the entry point of the program, where the program control starts and /// ends. /// </summary> /// <param name="args"></param> /// <returns></returns> [STAThread] static int Main(string[] args) { Console.WriteLine("path=" + NetShareGetPath(@"\\s3t21", "檔案測試區")); Console.Read(); return 0; } const int ERROR_ACCESS_DENIED = 5; const int ERROR_INVALID_LEVEL = 124; // unimplemented level for info const int ERROR_INVALID_PARAMETER = 87; const int ERROR_MORE_DATA = 234; const int ERROR_NOT_ENOUGH_MEMORY = 8; const int NERR_BufTooSmall = 2123; // The API return buffer is too small. const int NERR_NetNameNotFound = 2310; // This shared resource does not exist. const int NERR_Success = 0; } // class MainConsolehttp://pinvoke.net/default.aspx/netapi32.NetShareGetInfo
Get share folders from wmi
ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from win32_share"); foreach (ManagementObject share in searcher.Get()) { Console.WriteLine("=============="); ManagementBaseObject baseObj = share as ManagementBaseObject; PropertyDataCollection.PropertyDataEnumerator en = share.Properties.GetEnumerator(); while (en.MoveNext()) { Console.WriteLine(en.Current.Name + "=" + en.Current.Value); } }
2011/04/06
Web based file manager
//KeyNumber : 102(int) //ProductName : ad(string) //ProductVersion : ad1.0.2.1011010(string) //LicenseCount : 9999(int) //UserCount : 9999(int) Cryptor cryptor = new Cryptor(); string key = HexEncoding.ToString(cryptor.EncryptString("102:ad:ad1.0.2.1011010:9999:9999"));
2011/04/01
Tick
Java | Javascript | .net | |
Tick = 0 (GMT+0) | 1970/01/01 00:00:00 | 1970/01/01 00:00:00 | 1601/01/01 00:00:00 |
sec/tick | 1000 | 1000 | 10000000 |
tick=0\to tick | Java | Javascript | .net |
Java | x | 0 | 621356256000000000 |
Javascript | 0 | x | 621356256000000000 |
.net | -11644473600000 | -11644473600000 | x |
// Convert c# date to javascript var ticks = (DateTime.Now.Ticks - 621356256000000000) / 10000;
// Convert javascript date to c# var ticks = (((new Date()).getTime() * 10000) + 621355968000000000);