トップページ > 記事閲覧
GetModuleFileNameAとDrawString
名前:itohii 日時: 2020/03/05 01:52

char CurrentDir[256]; GetModuleFileName(NULL, CurrentDir, sizeof(CurrentDir) / sizeof(CurrentDir[0])); DrawString(0, 0,CurrentDir, WHITE); ↑をしたいのですが GetModuleFileNameで取得したパスの中に日本語が入っていると (例えば日本語のフォルダにexeファイルを入れている時など) DrawStringが日本語の所で途中で途切れてしまいます。 GetModuleFileNameを使ってファイル処理するのも、これのせいでうまくいきません。 どうしたらよいでしょう。
メンテ

Page: 1 |

Re: GetModuleFileNameAとDrawString ( No.1 )
名前:管理人 日時:2020/03/06 03:49

載せていただいたプログラムを使って以下のようなプログラムを組んで #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int x, add ; // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // メインループ while( ProcessMessage() == 0 ) { // 画面のクリア ClearDrawScreen() ; char CurrentDir[256]; GetModuleFileName(NULL, CurrentDir, sizeof(CurrentDir) / sizeof(CurrentDir[0])); DrawString(0, 0,CurrentDir, GetColor( 255,255,255 )); // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } 作成したプログラムを『D:\テストフォルダ』というフォルダの中で実行してみたのですが、画面には D:\テストフォルダ\Test.exe と、正常にフォルダ名で途切れず表示されました itohiiさんはどのような日本語名のフォルダで試されたのでしょうか?
メンテ
Re: GetModuleFileNameAとDrawString ( No.2 )
名前:itohii 日時:2020/03/06 10:41

返信ありがとうございます。 自分は例えば C:\Users\itohi\Desktop\だ\Test.exe で実行したいところ C:\Users\itohi\Desktop\ と表示されてしまいます。 以前友人に試しに動かしてもらったところ、 ユーザ名(↑だったらitohiにあたるところ)が日本語にしているらしく C:\User\○○(ユーザ名)\Game\Test.exe としたい所、 C:\User\ と表示されていることが発覚しました。
メンテ
Re: GetModuleFileNameAとDrawString ( No.3 )
名前:みけ 日時:2020/03/06 17:51

GetModuleFileNameの動作がどうなっているか判らないので GetModuleFileName直後のCurrentDirメモリー内容を記載すれば管理人様が解決しやすいかも。 あと、下記の場合はどうかしら? printfDx("\n\n%s\n", __argv[0]);
メンテ
Re: GetModuleFileNameAとDrawString ( No.4 )
名前:管理人 日時:2020/03/06 22:15

ご返答ありがとうございます うーん、やはり私の手元では問題なく動作します PCに『日本語テストユーザー』というローカルアカウントを作成して、 ドキュメントフォルダで No.1 のプログラムを実行したところ、問題なく C:\Users\日本語テストユーザー\Documents\Test.exe と表示されました お使いのDXライブラリのバージョンは幾つでしょうか? もしかしたら最新版のDXライブラリでしたら正常に動作するかもしれませんので、 よろしければこちらの暫定最新バージョンをお試しになってみてください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
メンテ
Re: GetModuleFileNameAとDrawString ( No.5 )
名前:itohii 日時:2020/03/07 00:58

ご返信ありがとうございます。 Ver 3.21 です。 申し訳ないのですが、最新バージョンを入れてリビルドしても同様に表示できませんでした…。
メンテ
Re: GetModuleFileNameAとDrawString ( No.6 )
名前:管理人 日時:2020/03/08 01:36

お試しいただきありがとうございます 最新版でも駄目でしたか…うーん、不思議ですね… ふと気になったのですが、 C:\User\○○(ユーザ名)\Game\Test.exe の場合正常に描画されないとのことですが、 DrawString( 0, 0, "C:\User\○○(ユーザ名)\Game\Test.exe", GetColor( 255,255,255 ) ); と、GetModuleFileName で取得できる文字列を直接プログラム中に記述して DrawString を実行した場合も『C:\User\』しか描画されないのでしょうか? あと、手元で No.1 の書き込みのプログラムをビルドした実行ファイルをこちらに アップしましたので、よろしければこちらの実行ファイルでも同様の日本語文字が 表示されない結果になってしまうかお試しになってみてください m(_ _;m https://dxlib.xsrv.jp/temp/GetModuleFileNameTest.zip
メンテ
Re: GetModuleFileNameAとDrawString ( No.7 )
名前:itohii 日時:2020/03/09 00:50

ご返事ありがとうございます。 DrawString( 0, 0, "C:\User\○○(ユーザ名)\Game\Test.exe", GetColor( 255,255,255 ) ); 直接の描画もダメでした。 管理人様のexeうまくいきました! 同じく「だ」のフォルダに入れてみたら表示できました! 環境や設定が間違っているのでしょうか…?
メンテ
Re: GetModuleFileNameAとDrawString ( No.8 )
名前:管理人 日時:2020/03/09 05:08

お試しいただきありがとうございます 直接でも駄目でしたか… ただ、exeでは正常に表示されたとのことで、何よりです そういえば、もしかしたら重要なことをお聞きし忘れていたかもしれないのですが、 お使いの開発環境は何でしょうか?( VisualStudio2019 や BorlandC++ Compiler など )
メンテ
Re: GetModuleFileNameAとDrawStr ( No.9 )
名前:itohii 日時:2020/03/09 13:06

VisualStudio 2017 communityです。
メンテ
Re: GetModuleFileNameAとDrawString ( No.10 )
名前:管理人 日時:2020/03/11 00:23

ご返答ありがとうございます VisualStudio 2017 Community でしたら私と同じ環境ですね… うーん、謎です… 大変お手数で申し訳ないのですが、プロジェクトの設定などが関係しているかもしれませんので 直接 DrawString( 0, 0, "C:\User\○○(ユーザ名)\Game\Test.exe", GetColor( 255,255,255 ) ); を呼んでいる『文字列が途中で途切れて正常に描画されない』状態のプログラムを、 プロジェクトのフォルダごとzipファイルに圧縮してギガファイル便などのアップローダーに アップしていただけないでしょうか? プログラム以外に何か原因が無いか調べてみたいと思います m(_ _;m
メンテ
Re: GetModuleFileNameAとDrawString ( No.11 )
名前:itohii 日時:2020/03/12 00:00

https://14.gigafile.nu/0510-ddca8ff351ca9fbe33c6312abbd7e8e43 こちらになります。 よろしくお願いします。 対応まことにありがとうございます…。
メンテ
Re: GetModuleFileNameAとDrawString ( No.12 )
名前:はるかぜ 日時:2020/03/12 09:19

//文字コード設定 SetUseCharCodeFormat(DX_CHARCODEFORMAT_UTF8); これが書かれていることが原因ですね。 この行を削除すれば正常に動作します。 どうしてもDX_CHARCODEFORMAT_UTF8を使用したいのであればこの掲示板のワード検索で SetUseCharCodeFormat で検索すると役に立ちそうな情報がでてきます。
メンテ
Re: GetModuleFileNameAとDrawString ( No.13 )
名前:itohii 日時:2020/03/12 10:13

……治りました……。 ほんとバカバカしい原因で申し訳ありません……。 何日も対応ありがとうございました…。
メンテ
Re: GetModuleFileNameAとDrawString ( No.14 )
名前:管理人 日時:2020/03/13 03:19

原因が分かったようで何よりです GetModuleFileName などで得られる文字列や、VisualStudio の通常の文字列リテラルは シフトJIS形式なので、SetUseCharCodeFormat(DX_CHARCODEFORMAT_SHIFTJIS); を実行している 状態と同じになります 紛らわしいことに多くの文字コード形式で英数字記号などの半角文字は文字コードが一致しているので 扱う文字コードと、SetUseCharCodeFormat で設定する文字コード形式が不一致でも英数字記号だけは 正常に表示されてしまい、全角文字だけ正常に表示されない、という状態になります… ( 半角英数字も文字コード形式毎に全く異なれば、1文字目から表示されなかったり文字化けしたりして 直ぐに文字コードが違っていると気付けるのですが… ) 私ももっと早く気付くべきでした… > はるかぜさん 対応が遅い私の代わりにご返答いただきありがとうございます m(・・;m
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存