::PathIsDirectory(); で、コンパイルエラー – プログラミング – Home

通知
すべてクリア

[解決済] ::PathIsDirectory(); で、コンパイルエラー


roots
 roots
(@roots)
ゲスト
結合: 17年前
投稿: 10
Topic starter  

MFC VC++6.0 です。

・ファイルを作成する為のフォルダを選択して、そのフォルダが有効な場合と、
 無効な場合で処理をわけたいと思っております。
 
 ::PathIsDirectory(lp_path); を試してみようと思っているのですが、
 コンパイルエラーが出てしまいます。どうしたら良いのでしょうか?
 
◆エラーメッセージ
error C2039: 'PathIsDirectory' : '~global namespace'' のメンバではありません。
error C2065: 'PathIsDirectory' : 定義されていない識別子です。
インクルードしているファイルは下記2つです。
#include stdafx.h
#include hoge.h //このファイルのヘッダ

◆『ShLwApi.Lib』が必要とあったのですが設定の方法がわかりません。
 調べたら下記方法が書いてあったのですが、バージョンが違う為か
 右メニューに『追加(D)』がありません。

 (1)『ソリューション・エクスプローラ』で右メニューから『追加(D)』
   を選択します。
 (2)『既存項目の追加(G)...』を選択します。
 (3)ダイアログから『ShLwApi.Lib』があると思われるフォルダに移動します。
 (4)『ShLwApi.Lib』を入力して『開く(O)』を押す。


引用未解決
トピックタグ
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

なんか微妙に対処方法が違っているような気が...
エラーにも二種類あって、いま出てるのはコンパイルエラー。
それを解消できた後にはリンクエラーが出るが、書いてあるのはこっちの対策

んで、今時 VC++6 っすか?10年以上前の処理系だしサポート打ち切られてるし
新しいバージョンに乗り換え推奨

VC++6 でなきゃならんというなら

コンパイルエラーの対処:
stdafx.h 中に #include <shlwapi.h> を追加

リンクエラーの対処:
shlwapi.lib を追加
手順ぐらい自分で調べてクレイ


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

> ::PathIsDirectory(lp_path); を試してみようと思っているのですが、
> コンパイルエラーが出てしまいます。どうしたら良いのでしょうか?

#include <shlwapi.h>
を追加。

> ◆『ShLwApi.Lib』が必要とあったのですが設定の方法がわかりません。
>  調べたら下記方法が書いてあったのですが、バージョンが違う為か
>  右メニューに『追加(D)』がありません。

VC6の場合だと、メニューのプロジェクト→プロジェクトへ追加→ファイルで追加。


返信引用
roots
 roots
(@roots)
ゲスト
結合: 17年前
投稿: 10
Topic starter  

tetrapod さんありがとうございます。

VC++6.0 は『勉強だけならこれで十分。』と知人から
譲って頂いたソフトで、現在これで勉強中です。

>なんか微妙に対処方法が違っているような気が...
どのように違っているのか教えて頂けませんでしょうか?

>リンクエラーの対処:
>shlwapi.lib を追加
>手順ぐらい自分で調べてクレイ
もう少し調べてみます。


返信引用
roots
 roots
(@roots)
ゲスト
結合: 17年前
投稿: 10
Topic starter  

たいちうさんありがとうございます。

>VC6の場合だと、メニューのプロジェクト→プロジェクトへ追加→ファイルで追加。
追加する事が出来ました。
コンパイルエラー、リンクエラーなくなりました。

まずはこれをやってみて、どうなるか試してみたいと思います。
対処法の違いとかは、この後考え直してみます。


返信引用
roots
 roots
(@roots)
ゲスト
結合: 17年前
投稿: 10
Topic starter  

解決選・


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

勉強ならますますもって最新開発環境を推奨
VC++6 は C++ 言語規格書採択前の処理系なので今となっては古さだけが目立つ

***と参考書に書いてある通りに入力したらコンパイルエラーだ!
って場合にコンパイラの古さが原因だったりするとげんなりなので。

VS2008 Express Edition なら無料、さらに SDK もついてる、とお得よ。

VC++6 を使い続けるつもりならサービスパック6を必ず導入しておくこと
SPなし VC++6 はバグバグで使い物にならないから。


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

> 対処法の違いとかは、この後考え直してみます。

コンパイルとリンクを分けて考える必要があります。

コンパイルするにはコンパイル単位でつじつまが合っている必要がありますが、
通常コンパイル単位はプロジェクトに追加されているcppファイルと思って下さい。
コンパイル中に、突然定義されていない名前(PathIsDirectory)が出てきたので、
コンパイルエラーになりました。

これを解消するためには、PathIsDirectoryを使う場所よりも先に、
PathIsDirectoryの宣言をコンパイラに読ませてやる必要があり、
宣言はshlwapi.hに書かれています。

コンパイルが成功したら次はリンクですが、PathIsDirectoryについては
宣言はありますが、実態はまだありません。コンパイルでは、
どんな引数を取り、どんな値を返すPathIsDirectoryという関数がある、
という情報が分かれば十分でしたが、リンクの場合は実際にその関数が
何をするのかという関数の実体が必要で、これはshlwapi.libに含まれます。

PathIsDirectoryを使うためにはshlwapi.hとshlwapi.libが必要です。
新しい関数を使う時に、コンパイルエラーやリンクエラーが出たら、
MSDNで何が必要なのかまず調べましょう。

> エラーにも二種類あって、いま出てるのはコンパイルエラー。
> それを解消できた後にはリンクエラーが出るが、書いてあるのはこっちの対策

と、tetrapodさんも書いてますが、前の工程で失敗していることが明らかなのに、
後の工程を改善しようとしているのです。いずれは後工程の改善も必要ですが。


返信引用
ちょっきんな
 ちょっきんな
(@ちょっきんな)
ゲスト
結合: 17年前
投稿: 3
 

> VS2008 Express Edition なら無料、さらに SDK もついてる、とお得よ。

MFCはないんですよねぇ。。。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

>MFCはないんですよねぇ。。。
勉強が目的ならいいんじゃないかと思いますが.....
MFCの環境でもSDKの知識は必要です。
無駄にはならないと思います。


返信引用
roots
 roots
(@roots)
ゲスト
結合: 17年前
投稿: 10
Topic starter  

みなさんありがとうございます。

>***と参考書に書いてある通りに入力したらコンパイルエラーだ!
>って場合にコンパイラの古さが原因だったりするとげんなりなので。
確かに、以前そのような事がありました。トラ技に書いてあったソースを
そのまま使うことが出来なくて苦労した事があります・・。

>tetrapodさんも書いてますが、前の工程で失敗していることが明らかなのに、
>後の工程を改善しようとしているのです。いずれは後工程の改善も必要ですが。
丁寧にありがとうございます。
error C2039 を調べて、#include してない物があるのは気がついたのですが、
調べた時に『ShLwApi.Lib』が必要って文章が頭にあって、
『ShLwApi.Lib』を追加すれば解決するのかな?って勘違いしてしまいました。
勉強になりました。

>勉強が目的ならいいんじゃないかと思いますが.....
開発環境についても検討してみようとおもいます。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました