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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Q&A

解決済

2回答

1170閲覧

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

mercurian-teto

総合スコア75

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

0グッド

0クリップ

投稿2019/01/04 00:27

編集2019/01/04 01:08

##環境
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;

}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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 00:51

catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mercurian-teto

2019/01/04 08:25

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

0

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

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

投稿2019/01/04 00:32

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mercurian-teto

2019/01/04 01:07

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

2019/01/04 01:20 編集

> _stprintf_s(Path2, lstrlen(Path2) + 30, _T("\%s\%s"), Path, aFILE); 第2引数はバッファサイズなので、sizeof(Path2) としましょう
catsforepaw

2019/01/04 01: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);
dodox86

2019/01/04 02: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さんの深みにはまらない方が良いと言う点で賛成です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問