先日質問させていただき、
ファイル出力時に、フォルダを作成し、そのフォルダにファイルを出力していく方法をお聞きしたところ、
_mkdir()関数を使い、最初にフォルダを作っておく方法を教わり、
これは上手くいきました。
それとは別に、WinAPIを使い、フォルダの有無を調べ、無い場合は
作成するという方法があるのを教えてもらいました。
WinAPI使ったことないので、良くわからなかったのですが、
丁寧な説明を頂き、ほとんど、コピーして貼り付けるだけだったので
実行してみたのですが、意味のわからないエラーが出てしまいました。
実行した方法は、
#include <shlwapi.h>
#include <windows.h>
if ( PathIsDirectory(path) ){ ←フォルダ有無
CreateDirectory( path, NULL ); ←フォルダ作成
}
sprintf( buff, "%s\\%s", path, filename );
fp = fopen( buff, "w" );
:
fclose( fp );
エラーの内容は
構文エラー : 識別子 'DECLSPEC_IMPORT' がシンタックスエラーを起こしました。
というものでした。
エラーの部分は、よく解らないのですが、自分で書いたメインの文ではなく、何かのヘッダ部分?のようでした。
もしかして、WinAPIを使うには、何かインストールしないとマズイのでしょうか??
これだけの説明で、何が悪いのか指摘できるのかわかりませんが、
わかる方いらっしゃいましたら教えて下さい。
何か足りない情報があったら書き込みます!
ちなみにもう一つお聞きしたいのは、フォルダのpath指定のところは
相対パスでもいいのでしょうか?
例えば、現在Cファイルがある場所にDATAというフォルダを作りたかったら、
path指定のところは、
PathIsDirectory(DATA) で問題ないのでしょうか?
すみませんが、回答お願いします!
No.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』は違うので区別して下さい。
・以上。
回答ありがとうございます!
なるほど、たしかに追加してるもの違いました。。
すみません。初歩的なミスで。
先ほど正常に動作しました!!
色々と本当にありがとうございました!
No.6
- 回答日時:
★ソースを見せてくれますか?
http://koushi12-web.hp.infoseek.co.jp/public_htm …
ここにプロジェクトごとアップしておきました。
すみませんが、よろしくお願いします!
ホント、時間があるときでいいので、よろしくお願いします。
No.5
- 回答日時:
★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』
参考URL:http://www.wisdomsoft.jp/dev/api/windows/003
回答ありがとうございます。
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フォルダだけ追加しました。
すみませんが、よろしくお願いします。
No.4
- 回答日時:
★インポートの追加について。
>インポートの方法というのを教えて下さい。
↑
(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は有料版です。
No.3
- 回答日時:
★回答者 No.1 です。
・コンパイラは何でしょうか?
無料版の VC++2005 なら SDK もインストールしないと使えないようですね。
その場合は下の『参考URL』をどうぞ。
・以上。
参考URL:http://freepg.fc2web.com/cpp/topic_vce_001.html
この回答への補足
今、ShLwApi.Libというのの追加をしようと思ったのですが、
スミマセン。やり方わからないです。
教えて頂けますか?
ちなみに、VC6.0ではWinAPI使えないのであれば、
VisualStudio 2005 も持っています。
多分、こっちなら間違えなく使えると思うのですが、
すみません。どっちでもいいので、
インポートの方法というのを教えて下さい。
よろしくお願いします。
今回も回答いただき、ありがとうございます!!
今ちょっと、家ではないので、教えていただいたものを
試せないのですが、
環境だけ書けるので、書いておきます!
WinXP HomeでVC++6.0を使ってます。
また、家に帰って教えていただいたもの試したら連絡します!!
ありがとうございます!
No.1
- 回答日時:
★前回アドバイスした者です。
>もしかして、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』をどうぞ。
参考URL:http://wisdom.sakura.ne.jp/system/winapi/win32/w …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのマクロについて教えてください 物件ごとのフォルダを作成してます そのフォルダ内にサブフォル 2 2023/07/02 17:58
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/05/26 17:13
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2022/10/26 17:14
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/02/21 13:29
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/21 09:28
- グループウェア 一太郎がイントラで開けません。対処方法を知りたいです。 3 2023/04/04 13:30
- その他(プログラミング・Web制作) Pythonの作業環境・作業フォルダの迅速な設定・指定方法 3 2022/04/01 07:55
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/08 11:02
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/07/02 11:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Windows10でコマンドプロンプト...
-
VBA 最新のフォルダ取得
-
ファイル名と同名のフォルダを...
-
VBA フォルダ名に特定の文字を...
-
windowsでテキストファイルの各...
-
Dreamweaverでイメージを挿入す...
-
Excelのハイパーリンクについて...
-
Excel VBA で フォルダ名の一部...
-
フォルダにリンクを貼りたい
-
多量のファイルをフォルダに自...
-
ExcelVBAでフォルダへのハイパ...
-
ディレクトリ名変更してコピー...
-
ExcelのVBAでフォルダ指定がで...
-
バッチファイルで指定フォルダ...
-
フォルダ選択ダイアログ:ネッ...
-
Hitachi Embedded Workshop (HE...
-
【マクロ】フォルダAからダBへ...
-
保存先のフォルダ名を指定した...
-
Access VBA で フォルダ権限...
-
デスクトップの画像をhtmlに表...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Windows10でコマンドプロンプト...
-
パス名に2バイト文字(マルチバ...
-
ファイル名と同名のフォルダを...
-
VBA 最新のフォルダ取得
-
Excelのハイパーリンクについて...
-
デスクトップの画像をhtmlに表...
-
ディレクトリ名変更してコピー...
-
VBA フォルダ名に特定の文字を...
-
バッチファイルで指定フォルダ...
-
フォルダ内のPDFファイル名を変...
-
Access VBA で フォルダ権限...
-
excelマクロ 冒頭3文字が一致す...
-
【マクロ】ファイル名の日付に...
-
フォルダにリンクを貼りたい
-
会社のネットワーク上のファイ...
-
多量のファイルをフォルダに自...
-
C ファイル出力で、フォルダが...
-
保存先のフォルダ名を指定した...
-
vbsで選択ダイアログを表示した...
-
Excel VBA 同じ名前のフォルダ...
おすすめ情報