using System.Runtime.InteropServices; using System.Runtime.CompilerServices; [DllImport("ole32.dll")] public static extern int CLSIDFromString( [MarshalAs(UnmanagedType.LPWStr)] string lpsz, out Guid clsid); [DllImport("ole32.dll")] public static extern int CoCreateInstance( [In, MarshalAs(UnmanagedType.LPStruct)] Guid clsid, IntPtr pUnkOuter, uint dwClsContext, [In, MarshalAs(UnmanagedType.LPStruct)] Guid iid, out IntPtr pv); [DllImport("ole32.dll", CallingConvention = CallingConvention.StdCall)] public static extern int CoInitialize(IntPtr pvReserved); public const int FELANG_REQ_REV = 0x00030000; public const int FELANG_CMODE_PINYIN = 0x00000100; public const int FELANG_CMODE_NOINVISIBLECHAR = 0x40000000;0 [ComImport] [Guid("019F7152-E6DB-11D0-83C3-00C04FDDB82E")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IFELanguage { [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] int Open(); [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] int Close(); [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] int GetJMorphResult( [In] uint dwRequest, [In] uint dwCMode, [In] int cwchInput, [In, MarshalAs(UnmanagedType.LPWStr)] string pwchInput, [In] IntPtr pfCInfo, [Out] out IntPtr ppResult ); } public const int CLSCTX_INPROC_SERVER = 1; public const int CLSCTX_INPROC_HANDLER = 2; public const int CLSCTX_LOCAL_SERVER = 4; public const int CLSCTX_SERVER = CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER; [DllImport("kernel32.dll")] public static extern int FormatMessage(int dwFlags, IntPtr lpSource, int dwMessageId, int dwLanguageId, StringBuilder lpBuffer, int nSize, IntPtr va_list_arguments); public const int FORMAT_MESSAGE_IGNORE_INSERTS = 0x200; public const int FORMAT_MESSAGE_FROM_SYSTEM = 0x1000; public const int FORMAT_MESSAGE_ARGUMENT_ARRAY = 0x2000; [DllImport("kernel32.dll")] public static extern int GetLastError(); [DllImport("ole32.dll")] public static extern void CoTaskMemFree(IntPtr ptr); public const int S_OK = 0x00000000; public static string GetMessage(int errorCode) { StringBuilder lpBuffer = new StringBuilder(0x200); if (FormatMessage(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ARGUMENT_ARRAY, IntPtr.Zero, errorCode, 0, lpBuffer, lpBuffer.Capacity, IntPtr.Zero) != 0) { return lpBuffer.ToString(); } return "Unknown"; } private bool coInitialized = false; private void button1_Click(object sender, EventArgs e) { if (!coInitialized) { CoInitialize(IntPtr.Zero); coInitialized = true; } textBox2.Clear(); Guid vGuidIme; int vError; vError = CLSIDFromString("MSIME.China", out vGuidIme); if (vError != S_OK) { MessageBox.Show(GetMessage(vError)); return; } Guid vGuidLanguage = new Guid("019F7152-E6DB-11D0-83C3-00C04FDDB82E"); IntPtr vPPV; vError = CoCreateInstance(vGuidIme, IntPtr.Zero, CLSCTX_SERVER, vGuidLanguage, out vPPV); if (vError != S_OK) { MessageBox.Show(GetMessage(vError)); return; } IFELanguage vLanguage = Marshal.GetTypedObjectForIUnknown(vPPV, typeof(IFELanguage)) as IFELanguage; vError = vLanguage.Open(); if (vError != S_OK) { MessageBox.Show(GetMessage(vError)); return; } IntPtr vMorrslt; string vInput = textBox1.Text; vError = vLanguage.GetJMorphResult(FELANG_REQ_REV, FELANG_CMODE_PINYIN | FELANG_CMODE_NOINVISIBLECHAR, vInput.Length, vInput, IntPtr.Zero, out vMorrslt); if (vError != S_OK) { MessageBox.Show(GetMessage(vError)); return; } string vPinYin = Marshal.PtrToStringUni(Marshal.ReadIntPtr(vMorrslt, 4), Marshal.ReadInt16(vMorrslt, 8)); textBox2.AppendText("=" + vPinYin + "\r\n"); IntPtr vMonoRubyPos = Marshal.ReadIntPtr(vMorrslt, 28); IntPtr vReadIdxWDD = Marshal.ReadIntPtr(vMorrslt, 24); int iReadIdxWDD = 0; int iMonoRubyPos = Marshal.ReadInt16(vMonoRubyPos); vMonoRubyPos = (IntPtr)((int)vMonoRubyPos + 2); int i = 0; while (i < vInput.Length) { while (i < Marshal.ReadInt16(vReadIdxWDD)) { i++; if (i >= Marshal.ReadInt16(vReadIdxWDD)) { Console.WriteLine(Marshal.ReadInt16(vMonoRubyPos)); string s = vPinYin.Substring(iMonoRubyPos, Marshal.ReadInt16(vMonoRubyPos) - iMonoRubyPos); if (s != string.Empty) s = vInput.Substring(iReadIdxWDD, i - iReadIdxWDD) + "(" + s + ")"; else s = vInput.Substring(iReadIdxWDD, i - iReadIdxWDD); textBox2.AppendText(s + "\r\n"); iReadIdxWDD = i; iMonoRubyPos = Marshal.ReadInt16(vMonoRubyPos); break; } vMonoRubyPos = (IntPtr)((int)vMonoRubyPos + 2); vReadIdxWDD = (IntPtr)((int)vReadIdxWDD + 2); } vMonoRubyPos = (IntPtr)((int)vMonoRubyPos + 2); vReadIdxWDD = (IntPtr)((int)vReadIdxWDD + 2); } CoTaskMemFree(vMorrslt); vLanguage.Close(); }
转自 http://blog.sina.com.cn/s/blog_589d32f501000aya.html,不知道效果咋样,有人说会有指针漂移,俺也不懂,不知道是不是内存泄漏。过段时间要用,得看一下。
另一个例子:
string pinyin = PinYin.ToPinYin("哈哈 你好"); Console.WriteLine(pinyin);
http://files.cnblogs.com/igrl/%E6%B1%89%E5%AD%97%E8%BD%AC%E6%8B%BC%E9%9F%B3%E5%B8%A6%E5%A3%B0%E8%B0%83.rar