- PR -

漢字の逆変換で悩んでいます

1
投稿者投稿内容
liujun
会議室デビュー日: 2006/03/11
投稿数: 5
投稿日時: 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()

Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-03-11 22:38
// どっちに付けようかちょっと悩みましたがコードが載ってるこっちで。

ImmGetContext にはウィンドウハンドルが必要です。
この Me.Handle というのはどこの値なんでしょうか?
どういうクラスでこの GetReverseConversion メソッドを宣言しているのでしょう?

それから、各 API 関数の返値を確認して失敗している関数を特定してください。

// 最近知ったこと。
// System.Windows.Forms.InputLanguage クラスの Handle プロパティで GetKeyboardLayout の代用ができる。

[ メッセージ編集済み 編集者: Hongliang 編集日時 2006-03-11 22:41 ]
liujun
会議室デビュー日: 2006/03/11
投稿数: 5
投稿日時: 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
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-12 00:26
引用:

liujunさんの書き込み (2006-03-11 22:49) より:

Dim str As String = System.Text.Encoding.Unicode.GetString(buf, os, buf.Length - os - 3)


ここで、引数の値が不正になっているということは、
それまでの関数で失敗しているものがあるということです。
hIMC, hKL, dwSize... などの値を確認しましょうということです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
liujun
会議室デビュー日: 2006/03/11
投稿数: 5
投稿日時: 2006-03-12 01:44
vb.net中できますが、何故同じプログラムでVB.ASP中できませんでしたか?
誰が手伝ってくれませんか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-03-12 20:19
なぜ、自分の国のサイトで質問しないのですか?
(あなたの日本語は難しい)
1

スキルアップ/キャリアアップ(JOB@IT)