質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

パス

パス(path)はファイルシステムの場所(階層)を明示したものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

Q&A

解決済

2回答

2259閲覧

GetModuleFileName と DXライブラリのDrawString

itohii0626

総合スコア16

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

パス

パス(path)はファイルシステムの場所(階層)を明示したものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

0グッド

0クリップ

投稿2020/03/04 17:06

編集2020/03/06 04:26

C++

1char CurrentDir[256]; 2GetModuleFileName(NULL, CurrentDir, sizeof(CurrentDir) / sizeof(CurrentDir[0])); 3DrawString(0, 0,CurrentDir, WHITE);

↑をしたいのですが
GetModuleFileNameで取得したパスの中に日本語が入っていると
(例えば日本語のフォルダにexeファイルを入れている時など)
DrawStringが日本語の所で途中で途切れてしまいます。

どうしたらよいでしょう。


状況を載せます

(制作を進めている事情で最後のexe名は表示していません)

半角英数字のみ
イメージ説明

この"da"のフォルダ名を"だ"にすると

イメージ説明

となります。

C:\User\itohi\Desktop\だ\○○.exe としたいのですが
どうしたらよいでしょう。

不足申し訳ありません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2020/03/05 04:03

> 例えば日本語のフォルダにexeファイルを入れている時など その日本語の名前のフォルダーとは、具体的にどのようなものでしょうか。 "C:\Users\日本語ユーザー名\Documents\日本語フォルダー1\日本語フォルダー2" ....などと全体を例示してください。
itohii0626

2020/03/05 14:22

例示これでよろしいでしょうか。わかりづらく申し訳ありません
Bull

2020/03/05 23:40

いくつか確認させて下さい。 GetModuleFileName で正しくパス名は取得されているのでしょうか? DrawString に直接パス名を指定したら、どうなりますか? DrawString("C:\User\itohi\Desktop\だ\○○.exe", ...) フォントを変更していますか?
itohii0626

2020/03/06 01:49

DrawString(0, 0,"C:\\User\\itohi\\Desktop\\だ\\Test.exe", GetColor(255,255,255)); これでやってみましたが C:\User\itohi\Desktop\ となりました。 フォント変更はしていません。
dodox86

2020/03/06 01:55

Visual Studio のビルド(コンパイル)オプションは、マルチバイト文字(UNICODEではない)を指定していますか? GetModuleFileName ではなく、GetModuleFileNameA(マルチバイト文字用)で試すとどうなりますか?
itohii0626

2020/03/06 02:21

マルチバイト文字です。 GetModuleFileNameAでも、こうなってしまいます。
dodox86

2020/03/06 02:22

お使いのWindowsやVisual Studio のバージョンも示しましょう。(質問欄に追記ください)
dodox86

2020/03/06 02:26

> GetModuleFileNameを使ってファイル処理するのも、これのせいでうまくいきません。 ちょっと分からないのですが、ファイルの処理自体と表示の問題は別のはずなのですが。Bullさんの問い合わせにもあるように、GetModuleFileNameによるPATH自体の取得は正しくできているのですよね。
Bull

2020/03/06 02:38

DrawString に直接文字列を指定しても日本語が表示されないとすると、環境の問題かも知れません。 そうなると私にはもう手に負えないです。 https://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi? でも質問されているようなので、解決したら結果を報告して頂けると幸いです。
itohii0626

2020/03/06 03:37

Windows バージョン 1903 OSビルド 18362.657 です 取得自体はできています。 ファイル処理するパスを設定するのに、GetModuleFileNameを取得してから対象のファイル名を設定しないと、処理してくれない状況なのです。 そこから直した方がいい気がしてきました…。すみませんお手数をおかけしてます…
dodox86

2020/03/06 03:46

> そこから直した方がいい気がしてきました…。すみませんお手数をおかけしてます… 先にも書いたように、今のところDrawStringで日本語が表示されないことが問題になっています。GetModuleFileNameでPATH取得できているのであれば、単に表示の問題です。DrawStringで表示できないことを質問の主旨とするならこのまま続行でしょうし、DrawStringは放っておいて、本当にやりたいファイル処理が完成できることで質問者さんが満足するのであれば、回答の流れが変わると思います。DrawStringで表示できない問題は放置されますが。今現在は表示ができないだけで、データはそろっているのですから、やりたいファイル処理自体は内部ではできるはずです。
itohii0626

2020/03/06 03:49

ごめんなさい。訂正します。 やりたいファイル処理は出来てます。 ただ、「この場所にファイルがあります。」「ここにファイルはありません。」という表示・描画に関する機能にDXライブラリとGetModuleFileNameを使っており、それが出来なくて困っている状況です。
itohii0626

2020/03/06 03:50

dodoxさんの仰る通りです。書き下手で 申し訳ありません。
dodox86

2020/03/06 03:57 編集

> https://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi? でも質問されているようなので そうだったのですね。(当該サイトを確認しました)マルチポストですね。禁止ではないものの、teratailでは推奨されない行為とされています。 参考「マルチポストの使い方がわかりません。」(https://teratail.com/questions/56963) あちらのサイト様の方が本家ですし、こちらでの回答も混乱も生むので、途中で申し訳ありませんが今後はコメントを控えさせていただきます。すみません。
itohii0626

2020/03/06 04:22

お騒がせして申し訳ありません。
guest

回答2

0

自己解決

解決しました。

全体の初期化の時に
SetUseCharCodeFormat(DX_CHARCODEFORMAT_UTF8);
を書いていたのが原因でした。

DXライブラリはシフトJISで処理していくので、
変えたらマズいとのことでした。

解答・閲覧してくださった方本当にありがとうございました。
そしてご迷惑をおかけし申し訳ありません。

投稿2020/03/12 01:21

itohii0626

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Bull

2020/03/12 01:29

ご報告ありがとうございました。 解決して良かったです。
guest

0

あくまで私の古い記憶でしかありませんが、DXライブラリのDrawStringは日本語でも描画は行えたはずです。しかし、GetModuleFileNameはパスに全角が入っていると無理だったような気かします。半角英数字オンリーだった気がします。ユーザー名の時点で全角が入ってしまっている場合は、ユーザーから作り直しをお勧め致します。

投稿2020/03/05 00:43

stdio

総合スコア3307

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Bull

2020/03/05 02:19

DrawString は日本語の描画は出来ます。マルチバイト文字列でも UNICODE 文字列でも大丈夫です。 GetModuleFileName も日本語のフォルダー/ファイル名でも取得できるはずです。さっき確かめたので間違いないかと。 char [] なので、Shift_JIS (CP932) 以外の文字列はダメですけど。
dodox86

2020/03/05 03:47

> ああ、分かりました。「sizeof(CurrentDir) / sizeof(CurrentDir[0])」ですね。 いえ、これで256になるので、とりあえず問題は無いはずです。MAX_PATH(260)未満でPATH文字列の末尾が切れることがあっても、日本語表示に影響は無いです。
dodox86

2020/03/05 03:52 編集

ああ、日本語表示の途中で切れること自体が問題なのか。長いPATH名でそうなってしまうのであれば、stdioさんのMAX_PATHの指摘にあたるかもしれませんね。
stdio

2020/03/05 04:57

かなり深い階層にデータを格納してしまっているが、原因だと考えられますね。 もしくは、DXライブラリということはゲームを制作されているのでしょう。タイトルが物凄く長くて、そのタイトルをそのままプロジェクト名にしてしまったかのどちらかですね。
itohii0626

2020/03/05 14:30

状況を追加いたしました。わかりづらく申し訳ありません。 まだ解決はしておりません。やはり無理でしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問