お世話になります。
PC OSはXPです。
環境はeMbedded Visual C++4.0になります。
現在、ハンディターミナルに挿入したSDカードがハンディに認識されているかの
チェックをするロジックを作っています。
カードがハンディに挿入か未挿入かのチェックは、ハンディのSDKに用意されているの
で、その関数を使用していますが、挿入されていても、パーティションが消えている時
があり、その時はハンディがカードを認識していなくエラーになるので、その際に、カ
ード再認識するように、カード抜き差しをしてもらうメッセージを追加したいのです。
ネットで調べると、C++にはファイルの有無を知る関数はあっても、フォルダの有無を知
る関数は無いと載っており、但し、Windows APIのPathIsDirectory()がフォルダの有無
が判ると載っていました。
そこで、早速、
include <shlwapi.lib>とソースでインクルードし、
ワークスペースのリソースファイルに shlwapi.lib を追加し、[ツール]-[オプション]
のディレクトリタブの指定フォルダに、shlwapi.libをコピペしました。
その後、LNK2019 LNK1120のリンカエラーになり、外部のものとされリンクできていない
ようなのですが、何が足りないのでしょうか?
ご教授頂きたいです。どうぞ、宜しくお願い致します。
>include <shlwapi.lib>とソースでインクルードし、
shlwapi.h ではなくて?
eMbedded Visual C++4.0というのがよく分からないのですが、
> include <shlwapi.lib>とソースでインクルードし、
> ワークスペースのリソースファイルに shlwapi.lib を追加し、[ツール]-[オプショ
ン]
> のディレクトリタブの指定フォルダに、shlwapi.libをコピペしました。
インクルードするのはヘッダーファイルだと思います。
#include shlwapi.h
また、インポートライブラリは、ファイルをコピーしたりせずに
プロジェクトの設定のリンクページファイル名だけを指定すればOKだと思います。
ちなみに、フォルダの有無を知りたければ、以下のような関数でも大丈夫です。
bool IsFolderExist(LPCWSTR lpFolderName)
{
WIN32_FIND_DATA wfd;
HANDLE hFind = FindFirstFile(lpFolderName, &wfd);
if (hFind == INVALID_HANDLE_VALUE) return false;
FindClose(hFind);
return (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? true :
false;
}
ツール→オプションのディレクトリタブには、メーカーが用意した
SDKのincludeファイルの場所やlibファイルが置いてあるパスを指定します。
インクルードファイルの場所は
C:\Program Files\Windows CE Tools\wce420\POCKET PC 2003\Include
とか、ライブラリの場合は
C:\Program Files\Windows CE Tools\wce420\POCKET PC 2003\lib
とかです。libファイルをコピーしてくる必要はありません。
インクルードファイルの指定は他の方が指摘されているように
#include shlwapi.h
です。
ライブラリの設定
プロジェクト→設定から、リンクタブを選択して
オブジェクト/ライブラリモジュールの
所にshlwapi.libと記述します。追加するライブラリが他にもあるときは
スペースで区切って記述します。
shlwapi.lib Ws2_32.lib
こんな感じ、ツール→オプションのディレクトリタブに設定したパスから
探してきます。
リンク時にここで指定したライブラリがリンクされます。
#eVC4.0のIDEはVC6とほぼ同じです。というかそっくりなので
#VC6の設定のつもりで回答してしまって問題ないと思います。
釈迦に説法かもしれませんが。
Windows CEの場合、組み込み系でないWindowsOSのサブセットと言う位置付けに
なりますから、一般的なWin32APIの関数が全て使えるわけではない点は注意して
下さい。少なくともPCのライブラリを持ってきても駄目なのでその点は注意です。
既にほさんが書かれていますが、CE用のライブラリを使う必要があるので
そこはきっちり区別します。ターゲット用のSDKに入っている物であれば、
使っても大丈夫なはずです。通常はSDKをインストールした時点で
IDEのプロジェクトの構成をそのターゲット向けにしておけば、
使えるライブラリは既に使える状態になっているはずです。
WindowsCEと一般のWindowsは似て非なる物なのでその辺の認識はしっかり
持っておいた方が良いと思います。基本的にターゲットデバイスで
そのAPIが使用できるかどうかは都度都度調べる必要がある事を
覚えておいた方が良いと思いますよ。
ryo様、MistyGreen様、ほ様
ご返信ありがとうございます。大変感謝しております。
> shlwapi.h ではなくて?
その通りです。質問の際の入力ミスです。すみません。
ヘッダをインクルードしています。
> また、インポートライブラリは、ファイルをコピーしたりせずに
> プロジェクトの設定のリンクページファイル名だけを指定すればOKだと思います。
開発中のPCに、shlwapi.lib が存在しなかったため、他PCからハンディのSDKの
ライブラリのあるフォルダにコピペをしました。
> ちなみに、フォルダの有無を知りたければ、以下のような関数でも大丈夫です。
他関数をご教授いただきありがとうございました。
早速 windows.h をインクルードし、FindFileData を使用し、フォルダ名のみを指定し
実行してみると、お蔭様でフォルダの有無確認ができました。
ありがとうございました。
ライブラリを追加するような環境の設定を全く変えずにうまくいったので、これは、
ハンディのSDKにwindowsが組込まれているとの解釈でいいのでしょうか…
> ライブラリの設定
環境設定の知識が乏しいので、助かります。
リンクされるように、例をまねて設定してみます。
こちらでライブラリのリンク設定がきちんとされてあれば、そのライブラリにある
APIは使用できるはずですよね…
ありがとうございました。
PATIO様
ご返信ありがとうございます。いつもお世話になっています。
> WindowsCEと一般のWindowsは似て非なる物なのでその辺の認識はしっかり
> 持っておいた方が良いと思います。基本的にターゲットデバイスで
> そのAPIが使用できるかどうかは都度都度調べる必要がある事を
> 覚えておいた方が良いと思いますよ。
SDKにないAPIを使用する際は、その都度、リンクもして使用できなければ、
使えないAPIと判断すべきなのですね。
皆様のご教授を頂き、とても学習になりました。
ありがとうございました。
基本的にCE用のMSDNに明記されていないAPIは未サポートと考えた方が良いです。
確かeMbedded Visual C++4.0にはCE用のMSDNが同梱されていたと思います。
この中に記載されている関数群が基本的にそのバージョンで使用できる関数です。
但し、CEの場合は各ターゲット毎の実装はターゲットのメーカーに依存します。
最終的にはターゲット用のSDKで提供されるドキュメントとあわせて確認する必要があり
ます。
WindowsCEはメーカー毎の実装が入ってくる為に色々とターゲット毎の癖が出たりするこ
ともありますので通常のWindowsでは出てこないようなノウハウが必要になるケースがあ
ります。
また、通常のWindowsの情報を参考にする事は出来ますが、
必ずしも全く同じと言うわけには行きません。
また、WindowsCE用の情報は通常のWindowsに比べるとかなり少ない状況です。
そういった面でも苦労が多いので頑張ってください。
PATIO様
更なるご教授ありがとうございます。
> 基本的にCE用のMSDNに明記されていないAPIは未サポートと考えた方が良いです。
未サポートを考えますと、今回すんなり実行できたwindows.hのFindFirstFileは、
サポートされているAPIと考えてよろしいのでしょうか?
APIのヘッダをインクルードし、コンパイルは通ってもリンカエラーになれば、
そのAPIは未サポートと判断する…、こういった解釈でよろしいのでしょうか?
度々、申し訳ございません。
お時間のある時で結構ですので、どうぞ宜しくお願い致します。
ITO様
ご返信ありがとうございます。
学習になります。
未サポートの判断に関しては、
1.まずMSDN(ローカルHELP)で確認する。
基本的にCE用のMSDNに載っていれば、サポートされていると
考えてよいと思います。
2.MSDNに載っていない場合、駄目元でコーディングしてビルドしてみる。
この方法でリンクエラーとかコンパイルでエラーになる場合は
未サポート考えた方がよいと思います。
注意してほしいのはビルドが通ったとしても正式にサポートされていない
関数の場合、動作保証があるかどうかは疑問という点です。
ビルドができる、とりあえず動いているという状態でもマイクロソフトが
正式にサポートを表明していない場合、変な動作をしても文句は言えない
事になります。サポートを公言していないのに使っている方が悪いと言う
話になると思います。
仕事で作成するプログラムの場合、お客様に対して動作保証を求められる
はずですから、その時に動いているからと言って動作保証がない物を
使うのはどうかと思います。最悪、その関数を使っていた為にお客様に
被害があったとしてもその責任はご自身で負う事になると思います。
そういった部分も含めて使ってよいかどうかの判断をしてください。
PATIO様
ご教授ありがとうございました。
そうですね、ユーザーが安心して使用できるものを改めて心掛けます。
また、何かありましたら、宜しくお願い致します。