ページ 11

dllでのGetCurrentDirectoryについて

Posted: 2011年3月22日(火) 10:58
by dic
おかげさまで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内で、現在のディレクトリを取得するというのは無理なのでしょうか?

Re: dllでのGetCurrentDirectoryについて

Posted: 2011年3月22日(火) 11:09
by softya(ソフト屋)
どうみてもワイド文字(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 がワイド文字じゃなかった場合はファイル名が文字化けすると思います。

Re: dllでのGetCurrentDirectoryについて

Posted: 2011年3月22日(火) 12:55
by dic
>>softyaさん

コード:

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


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

Re: dllでのGetCurrentDirectoryについて

Posted: 2011年3月22日(火) 13:17
by しひ
GetCurrentDirectoryA()を使うとか。

Re: dllでのGetCurrentDirectoryについて

Posted: 2011年3月22日(火) 14:25
by softya(ソフト屋)
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対応している前提ですが。

Re: dllでのGetCurrentDirectoryについて

Posted: 2011年3月22日(火) 17:00
by ISLe
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の戻り値を調べてみては?

カレントディレクトリ相対なら"."を基準にすれば良い気がしますけど。
(追記)ログ出力テキストでしたね。勘違い失礼しました。

Re: dllでのGetCurrentDirectoryについて

Posted: 2011年3月22日(火) 17:17
by dic
開発環境はVC++6.0なのでデフォルトでUNICODEは定義されてないので
自動でGetCurrentDirectoryA になるのでここはいいと思います

でも

コード:

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

Re: dllでのGetCurrentDirectoryについて

Posted: 2011年3月22日(火) 17:18
by softya(ソフト屋)
あっ、dicさんすいません。
swprintfと混同したようです。
ISLeさん、ありがとうございます。

Re: dllでのGetCurrentDirectoryについて

Posted: 2011年3月22日(火) 17:36
by dic

コード:

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の名前で衝突していたと思います
解決しました ありがとうございました