dllでのGetCurrentDirectoryについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

dllでのGetCurrentDirectoryについて

#1

投稿記事 by dic » 14年前

おかげさまでdllが完成しました
が、ログファイルに現在にディレクトリを出力するようにしてるところで問題がありました

dllソース内で

コード:

	char	szLog[MAX_PATH];
	char	dir[MAX_PATH];
	GetCurrentDirectory( MAX_PATH, dir );
	wsprintf( szLog, "FileName: %s\\%s を ロードしました。\n", dir, filename );
	sLogdraw.PutLog( szLog ); // ファイルに書き込む ここはチェック済み
ここでのGetCurrentDirectoryは、dllを作ったところのディレクトリが埋め込まれているのか
もしくは、このdllを利用しているexeのディレクトリを取得するのか ためしたところ

FileName: ・・\image\ブロック.bmp を ロードしました。

とディレクトリのところだけ文字化けしていました
dll内で、現在のディレクトリを取得するというのは無理なのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: dllでのGetCurrentDirectoryについて

#2

投稿記事 by softya(ソフト屋) » 14年前

どうみてもワイド文字(UNICODE)とSJISのコードが混在してますので全部をワイド文字に統一してください。

コード:

    WCHAR    szLog[MAX_PATH];
    WCHAR    dir[MAX_PATH];
    GetCurrentDirectory( MAX_PATH, dir );
    wsprintf( szLog, L"FileName: %s\\%s を ロードしました。\n", dir, filename );
    sLogdraw.PutLog( szLog ); // ファイルに書き込む ここはチェック済み
ここの中でfilename がワイド文字じゃなかった場合はファイル名が文字化けすると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

Re: dllでのGetCurrentDirectoryについて

#3

投稿記事 by dic » 14年前

>>softyaさん

コード:

	wsprintf( szLog, "FileName: %s\\%s を ロードしました。\n", dir, filename );


	sprintf( szLog, "FileName: %s\\%s を ロードしました。\n", dir, filename );
ワイド文字は使わないので wsprintfを sprintfに変更してみたのですがやはりだめでした
filenameもcharです

しひ

Re: dllでのGetCurrentDirectoryについて

#4

投稿記事 by しひ » 14年前

GetCurrentDirectoryA()を使うとか。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: dllでのGetCurrentDirectoryについて

#5

投稿記事 by softya(ソフト屋) » 14年前

SJISで統一するなら、しひさんの言うとりGetCurrentDirectoryA()を使えば出来ます。

コード:

    char    szLog[MAX_PATH];
    char    dir[MAX_PATH];
    GetCurrentDirectoryA( MAX_PATH, dir );
    sprintf( szLog, "FileName: %s\\%s を ロードしました。\n", dir, filename );
    sLogdraw.PutLog( szLog ); // ファイルに書き込む ここはチェック済み
sLogdraw.PutLogがSJIS対応している前提ですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: dllでのGetCurrentDirectoryについて

#6

投稿記事 by ISLe » 14年前

wsprintfのwはwideじゃなくてwindowsのwです。
Win32 APIなので、wsprintfAを使えばCRTライブラリが不要になります。

コード:

    char    szLog[MAX_PATH];
    char    dir[MAX_PATH];
    GetCurrentDirectoryA( MAX_PATH, dir );
    wsprintfA( szLog, "FileName: %s\\%s を ロードしました。\n", dir, filename );
    sLogdraw.PutLog( szLog ); // ファイルに書き込む ここはチェック済み
GetCurrentDirectoryAの戻り値を調べてみては?

カレントディレクトリ相対なら"."を基準にすれば良い気がしますけど。
(追記)ログ出力テキストでしたね。勘違い失礼しました。
最後に編集したユーザー ISLe on 2011年3月22日(火) 18:22 [ 編集 1 回目 ]

dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

Re: dllでのGetCurrentDirectoryについて

#7

投稿記事 by dic » 14年前

開発環境はVC++6.0なのでデフォルトでUNICODEは定義されてないので
自動でGetCurrentDirectoryA になるのでここはいいと思います

でも

コード:

	sLogdraw.PutLog( "DirectDrawログファイル:2011/03/22\n" );
を追加したんですが、反映されません
どこか別の問題かもしれないので慎重に調べます

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: dllでのGetCurrentDirectoryについて

#8

投稿記事 by softya(ソフト屋) » 14年前

あっ、dicさんすいません。
swprintfと混同したようです。
ISLeさん、ありがとうございます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

Re: dllでのGetCurrentDirectoryについて

#9

投稿記事 by dic » 14年前

コード:

winbase.h の途中
#ifdef UNICODE
#define GetCurrentDirectory  GetCurrentDirectoryW
#else
#define GetCurrentDirectory  GetCurrentDirectoryA
#endif // !UNICODE

winuser.hの途中
#ifdef UNICODE
#define wvsprintf  wvsprintfW
#else
#define wvsprintf  wvsprintfA
#endif // !UNICODE
とあるので、大丈夫でした

>>wsprintfのwはwideじゃなくてwindowsのwです。
>>Win32 APIなので、wsprintfAを使えばCRTライブラリが不要になります。
そうだったんですね
wideの略かと勘違いしました


現在作成しているdllの名前が dll.dll なので別の名前にしたらうえの追加したログも
GetCurrentDirectoryも期待どおりに動作しました
dllの名前で衝突していたと思います
解決しました ありがとうございました

閉鎖

“C言語何でも質問掲示板” へ戻る