質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.10%

(win32API)visualstudioでデバグ実行するとGetCurrentDirectoryの値がおかしい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 880

mercurian-teto

score 75

環境

windows10 
visualstudio2017

やってみたこと

visualstudioでdebugモードで実行するとGetCurrentdiretctoryの値がおかしいです。
debugモードにある実行ファイルをほかの新規作成したフォルダで実行すると正常に
起動します。ソリューションファイル名はfile_searchです。

visualstudio上で実行した場合、またはvisualstudioで作成したディレクトリ上で実行すると、

C:Users\programming\source\repos\file_search\file_search\a.txt
↑ソリューション名が連続してしまう
実際は
C:\Users\programming\source\repos\file_search\x64\Debug
のディレクトリ上にfile_search.exeとa.txtがあります。
自分で用意したディレクトリで実行すると
C:Users\programming\source\repos\file_search\a.txt
実際のディレクトリはC:\Users\programming\Pictures\app
のディレクトリ上にfile_search.exeとa.txtがあります。


デバグするときにGetCurrentDirectoryを使用するとディレクトリを用意し、
そこに実行ファイルと目的のファイルを用意しないといけません。
こうなる原因がわかりません。
改善策はございますでしょうか。ご回答お願いします。

#include <windows.h>
#include <tchar.h>
#define aFILE _T("a.txt")
static TCHAR        msgbuf[257];

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PSTR lpCmdLine, int nCmdShow) {
    HANDLE hFile;
    HANDLE findHandle;
    TCHAR Path[260];
    TCHAR Path2[260];
    WIN32_FIND_DATA findData;
    TCHAR            *File;

    GetCurrentDirectory(sizeof Path, (LPTSTR)Path);
    _stprintf_s(Path, lstrlen(Path) + 30, _T("\%s\\%s"), Path, aFILE);
    MessageBox(NULL, Path, NULL, MB_OK);
    findHandle = FindFirstFile(Path, &findData);
    if (findHandle == INVALID_HANDLE_VALUE) {
        MessageBox(NULL, Path, NULL, MB_OK);

            if (!SearchPath(NULL, aFILE, NULL, sizeof(Path), Path, &File)) {

                _stprintf_s(msgbuf,lstrlen(msgbuf)+30 ,_T("%s was not found."), aFILE);
                MessageBox(NULL, msgbuf, NULL, MB_OK);
                    /*return Abort(hWnd, msgbuf);*/
            }
            else
            {
                MessageBox(NULL, _T("error"), NULL, MB_OK);

            }

    }
    else
    {
        FindClose(findHandle);
        MessageBox(NULL, _T("success"), NULL, MB_OK);

    }


    return 0;
}

追記1

include <windows.h>

include <tchar.h>

define aFILE _T("a.txt")

static TCHAR        msgbuf[257];

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR lpCmdLine, int nCmdShow) {
HANDLE hFile;
HANDLE findHandle;
TCHAR Path[260];
TCHAR Path2[260];
WIN32_FIND_DATA findData;
TCHAR            *File;

GetCurrentDirectory(sizeof Path, (LPTSTR)Path);
_stprintf_s(Path2, lstrlen(Path2) + 30, _T("\%s\\%s"), Path, aFILE);
MessageBox(NULL, Path2, NULL, MB_OK);
findHandle = FindFirstFile(Path2, &findData);
if (findHandle == INVALID_HANDLE_VALUE) {
MessageBox(NULL, Path2, NULL, MB_OK);

if (!SearchPath(NULL, aFILE, NULL, sizeof(Path), Path, &File)) {

_stprintf_s(msgbuf,lstrlen(msgbuf)+30 ,_T("%s was not found."), aFILE);
MessageBox(NULL, msgbuf, NULL, MB_OK);
/*return Abort(hWnd, msgbuf);*/
}
else
{
MessageBox(NULL, _T("error"), NULL, MB_OK);

}

}
else
{
FindClose(findHandle);
MessageBox(NULL, _T("success"), NULL, MB_OK);

}

return 0;
}

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+3

visualstudioでdebugモードで実行するとGetCurrentdiretctoryの値がおかしいです。

おかしくはありません。仕様通りです。

C:Users\programming\source\repos\file_search\file_search\a.txt
↑ソリューション名が連続してしまう

ソリューション名が連続しているのではなく、ソリューション名\プロジェクト名です。Visual Studioで新規にプロジェクトを作る際、「ソリューションのディレクトリを作成」にチェックが付いていると既定でソリューション名はプロジェクト名と同じ名前になるので、結果的に同じ名前のディレクトリーが2階層作られることになります。
そして、Visual Studioからプログラムを実行すると、デフォルトの設定ではプロジェクトファイルが置かれているディレクトリーが作業フォルダー(カレントディレクトリー)となります。

プログラム実行時の作業フォルダーはデバッグ設定で変更できます。プロジェクトのプロパティを開いて左のリストで「デバッグ」を選択するとデバッグに関する設定項目が開きます。その中に「作業ディレクトリ」があり、初期値として$(ProjectDir)が設定されているので、それを好きなように変更すれば良いです。exeファイルと同じフォルダーにしたいのであれば、$(OutDir)です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/04 17:25

    visualstudio上で動作しました。
    ありがとうございました。

    キャンセル

+2

  _stprintf_s(Path, lstrlen(Path) + 30, _T("\%s\\%s"), Path, aFILE);

これがやばいんでは。
おなじPathに入れずに、別のバッファを確保してそこに展開させてみては?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/04 10:07

    回答ありがとうございます。
    ご指摘の通り、ちがうbufferである。
    型も配列数も同じの変数Path2を入れました。(追記1をご覧ください)
    しかし、同じエラーが発生し、さらにはエラーの後に
    例外が発生しました。
    Run-Time Check Failure #2 -Stack around the variable 'Path2' was corrupted.

    キャンセル

  • 2019/01/04 10:19 編集

    > _stprintf_s(Path2, lstrlen(Path2) + 30, _T("\%s\\%s"), Path, aFILE);

    第2引数はバッファサイズなので、sizeof(Path2) としましょう

    キャンセル

  • 2019/01/04 10:40

    この件に関する問題の本質はそこではないので、あまり深みにはまらない方が良いですよ。
    確かにパス操作に関してはいまいちな部分もあるので、改善の余地はありますが。

    Windows APIには、パス操作用の便利関数が用意されているので、それを利用するのが簡単だと思います。

    #include <shlwapi.h>
    #pragma comment(lib, "shlwapi.lib")
    :
    :
    //_stprintf_s(Path, lstrlen(Path) + 30, _T("\%s\\%s"), Path, aFILE);
    PathAppend(Path, aFILE);

    キャンセル

  • 2019/01/04 11:24

    > _stprintf_s(Path2, lstrlen(Path2) + 30, _T("\%s\\%s"), Path, aFILE);
    > 第2引数はバッファサイズなので、sizeof(Path2) としましょう
    バッファサイズと言うよりか「文字数」なので、sizeofではwchar_t の時に不適切となるので、(sizeof(Path2) / sizeof(Path2[0]))とするか、
    _countofマクロが使えればそちらを利用すべきかと。ランタイムエラーが起きるのも、格納可能最大サイズの指定間違いによるものかもしれません。※catsforepawさんの深みにはまらない方が良いと言う点で賛成です。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る