- ベストアンサー
WinAPIでフォルダ作成
- WinAPIを利用してフォルダを作成する方法についてお聞きします。
- _mkdir()関数を使ってフォルダを作成する方法を教えていただきましたが、別にWinAPIを利用してフォルダの有無を調べ、ない場合は作成する方法があるそうです。
- しかし、WinAPIを使った方法についてはよくわからず、実行すると構文エラーが発生してしまいます。具体的なエラーメッセージは示されていませんが、WinAPIを使用する際には何かインストールが必要なのでしょうか?また、相対パスを使用してフォルダを指定することは可能なのでしょうか?
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
★『ShLwApi.Lib』がインポートされていません。 ・プロジェクトファイル(*.vcproj)を調べたらライブラリをインポートしていません。 回答 No.4 の『お礼』でインポート出来たとなっていますがインポートしていませんが…。 ・その代わりに『Shlwapi.h』ファイルがプロジェクトに登録されていますね。 違いますよ。ファイルが。拡張子は『.Lib』です。『.h』はソースに記述して下さい。 よって設定が間違っています。 『C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Lib\ShLwApi.Lib』を 右メニューから追加して下さい。拡張子は『*.Lib』です。 もう一度、設定して下さい。 最後に: ・『*.h』はヘッダファイルなのでソースにインクルードを記述します。 自作ヘッダ以外の『*.h』はプロジェクトに登録しなくても良いと思います。 『*.Lib』がインポートライブラリですので右メニューから追加して下さい。 『*.h』と『*.Lib』は違うので区別して下さい。 ・以上。
その他の回答 (6)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★ソースを見せてくれますか?
お礼
http://koushi12-web.hp.infoseek.co.jp/public_html/movie/suraisu.rar ここにプロジェクトごとアップしておきました。 すみませんが、よろしくお願いします! ホント、時間があるときでいいので、よろしくお願いします。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★2つのエラーは文字列定数が原因です。 ・VS2005 から文字列定数の初期設定が Unicode 文字となりました。 よって文字列の "RESULT" という記述でエラーとなります。 正しくは次の3つのどれかで記述します。 (1)L"RESULT" (2)TEXT("RESULT") (3)_T("RESULT") TEXT()、_T() はマクロ関数です。 このマクロはオプション設定で UNICODE が定義されていればすべての文字列を Unicode 文字列として『L』を付けた文字列にします。UNICODE が定義されていないと 『L』の付かない文字列にします。この2つの違いは『L』があると Unicode 文字列 として『L』がないとマルチバイト文字列となります。 ・これからは文字列の記述を TEXT() マクロを使って記述することをお勧めします。 また『L』の付かない文字列(マルチバイト文字列)として正常にコンパイルするには プロパティの『全般』→『文字セット』を『マルチ バイト文字セットを使用する』に 変更して下さい。 ・以上。→『LPCTSTR』『TCHAR』
お礼
回答ありがとうございます。 WinAPIは全然勉強したことなかったので、 これがうまくいったら勉強してみたいと思います! ホント初歩的な質問ばかりしてしまってると思いますが、 すみません。もうちょっと付き合って下さい。 教えていただいた通り、TEXT("RESULT")と全てなおしたのですが、 今度は下のようなエラーが出てしまいました。 0.obj : error LNK2019: 未解決の外部シンボル __imp__PathIsDirectoryW@4 が関数 _main で参照されました。 C:\Documents and Settings\宮澤駿太\デスクトップ\suraisu\Debug\suraisu.exe : fatal error LNK1120: 外部参照 1 が未解決です。 ダブルクリックしても、エラー場所に飛ばないので何が悪いのかもよくわからなくて・・・ この前教えていただいた、Shlwapi.hのインクルード方法のあたりが間違っているのでしょうか?? 一応、ヘッダーファイルののところに、Shlwapi.hはインクルードしてあります。 後、オプションのVC++ディレクトリのところの実行可能ファイルのところに、Shlwapi.hがあった辺りの、Includeフォルダ、Binフォルダ、Libフォルダは追加しました。 ライブラリ ファイルの方は、Libフォルダだけ追加しました。 すみませんが、よろしくお願いします。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★インポートの追加について。 >インポートの方法というのを教えて下さい。 ↑ (1)『ソリューション・エクスプローラ』で右メニューから『追加(D)』を選択します。 (2)『既存項目の追加(G)...』を選択します。 (3)ダイアログから『ShLwApi.Lib』があると思われるフォルダに移動します。 (4)『ShLwApi.Lib』を入力して『開く(O)』を押す。 これだけですが VC6.0 でソリューション・エクスプローラと呼びましたっけ? 構造プロパティを出すときのペインです。 またはプロジェクトを管理しているペインといえば分かりますか。 そのペインで右メニューすれば『追加(D)』があるのでそれを選択します。 ・あとインポート・ライブラリの場所ですが VC++2003 では 『C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Lib\ShLwApi.Lib』 VC++2005 では 『C:\Program Files\Microsoft Visual Studio .NET 2005\Vc8\PlatformSDK\Lib\ShLwApi.Lib』 かな。VC6.0 も似たような場所にあると思います。 つまり 『C:\Program Files\Microsoft Visual Studio … \PlatformSDK\Lib\ShLwApi.Lib』 という感じで。探して下さい。 >ちなみに、VC6.0ではWinAPI使えないのであれば、 >VisualStudio 2005 も持っています。 ↑ VC6.0 でも Win32API は使えます。 VC++2005 でも無料版では SDK が無いのでダウンロードしてインストールする必要があります。 無料版でなければ SDK は入っていると思いますのでフォルダを探せば『ShLwApi.Lib』が 見つかるはずです。 ・以上。
お礼
毎回回答してくださり、ありがとうございます。 試してみたのですが、 VS2005の方は、インポート方法がわかりました!! ありがとうございました!! VC6.0++はちょっと追加方法わからなかったのですが、 とりあえずVS2005の方でインポートは出来たので、 そっちでコンパイルしてみたのですが、 エラーが出てしまいました。 追加して書いた内容は、 #include <shlwapi.h> #include <windows.h> if(PathIsDirectory("RESULT")){ CreateDirectory("RESUTL",NULL); } これだけです。 エラーが出た場所は、if文の2行で、内容は error C2664: 'CreateDirectoryW' : 1 番目の引数を 'const char [7]' から 'LPCWSTR' に変換できません。 error C2664: 'PathIsDirectoryW' : 1 番目の引数を 'const char [7]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照) というものでした。 ヘルプで、PathIsDirectoryWと検索してみたのですが、何もヒットせず どうすればいいのか解りません。 何がいけないのか解りますでしょうか?? ちなみに、VS2005は有料版です。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★回答者 No.1 です。 ・コンパイラは何でしょうか? 無料版の VC++2005 なら SDK もインストールしないと使えないようですね。 その場合は下の『参考URL』をどうぞ。 ・以上。
お礼
今回も回答いただき、ありがとうございます!! 今ちょっと、家ではないので、教えていただいたものを 試せないのですが、 環境だけ書けるので、書いておきます! WinXP HomeでVC++6.0を使ってます。 また、家に帰って教えていただいたもの試したら連絡します!! ありがとうございます!
補足
今、ShLwApi.Libというのの追加をしようと思ったのですが、 スミマセン。やり方わからないです。 教えて頂けますか? ちなみに、VC6.0ではWinAPI使えないのであれば、 VisualStudio 2005 も持っています。 多分、こっちなら間違えなく使えると思うのですが、 すみません。どっちでもいいので、 インポートの方法というのを教えて下さい。 よろしくお願いします。
- aris-wiz
- ベストアンサー率38% (96/252)
お使いの環境を教えてください。 VC2003、VC2005などの場合、WINAPIを使用するには PlatformSDKが必要です。
お礼
回答ありがとうございます! 上記に環境書いておきました! 何かわかるようであれば、よろしくお願いします。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★前回アドバイスした者です。 >もしかして、WinAPIを使うには、何かインストールしないとマズイのでしょうか?? ↑ インポート・ライブラリとして『ShLwApi.Lib』をリンクに追加して下さい。 総合環境ならプロジェクトなどに追加します。 このライブラリをインポートしないと >構文エラー : 識別子 'DECLSPEC_IMPORT' がシンタックスエラーを起こしました。 というエラーが出ます。ここを補足するのを忘れてました。 ・あとインポート・ライブラリの場所を探して下さい。 私の環境では 『C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Lib\ShLwApi.Lib』 にあります。 >ちなみにもう一つお聞きしたいのは、フォルダのpath指定のところは >相対パスでもいいのでしょうか? >例えば、現在Cファイルがある場所にDATAというフォルダを作りたかったら、 >path指定のところは、 >PathIsDirectory(DATA) で問題ないのでしょうか? ↑ ・相対パスでも使えますがプログラムを実行したカレント・ディレクトリを基準に 指定することになります。これはプログラムのあるフォルダの下に『DATA』という フォルダを作成したい場合は PathIsDirectory("DATA") で出来ます。 ・重要なのは現在のカレント・ディレクトリの位置です。 質問では C ファイルがある場所となっていますが、C ソースとプログラムの場所が 同じなら "DATA" だけでフォルダが作成できます。もし、違うのならば適当なパスか カレント・ディレクトリを変更するなどして下さい。 図式: ■Cファイルがあるフォルダ ├DATA ←これを作成 └Release ←プログラム この場合、カレント・ディレクトリがプログラム起動時の『Release』フォルダに 位置しています。よって『..\DATA』と指定すればフォルダの有無や作成ができます。 また、カレント・ディレクトリを『Cファイルがあるフォルダ』に移動してから 『DATA』とすればフォルダの有無や作成ができます。 その他: ・カレント・ディレクトリの取得/設定は Win32 API の GetCurrentDirectory(); SetCurrentDirectory(); で行えます。この2つの関数は windows.h だけインクルードすれば使えます。 ・使い方は TCHAR szPath[ MAX_PATH ]; // 取得 GetCurrentDirectory( MAX_PATH, szPath ); printf( "カレント・ディレクトリは %s です。\n", szPath ); // 設定 SetCurrentDirectory( "C:\\Windows" ); など。 ・以上。下の『参考URL』をどうぞ。
お礼
回答ありがとうございます! なるほど、たしかに追加してるもの違いました。。 すみません。初歩的なミスで。 先ほど正常に動作しました!! 色々と本当にありがとうございました!