- - PR -
漢字の逆変換で悩んでいます
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-03-11 22:06
こんにちは!
vb.netの中に実行するのは正確です。 何故Asp中にエラーが出ましたか。 皆さんお願いいたします。 imm32.dllの呼び出しを、属性を使うようにしました。 コード: -------------------------------------------------------------------------------- Public Class WR_Imm32 Public Enum GCL As Integer CONVERSION = &H1 REVERSECONVERSION = &H2 REVERSE_LENGTH = &H3 End Enum <DllImport("Imm32.dll", CharSet:=CharSet.Auto, entrypoint:="ImmGetContext")> _ Public Shared Function ImmGetContext(ByVal hWnd As IntPtr) As IntPtr End Function <DllImport("User32.dll", CharSet:=CharSet.Auto, entrypoint:="GetKeyboardLayout")> _ Public Shared Function GetKeyboardLayout(ByVal idThread As Integer) As IntPtr End Function <DllImport("Imm32.dll", CharSet:=CharSet.Auto, entrypoint:="ImmGetConversionList")> _ Public Shared Function ImmGetConversionList(ByVal hKL As IntPtr, ByVal hIMC As IntPtr, ByVal lpSrc As String, ByVal lpDst As IntPtr, ByVal dwBufLen As Integer, ByVal uFlag As Integer) As Integer End Function <DllImport("Imm32.dll", CharSet:=CharSet.Auto, entrypoint:="ImmReleaseContext")> _ Public Shared Function ImmReleaseContext(ByVal hWnd As IntPtr, ByVal hIMC As IntPtr) As Boolean End Function <StructLayout(Runtime.InteropServices.LayoutKind.Sequential)> _ Public Class CANDIDATELIST Public dwSize As Integer Public dwStyle As Integer Public dwCount As Integer Public dwSelection As Integer Public dwPageStart As Integer Public dwPageSize As Integer Public dwOffset As Integer End Class End Class Public Function GetReverseConversion(ByVal AText As String) As String() Dim hIMC As IntPtr = WR_Imm32.ImmGetContext(Me.Handle) Dim hKL As IntPtr = WR_Imm32.GetKeyboardLayout(0) Dim list As New WR_Imm32.CANDIDATELIST Dim dwSize As Integer = WR_Imm32.ImmGetConversionList(hKL, hIMC, AText, IntPtr.Zero, 0, WR_Imm32.GCL.REVERSE_LENGTH) Dim BufList As IntPtr = Marshal.AllocHGlobal(dwSize) WR_Imm32.ImmGetConversionList(hKL, hIMC, AText, BufList, dwSize, WR_Imm32.GCL_REVERSECONVERSION) Marshal.PtrToStructure(BufList, list) Dim buf(dwSize) As Byte Marshal.Copy(BufList, buf, 0, dwSize) Marshal.FreeHGlobal(BufList) Dim os As Integer = list.dwOffset Dim str As String = System.Text.Encoding.Unicode.GetString(buf, os, buf.Length - os - 3) ' 注意 ' Dim par() As Char = "\0".ToCharArray() 削除 ' Dim strList() As String = str.Split(par) ↓変更 Dim strList() As String = str.Split(New Char() {ControlChars.NullChar}) WR_Imm32.ImmReleaseContext(Me.Handle, hIMC) Return strList End Function vb.netの中に実行するのは正確です。 何故Asp中にエラーが出ましたか。 皆さんお願いいたします。 [ArgumentOutOfRangeException: 負の値ではない数値が必要です。 パラメータ名 : index] System.Text.UnicodeEncoding.GetCharCount(Byte[] bytes, Int32 index, Int32 count) +182 System.Text.Encoding.GetChars(Byte[] bytes, Int32 index, Int32 count) +28 System.Text.Encoding.GetString(Byte[] bytes, Int32 index, Int32 count) +15 vbImeConvert.vbImeConvert.GetReverseConversion(String AText) houshi.Meibo_add.ImeConvert2_Click(Object sender, EventArgs e) System.Web.UI.WebControls.Button.OnClick(EventArgs e) System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) System.Web.UI.Page.ProcessRequestMain() | ||||
|
投稿日時: 2006-03-11 22:38
// どっちに付けようかちょっと悩みましたがコードが載ってるこっちで。
ImmGetContext にはウィンドウハンドルが必要です。 この Me.Handle というのはどこの値なんでしょうか? どういうクラスでこの GetReverseConversion メソッドを宣言しているのでしょう? それから、各 API 関数の返値を確認して失敗している関数を特定してください。 // 最近知ったこと。 // System.Windows.Forms.InputLanguage クラスの Handle プロパティで GetKeyboardLayout の代用ができる。 [ メッセージ編集済み 編集者: Hongliang 編集日時 2006-03-11 22:41 ] | ||||
|
投稿日時: 2006-03-11 22:49
こんにちは!
お返事ありがとう! ASPのなかハンドルがなくなりそうですが、下は僕が作ったポログラムーです。 しかし問題もうあります。僕先言った通り問題です。 VB.netとVB.Aspは違うと思っています。 お願いいたします。 Public Class vbImeConvert Public Enum GCL As Integer CONVERSION = &H1 REVERSECONVERSION = &H2 REVERSE_LENGTH = &H3 End Enum <DllImport("Imm32.dll", CharSet:=CharSet.Auto, entrypoint:="ImmGetContext")> _ Public Shared Function ImmGetContext(ByVal hWnd As IntPtr) As IntPtr End Function <DllImport("Imm32.dll", CharSet:=CharSet.Auto, entrypoint:="ImmCreateContext")> _ Public Shared Function ImmCreateContext() As IntPtr End Function <DllImport("User32.dll", CharSet:=CharSet.Auto, entrypoint:="GetKeyboardLayout")> _ Public Shared Function GetKeyboardLayout(ByVal idThread As Integer) As IntPtr End Function <DllImport("Imm32.dll", CharSet:=CharSet.Auto, entrypoint:="ImmGetConversionList")> _ Public Shared Function ImmGetConversionList(ByVal hKL As IntPtr, ByVal hIMC As IntPtr, ByVal lpSrc As String, ByVal lpDst As IntPtr, ByVal dwBufLen As Integer, ByVal uFlag As Integer) As Integer End Function <DllImport("Imm32.dll", CharSet:=CharSet.Auto, entrypoint:="ImmReleaseContext")> _ Public Shared Function ImmReleaseContext(ByVal hWnd As IntPtr, ByVal hIMC As IntPtr) As Boolean End Function <StructLayout(Runtime.InteropServices.LayoutKind.Sequential)> _ Public Class CANDIDATELIST Public dwSize As Integer Public dwStyle As Integer Public dwCount As Integer Public dwSelection As Integer Public dwPageStart As Integer Public dwPageSize As Integer Public dwOffset As Integer End Class Public Shared Function GetReverseConversion(ByVal AText As String) As String() Dim hIMC As IntPtr = ImmCreateContext() 'ImmSetConversionStatus(hIMC, 64, 1) Dim hKL As IntPtr = vbImeConvert.GetKeyboardLayout(0) Dim list As New vbImeConvert.CANDIDATELIST Dim dwSize As Integer = vbImeConvert.ImmGetConversionList(hKL, hIMC, AText, IntPtr.Zero, 0, vbImeConvert.GCL.REVERSE_LENGTH) Dim BufList As IntPtr = Marshal.AllocHGlobal(dwSize) vbImeConvert.ImmGetConversionList(hKL, hIMC, AText, BufList, dwSize, vbImeConvert.GCL.REVERSECONVERSION) Marshal.PtrToStructure(BufList, list) Dim buf(dwSize) As Byte Marshal.Copy(BufList, buf, 0, dwSize) Marshal.FreeHGlobal(BufList) Dim os As Integer = list.dwOffset Dim str As String = System.Text.Encoding.Unicode.GetString(buf, os, buf.Length - os - 3) Dim strList() As String = str.Split(New Char() {ControlChars.NullChar}) vbImeConvert.ImmReleaseContext(hIMC, hIMC) Return strList End Function | ||||
|
投稿日時: 2006-03-12 00:26
ここで、引数の値が不正になっているということは、 それまでの関数で失敗しているものがあるということです。 hIMC, hKL, dwSize... などの値を確認しましょうということです。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2006-03-12 01:44
vb.net中できますが、何故同じプログラムでVB.ASP中できませんでしたか?
誰が手伝ってくれませんか? | ||||
|
投稿日時: 2006-03-12 20:19
なぜ、自分の国のサイトで質問しないのですか?
(あなたの日本語は難しい) |
1