Windows vista + VS2005で
MFC+ダイアログベースで開発しております。
BOOL CHogeApp::InitInstance(){
(中略)
::GetModuleFileName(NULL, szFull, sizeof(szFull) / sizeof(TCHAR));
// フルパス名をドライブ名やディレクトリ名部分に分解
_tsplitpath(szFull, szDrive, szDir, NULL, NULL);
// ドライブ名とディレクトリ名部分を連結
_tmakepath(szAppDir, szDrive, szDir, NULL, NULL);
(中略)
}
としてszAppDirに実行ファイルのパスを取得しようとしているのですが
Debugモードで動作した時には実行ファイルのパスを取得できるのですが
Releaseモードで動作させた時には実行ファイルのパスの前に4Byte(123,123,-14,117)の
文字列が挿入されます。
このようなことが起こる原因&解決法がお分かりになる方がいらっしゃればご教授いた
だければ幸いです。
追記
BOOL CHogeApp::InitInstance(){
(中略)
::GetModuleFileName(NULL, szFull, sizeof(szFull) / sizeof(TCHAR));
ここの時点でszFullに4Byteの文字が挿入されてしまいます…
その szFull の定義を見せてほしいな...
>ここの時点でszFullに4Byteの文字が挿入されてしまいます…
どのようにして確認しているのでしょうか?
ローカルウィンドウとかウォッチとか?
メッセージボックスとかで表示しても出ますか?
(Releaseのデバッグ時のローカルウィンドウとかウォッチは何か正しい値が出ないときが
ある)
>4Byte(123,123,-14,117)
Byte?
マルチバイト文字セットですか?
すいません。
なぜか意図通りの動きをするようになってしまいました。
一応解決マークを付けておきます。
>tetrapod氏
szFullは
TCHAR szFull[_MAX_PATH];
と定義されています。
>Blue氏
マルチバイト文字を使用してます。
sizeof(TCHAR)は1を返してくるので、4Byteであってると思うのですが。
szFullのチェックはウォッチを使っていました。
今朝、PCを起動しMessageBoxでszFullを表示させたところ、きちんとパスが取得されて
いることが分かりました。
この状態でウォッチで見てもやはり4Byte挿入されている(ように見える)のでやはりウォ
ッチはまずいのでしょう。
しかし同時に意図した通りの動作をするようになってしまいました。
MessageBox以外の部分は何も変えていないのですが。
動けばいいと言えばいいのですが、なんとも気味が悪いですね…
>(Releaseのデバッグ時のローカルウィンドウとかウォッチは何か正しい値が出ないときが
ある)
ということでしょうかね。
CString s;
s.Format(_T(%d,%d,%d,%d), (int)szFull[0], (int)szFull[1], (int)szFull[2],
(int)szFull[4]);
AfxMessageBox(s);
で「123,123,-14,117」が表示されないのが確認できると思います。
訂正
>(int)szFull[4]
(int)szFull[3]
Realese版でデバッグしているときって最適化はどうなっているんでしょう。
最適化していたらデバッガは動かないんでしたっけ?
Realese版の設定を変えて最適化を外してデバッグ情報をつけているなら
結果的にはDebug版と変わらないような気もします。
それだったらDebug版で動かせば良いかなと。
最適化がかかっていたらウォッチはうまく行かないかもしれませんね。
>Blue氏
>CString s;
>s.Format(_T(%d,%d,%d,%d), (int)szFull[0], (int)szFull[1], (int)szFull[2],
>(int)szFull[3]);
>AfxMessageBox(s);
これでパスの先頭の4字(のASCIIコード)が取れますね。
意図したとおりに動いているようです。
>PATIO氏
最適化は/O2(実行速度)になってますが、一応Releaseモードでデバッガは起動できるよ
うですね。
ただしchar型、tchar型をウォッチするとかならず4バイトズレて見えています。
(szFull[0]から入っているべき文字列がszFull[4]から入っている)
そもそも今回の問題はiniファイルを実行ファイルと同じディレクトリに置いていて、
これを読みとり・書き込みをしていたのですが、
デバッガを起動するか否かにかかわらず、
Debug版でビルドしたものはきちんとiniファイルをオープンできるのに
Release版ではオープンできなかったために検証し始めたものだったのですが
先に述べたようにいつの間にやらRelease版でもオープンできるようになっていました。
ビルドの都合なのかもしれません。
もはや再現の使用がないのでどうにもならないですが。