アプリ版:「スタンプのみでお礼する」機能のリリースについて

先日質問させていただき、
ファイル出力時に、フォルダを作成し、そのフォルダにファイルを出力していく方法をお聞きしたところ、

_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) で問題ないのでしょうか?

すみませんが、回答お願いします!

A 回答 (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』は違うので区別して下さい。
・以上。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!

なるほど、たしかに追加してるもの違いました。。

すみません。初歩的なミスで。

先ほど正常に動作しました!!
色々と本当にありがとうございました!

お礼日時:2007/07/25 01:13

★ソースを見せてくれますか?

    • good
    • 0
この回答へのお礼

http://koushi12-web.hp.infoseek.co.jp/public_htm …

ここにプロジェクトごとアップしておきました。


すみませんが、よろしくお願いします!

ホント、時間があるときでいいので、よろしくお願いします。

お礼日時:2007/07/23 21:02

★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
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

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フォルダだけ追加しました。

すみませんが、よろしくお願いします。

お礼日時:2007/07/23 14:11

★インポートの追加について。


>インポートの方法というのを教えて下さい。
 ↑
 (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』が
 見つかるはずです。
・以上。
    • good
    • 0
この回答へのお礼

毎回回答してくださり、ありがとうございます。

試してみたのですが、
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は有料版です。

お礼日時:2007/07/22 23:02

★回答者 No.1 です。


・コンパイラは何でしょうか?
 無料版の VC++2005 なら SDK もインストールしないと使えないようですね。
 その場合は下の『参考URL』をどうぞ。
・以上。

参考URL:http://freepg.fc2web.com/cpp/topic_vce_001.html

この回答への補足

今、ShLwApi.Libというのの追加をしようと思ったのですが、

スミマセン。やり方わからないです。
教えて頂けますか?

ちなみに、VC6.0ではWinAPI使えないのであれば、
VisualStudio 2005 も持っています。

多分、こっちなら間違えなく使えると思うのですが、

すみません。どっちでもいいので、
インポートの方法というのを教えて下さい。

よろしくお願いします。

補足日時:2007/07/20 20:59
    • good
    • 0
この回答へのお礼

今回も回答いただき、ありがとうございます!!

今ちょっと、家ではないので、教えていただいたものを
試せないのですが、

環境だけ書けるので、書いておきます!

WinXP HomeでVC++6.0を使ってます。

また、家に帰って教えていただいたもの試したら連絡します!!

ありがとうございます!

お礼日時:2007/07/20 18:06

お使いの環境を教えてください。


VC2003、VC2005などの場合、WINAPIを使用するには
PlatformSDKが必要です。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!

上記に環境書いておきました!

何かわかるようであれば、よろしくお願いします。

お礼日時:2007/07/20 18:07

★前回アドバイスした者です。


>もしかして、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 …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!