アクセス違反を解決するには?

解決


pon  2009-03-11 02:18:06  No: 69831

環境: 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;
}


Blue  2009-03-11 02:27:55  No: 69832

とりあえず、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


Blue  2009-03-11 02:33:02  No: 69833

GetModuleFileNameもTCHAR単位ですね。
http://msdn.microsoft.com/ja-jp/library/cc429127.aspx

wcscat_sもそうなのかも。
http://msdn.microsoft.com/ja-jp/library/d45bbxx4(VS.80).aspx


pon  2009-03-11 08:41:26  No: 69834

どうも、文字列が苦手で、混乱していたようです。
Blueさん、ありがとうございました。無事解決できました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加