トップページ > 過去ログ > 記事閲覧
C#版で文字列を扱う関数の問題について
名前:deckstick 日時: 2008/08/01 11:25

C#版で入力文字列を受け取ろうとした時に、現在のDxDLL.csでは問題があります。 具体的には、引数が「out char」となっている部分が「1バイト文字1個」しか 返せないため、2文字以上や2バイト文字の取得が不可能となってしまっています。 C#(というか.Net)では、Win32なDLLからCHAR配列の文字列を取得する時は 「System.Text.StringBuilder」を使用するのがお約束のようで、その様に DxDLL.csを書き換えてとりあえず動作することが確認できたので、公式配賦に 反映されたらいいなぁと思いつつ報告します。 DxDLL.csの変更(out char を System.Text.StringBuilder にする) ※下記関数以外にも多数あるようですが、これでテストしました。DxLib.dllはそのままでOKです。 [DllImport("DxLib.dll")] extern static int dx_GetKeyInputString(System.Text.StringBuilder StrBuffer, int InputHandle); //extern static int dx_GetKeyInputString( out char StrBuffer, int InputHandle); public static int GetKeyInputString(System.Text.StringBuilder StrBuffer, int InputHandle) //public static int GetKeyInputString( out char StrBuffer, int InputHandle) { return dx_GetKeyInputString(StrBuffer, InputHandle); //return dx_GetKeyInputString( out StrBuffer , InputHandle ); } 試したC#のMain関数部分 [STAThread] static int Main() { DX.ChangeWindowMode(TRUE); DX.SetGraphMode(640, 480, 16); if (DX.DxLib_Init() == -1) return -1; // try { bool IsInput = true; int iWhite = DX.GetColor(255, 255, 255); DX.SetDrawScreen(DX.DX_SCREEN_BACK); DX.ChangeFont("MS ゴシック"); DX.SetFontSize(16); //入力結果を受け取るためのバッファ //char[] cBuf = new char[101]; System.Text.StringBuilder sBuf = new System.Text.StringBuilder(101); //キー入力ハンドルを作る(キャンセルなし全角文字有り数値入力じゃなし) int InputHandle = DX.MakeKeyInput(100, FALSE, FALSE, FALSE); DX.SetActiveKeyInput(InputHandle); // while (DX.ProcessMessage() == 0 && DX.CheckHitKey(DX.KEY_INPUT_ESCAPE) == 0) { DX.ClearDrawScreen(); if (IsInput) { if (DX.CheckKeyInput(InputHandle) != 0) { //DX.GetKeyInputString(out cBuf[0], InputHandle); //★これだと動作しても最初の1文字しか取れない、たまにエラーになることも DX.GetKeyInputString(sBuf, InputHandle); //★DLLから文字列を取得するときはStringBuilderを使うのが.Netのお約束らしい IsInput = false; } else { DX.DrawKeyInputString(10, 10, InputHandle); DX.DrawKeyInputModeString(26, 26); } } else { //DX.DrawString(10, 10, new string(cBuf), iWhite); DX.DrawString(10, 10, sBuf.ToString(), iWhite); } DX.ScreenFlip(); } return 0; } finally { DX.DxLib_End(); } }

Page: 1 |

Re: C#版で文字列を扱う関数の問題について ( No.1 )
名前:管理人 日時:2008/08/04 20:43

ご指摘ありがとうございます C#については殆ど知識がないのでアドバイスを頂けると非常に助かります 今週末にでも反映させて頂きます m(_ _)m

Page: 1 |