環境: VC++2008
下記のコードをビルドすると、何故か_wsplitpath_sのところで「アクセス違反」がでてきて、止まってしまいます。色々と書き換えたり、デバッグしたりして、原因を特定しようとしているのですが、理由が全くわからないので困っています。問題点を指摘していただきたいです。お願いします。
#include <windows.h>
#include <stdlib.h>
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst,
LPSTR CmdLine, int nShowCmd)
{
TCHAR Drive[_MAX_DRIVE], Dir[_MAX_DIR],
FullPath[_MAX_PATH], Path[_MAX_PATH];
memset(FullPath, 0x00, sizeof(FullPath));
memset(Path, 0x00, sizeof(Path));
memset(Drive, 0x00, sizeof(Drive));
memset(Dir, 0x00, sizeof(Dir));
if(0 == GetModuleFileName(NULL, FullPath,
sizeof(FullPath))){
MessageBox(NULL, TEXT("GetModuleFileName関数の失敗"),
TEXT("エラー"), MB_ICONERROR | MB_OK);
}
_wsplitpath_s(FullPath, Drive, sizeof(Drive),
Dir, sizeof(Dir), NULL, NULL, NULL, NULL);
wcscat_s(Path, sizeof(Path), Drive);
wcscat_s(Path, sizeof(Path), Dir);
MessageBox(NULL, Path, TEXT("パス"), MB_OK);
return 0;
}
とりあえず、TCHARを対象にするのであれば、_wsplitpath_sよりも_tsplitpath_sを使いましょう。
>sizeof(Drive)
>sizeof(Dir)
が問題です。
TCHAR=wchar_tのとき、wchar_t単位の文字数を指定するところバイト数を指定してしまいます。
正しくは、sizeof(Drive) / sizeof(Drive[0])、sizeof(Dir) / sizeof(Dir[0]) となります。
また size_t の値に NULL はちょっと気持ち悪いので 0 を指定するのと、
_countofマクロを使うと、
_tsplitpath_s(FullPath, Drive, _countof(Drive), Dir, _countof(Dir), NULL, 0, NULL, 0);
となります。
MSDN
_splitpath_s、_wsplitpath_s
http://msdn.microsoft.com/ja-jp/library/8e46eyt7(VS.80).aspx
_countof マクロ
http://msdn.microsoft.com/ja-jp/library/ms175773(VS.80).aspx
GetModuleFileNameもTCHAR単位ですね。
http://msdn.microsoft.com/ja-jp/library/cc429127.aspx
wcscat_sもそうなのかも。
http://msdn.microsoft.com/ja-jp/library/d45bbxx4(VS.80).aspx
どうも、文字列が苦手で、混乱していたようです。
Blueさん、ありがとうございました。無事解決できました。
ツイート | ![]() |