DrawKeyInputStringの挙動
hティーティーp://dxlib.o.oo7.jp/cgi/patiobbs/patio.cgi?mode=view&no=4396
で問題の本質がDrawKeyInputStringではなかったので別スレ立てさせていただきました。
GuruGuruSMFという、音声再生ライブラリとdxライブラリを併用しているのですが、
GuruGuruSMFのサイト様 : hティーティーp://gurugurusmf.migmig.net/
これらの初期化と後処理関数を呼ぶ順番の微妙な違いでDrawKeyInputStringの挙動がおかしくなったりするようです。
GuruGuruSMFのバージョンはver.4.0.6最新版、cppのスタティックリンク版使用です。
再現コードを示します。
(GuruGuruSMF4_Cpp_Static.cppをプロジェクトに含め、GuruGuruSMF4_Cpp.hとGuruGuruSMF4.libへのパスを通し、
GuruGuruSMF4.dllを適切な場所に置いた状態で)
main.cppの内容:
#pragma comment (lib,"GuruGuruSMF4.lib")
#include <iostream>
#include "DxLib.h"
#include "GuruGuruSMF4_Cpp.h"
void dxlibInit() {
ChangeWindowMode(true); //ウインドウモードにする
SetWindowSize(640, 480);
if (DxLib_Init() == -1) // DXライブラリ初期化処理
{
return; // エラーが起きたら直ちに終了
}
SetDrawScreen(DX_SCREEN_BACK); //描画先を裏画面に設定
}
void ggsInit() {
GGSINITIALIZE();
GGS->OpenDevice(GuruGuruSmf::Device::DirectMusic, NULL);
}
void ggsEnd() {
GGS->CloseDevice(); //ここの順が逆で記事修正しましたがどっちでも影響ないです
GGSFREE();
}
void update() {
char String[256];
int InputHandle;
// キー入力ハンドルを作る(キャンセルなし全角文字有り数値入力じゃなし)
InputHandle = MakeKeyInput(255, FALSE, FALSE, FALSE);
// 作成したキー入力ハンドルをアクティブにする
SetActiveKeyInput(InputHandle);
// キー入力終了待ちループ
// (ProcessMessageをループごとに行う)
while (!ProcessMessage()) {
// 入力が終了している場合は終了
if (CheckKeyInput(InputHandle) != 0) break;
// 画面の初期化
ClearDrawScreen();
// 入力モードを描画
DrawKeyInputModeString(640, 480);
// 入力途中の文字列を描画
DrawKeyInputString(0, 0, InputHandle);
// 裏画面の内容を表画面に反映させる
ScreenFlip();
}
// 入力された文字列を取得
GetKeyInputString(String, InputHandle);
// 用済みのインプットハンドルを削除する
DeleteKeyInput(InputHandle);
// 画面の初期化
ClearDrawScreen();
// 入力された文字列を画面に表示する
DrawString(0, 0, "あなたが入力した文字列は", GetColor(255, 255, 255));
DrawString(0, 16, String, GetColor(255, 255, 255));
// 裏画面の内容を表画面に反映させる
ScreenFlip();
// キー入力待ち
WaitKey();
}
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
???????
??????
update();
??????
?????
return 0;
}
main.cppの内容(終わり):
WinMainの部分ですが、
(A)
ggsInit();
dxlibInit();
update();
DxLib_End();
ggsEnd();
の場合、DrawKeyInputStringの入力中の全角文字やDrawKeyInputModeStringの文字がが表示されない不具合が発生する。
(B)
dxlibInit();
ggsInit();
update();
ggsEnd();
DxLib_End();
の場合、DxLib_End()実行時に不正アクセスで落ちる(Dxlibのバージョンver3.18以降、それ以前では正常に動作)
0x74F8C22F (msctf.dll) で例外がスローされました (TestDxlibApp.exe 内): 0xC0000005: 場所 0x730E2388 の読み取り中にアクセス違反が発生しました
(C)
dxlibInit();
ggsInit();
update();
DxLib_End();
ggsEnd();
この順番だと何故か正常に動作、しかしInitとEndの順番が一貫しておらず気持ち悪く、今後も動くかが不安
となります。私も何が原因かよく分かりません・・・
何かわかる方はおりませんでしょうか・・・