最初に提示してある
> GetCurrentDirectory(sizeof(dir_str),dir_str);
> strcat(dir_str,\\SCRIDX\\TLCSVC.IDX);
> m_chkfil = CreateFile(
の方法だと、自分の意識していないところで
オペレーティングシステムのネットワークコンポーネントと、
それに接続されるサーバー
になるんでしょうか
>wood 2004/09/05(日) 18:59:53
の時点でMSDNを読んで、
>補足 2004/09/05(日) 20:36:38
は自分には該当しないと思っていましたが、間違いなのでしょうか
デバック環境では、「GetFileInformationByHandle」が成功しているように
見受けられるのですが...
GetFileInformationByHandle は _fstat Cランタイム関数と同等とされているよう
です。
しかし、Win32s バージョン1.1ではサポートされていないということと、NEC PC98
の Windows9x からネットワーク上の Windows9x を参照した場合は、ファイル属性
が取得出来ないケースがあるらしいです。その他は分かりません。
MSDN に記載されている情報以上のことはなかなか得難いと思いますので、不安で
あれば定石の手を使った方が安全かと。
不安をあおって「GetFileInformationByHandle」を使わせたくない理由
はなんでしょうか?
Win2k(Pro) or WinXP(PRO) の ローカルサービスとして実行する
と明示していることにたいして「Windows9x」補足はどのように関わり
また、明示されないケースをどのように信用すればよいのでしょうか
MSDNのコピペを提示して頂いたと言うことは、それぞれの詳細情報をお持ちで解説可能
な方が、回答者としてキチンとした回答していただけるものと期待したのですが..
「定石」とは何でしょうか?
回答者が思っている方法が一番正しいことなので、プログラミング初心者は
記号を覚えるのと同様に、意味はわからなくてもいいから、そう思えということですか
この際色々書かせて頂きます。
>不安をあおって「GetFileInformationByHandle」を使わせたくない理由
そういうつもりは毛頭ありません。
>Win2k(Pro) or WinXP(PRO) の ローカルサービスとして実行する
>と明示していることにたいして「Windows9x」補足はどのように関わり
>また、明示されないケースをどのように信用すればよいのでしょうか
知っている情報をすべて出したのみです。それを取捨選択するのは貴方の自由
でしょう。
>MSDNのコピペを提示して頂いたと言うことは、それぞれの詳細情報をお持ちで解説可
能
>な方が、回答者としてキチンとした回答していただけるものと期待したのですが..
MSDNに書かれているからこそ大事な事だと思ってコピペしただけですが、何が
不満なのでしょうか?
MSDN著者以上の情報をよこさないならば余計な情報は書くなと仰るならば、
それこそあらかじめ宣言なさって下さい。
(そういう割には、貴方はつい最近、中途半端に横レスを入れたまま放置されている
トピックがありますね。貴方が書き込んだレスは例外なのでしょうか?)
>「定石」とは何でしょうか?
考えられる不具合を回避するのに最善な方法を取るべきでしょうという意味です。
既知の方法を取るのが一番無難な方法ではないでしょうか。
瀬戸っぷさんがわざわざ FindFirstFile を提示してくださっているのに、動作
報告など全く無いまま GetFileInformationByHandle を使いたがる理由は何なの
でしょうか?
通常の運用であれば CreateFile で GENERIC_READ 指定しても良いはずです。
普段から質問の初心者に対して厳しい言葉を発している貴方ですが、ご自身に対しては
随分と甘いのですね。
FindFirstFile とは複数のまたは、同一の拡張子を持つファイルを「列挙」する関数
と他の解説書から、解釈いたしました
GetFileInformationByHandleは特定の単一ファイルを指定し、そのファイル情報を取得
する関数と解説書より解釈しました
私のニーズは、後者(特定の単一ファイルを指定し、そのファイル情報を取得)です
・ファイル情報取得の際、ファイルの物理オープンはしたくない
物理的オープンの発生は、監視しているファイルをメンテナンスしている
プログラムに悪影響(ファイルロック)等を与える危険性を含んでいるから
です
・取得したいファイルの場所およびファイル名は特定のもの
成歩堂さんが記載した
>CreateFile 以外で GENERIC_READ 属性を持つ FileHandle を取得できる関数が
>有るか無いか。
については、ファイルハンドルの取得方法についての質問じゃなかった
つまりニーズにあった記載ではなかったので放置しました
>wood 2004/09/05(日) 21:58:11
>サービス.EXE本体がネットワークドライブに存在した場合は
については
>補足 2004/09/05(日) 20:36:38
の記載に「ネットワーク」と言う言葉があったのでそれに対して
具体的「ケース」を提示し、再質問したまでのことで、
実際の運用には関係ございません
MSDNのコピペについては、回答内容として記載されましたので、
回答内容の不明点を再質問したまでです
また、「Windows9x」についても同様です
MSDNの大雑把な内容+
>失敗することがあります。
どんなケースで失敗するのか、一例くらいは知りたくなりませんか?
「Windows9x」についても
>取得出来ないケースがあるらしいです
ケースってなにどんなこと、「らしい」とは何?、
それはWinXPにおいても同様に起こりうること?
正確な情報をいただけなければ、情報の選択なんて俺にはできません
だから質問しているのです
質問の回答として「らしい」じゃわからないから再質問が増えるんです
理解できないことを質問する掲示板だと思って利用してますが
聞いちゃいけない掲示板だったのでしょうか
>考えられる不具合
とは、なに?
ネットワークをダウンさせる可能性があるとか?(ローカルで実行するのに)
アクセスバイオレーションを引き起こす可能性があるとか?
何らかのモジュール(DLLやOCX)内部でページ違反起す可能性がある?
少なくとも、今のデバック環境においては発生していませんが
「らしい」じゃわかりません、具体例ください
俺の知らない、解釈できない、知識範囲外の情報だからこそ解説してほしいんです
具体的問題点を知ってこそ良いものを作ることが出来ると
何故わかっていただけないのでしょう?
------------------------------------
このスレッドは俺の質問コーナーだ!
他のスレッドの事を持ち出すのなら、それは雑談掲示板へ行ってください
ここの利用方法に反します(質問ニーズにあった参考記事は別)
当然、どのスレッドなのかも、リンク張ってください
>中途半端に横レス
に対して、その質問者から、俺のように「ここの所、ここの記載の意味がわかりませ
ん、再度解説してください」と言う書き込みありましたでしょうか
あったんだったら見逃してました
------------------------------------
CreateFile は、Win32 API でファイルを扱う際の、最も基点かつ低レベルな関数です
(NTDLL.DLL 除く)。
対して GetFileInformationByHandle や FindFirstFile は、より高レベルな関数ですの
で、ひょっとしたらそれらは内部で CreateFile を呼んでいる可能性も否定できませ
ん。
DLL の逆汗でもすれば、真偽は明らかになるかもしれませんが、その結果さえいつまで
通用するか保証はできません。
明示的に CreateFile しなきゃオープンされないとは限りませんよ、ということです。
> FindFirstFile とは複数のまたは、同一の拡張子を持つファイルを「列挙」する関数
> と他の解説書から、解釈いたしました
> GetFileInformationByHandleは特定の単一ファイルを指定し、そのファイル情報を
> 取得する関数と解説書より解釈しました
> 私のニーズは、後者(特定の単一ファイルを指定し、そのファイル情報を取得)です
> 成歩堂さんが記載した
> >CreateFile 以外で GENERIC_READ 属性を持つ FileHandle を取得できる関数が
> >有るか無いか。
> については、ファイルハンドルの取得方法についての質問じゃなかった
> つまりニーズにあった記載ではなかったので放置しました
ニーズに合った解答が欲しいのは誰しも同じですが、放置はいけません放置は。
ニーズに合ってないなら合ってないと、一言言うべきでしょう。
> どんなケースで失敗するのか、一例くらいは知りたくなりませんか?
知りたいのは当然ですが、ではどうすれば知ることができるのでしょう?
MSDN には、どのような場合に失敗し、どのような場合なら成功するのか明記されていま
せん。
MSDN に書かれていない以上、これ以上取得できる一次情報はありません。
確実な情報が欲しければ、Microsoft に問い合わせるくらいしかないでしょう。
また、多少確実性は落ちるとしても、成功/失敗の経験談を探すという手もあるでしょ
う。
それらを探すのは、回答者の責任ですか?
手がかりをもらったら、それをもとに調べるという発想はありませんか?
> 質問の回答として「らしい」じゃわからないから再質問が増えるんです
> 理解できないことを質問する掲示板だと思って利用してますが
> 聞いちゃいけない掲示板だったのでしょうか
では、回答者は一から十まで理解していなければ回答してはいけませんか?
回答者にだって「らしい」という以上のことはわかりません。
> ここの利用方法に反します(質問ニーズにあった参考記事は別)
そんな規約はどこにもありません。
少々、自己中が過ぎやしませんか?
私は、_findfirst(FindFirstFileと動作はほぼ同じ)でファイル情報を取得していました
が、単体ファイルでもOKのはずですが。
なにか勘違いしてませんか?
一度、冷静になられてはいかがでしょう。
誰も触ってないようなので、質問2について・・・
何か参考になることをと思ったのですが、情報が足りません・・・orz
なので、質問・・・
1、エラーの原因は特定できませんか?
実際にどこで落ちるのか全くわからないのでしょうか?
# 私の予想はTimer 周りでないかと・・・
2、サービスに停止の権限は与えてありますか?
# 関係ないかも?
3、手順として、SERVICE_STOP_PENDING してからSERVICE_STOPPED の方がよいと思います
が、
そこは関係してないですか?
# 状態の値を設定するだけだったと思うから関係ないとは思いますが・・・
とりあえず、Timer 止めても同じ症状なのか等チェックしてみてはいかがですか?
シャノン さん ありがとうございます
言いたいことは、わかりました
しかし、一言言わせてもらいます(最後に書き込んであることに対して)
>> ここの利用方法に反します(質問ニーズにあった参考記事は別)
>そんな規約はどこにもありません。
>少々、自己中が過ぎやしませんか?
他のスレッドの事ですが、誹謗・中傷に当たる発言と受け取りましたので
「利用方法に反します」と書き込みました
>(そういう割には、貴方はつい最近、中途半端に横レスを入れたまま放置されている
>トピックがありますね。貴方が書き込んだレスは例外なのでしょうか?)
この書き込みは私の質問になんら関係のある書き込みとは思えませんでした
アイススケーター さんありがとうございます
ご指摘の関数は、特定ファイル1つの情報を探す場合FindFirstFileの後に
必ず、FindnextFileを呼ばないと取得できないもの、と思ってました
あいる さん
質問2に触れていただきありがとうございます
エラー発生箇所
デバックのステップ実行ではAPPWIZARDが生成した「サービス.exe」のソース
サービス.CPP 内にある
void CServiceModule::SetServiceStatus(DWORD dwState)
{
m_status.dwCurrentState = dwState;
::SetServiceStatus(m_hServiceStatus, &m_status);
}
::SetServiceStatus(m_hServiceStatus, &m_status);この関数に
ステップインしたときに発生します
エラー内容
「ハンドルされていない例外は サービス.EXE(ADVAPI32.DLL)にあります
0xC0000005 アクセスバイオレーション」
timer 気づきませんでした 試してみます
2.はadministrator権限を持つユーザーで開発していますが
他にも何か設定が必要なのでしょうか
方法を教えてください
3.最初に提示してあるとおり
SetServiceStatus(SERVICE_STOPPED);
これだけしかしていません
先にSERVICE_STOP_PENDINGをやってみます
このコーディングを
if(m_chkfil == INVALID_HANDLE_VALUE ){
sprintf(m_error_str,%s,GetSystemMessage(GetLastError()));
MessageBox(NULL,m_error_str, err,MB_OK);
SetServiceStatus(SERVICE_STOPPED);
}
↓↓
if(m_chkfil == INVALID_HANDLE_VALUE ){
sprintf(m_error_str,%s,GetSystemMessage(GetLastError()));
MessageBox(NULL,m_error_str, err,MB_OK);
KillTimer(NULL, m_timer);
SetServiceStatus(SERVICE_STOP_PENDING);
}
に変えて試して見ます
記述・使い方に間違いがあれば、ご指摘お願いします
あいる さん ありがとうございました
エラーが出ることなく、終了させることが出来ました
質問2については解決にしたいところですが
あいる さんがもし、2番に書いてくれた方法を教授していただけるなら
方法を教えてください
できれば、実際にどんなコードになったのか書いておいた方がいいかと・・・(^^;
# 解決しましたじゃなんとなく・・・ね(^^;
# 結局Timer だったのかな??
2は、サービスのInitialize の時構造体にセットする値の話なので、最初に提示されて
いる参考サイトにあります
# サイトにある書き方とだいぶ違って書かれていたので、詳しく見てないのかもと思い
聞いてみました。
# 要はSERVICE_ACCEPT_STOP は指定されていますか?って事ですね。
# 内部で処理される場合は特に関係ないと思いますが、もしかしたらあるかな?と思
い・・・
3についてなのですが・・・変更しましたか?
もし変更したのであれば、STOP_PENDING にして、KillTimer して、STOPPED にする方が
いいかも?
# STOP_PENDING は停止中なので、このステータス時は停止前に処理すべき事を記述し
# 後片付けが終わってからSTOPPED にするのが状態遷移的に美しいかと思います。
私は特に、回答したわけではないので・・・陥りやすい所を聞いてみたまでです(^^;
このコーディングを
if(m_chkfil == INVALID_HANDLE_VALUE ){
sprintf(m_error_str,%s,GetSystemMessage(GetLastError()));
MessageBox(NULL,m_error_str, err,MB_OK);
SetServiceStatus(SERVICE_STOPPED);
}
↓↓
if(m_chkfil == INVALID_HANDLE_VALUE ){
sprintf(m_error_str,%s,GetSystemMessage(GetLastError()));
MessageBox(NULL,m_error_str, err,MB_OK);
KillTimer(NULL, m_timer);
SetServiceStatus(SERVICE_STOP_PENDING);
}
のままです、もしかしてただ異常終了しなくなっただけで解決したと思ったけど
違うのかも...
デバックウィンドウには「XXX は0x00で終了しました」と出ていましたので
てっきり解決したと思い込んでいました
あいる さん のアドバイスからすると、なんか足りないみたいですね
>結局Timer だったのかな??
たぶんそうだと思うのですが、
いっぺんに「SetServiceStatus(SERVICE_STOP_PENDING);」も変えた結果なので
一概にはいえません、もう一度再現ステップ踏んで見ます
後日、結果書き込みます
GetFileInformationByHandle についてちょっと調べてみました。
この API は UNIX の fstat() を意識して作られています。ただ FileSystem の違い上、
struct stat と BY_HANDLE_FILE_INFORMATION は同一になりません。
そのため Cygwin の fstat はさらに他の情報も調べているので激遅になっています
http://www.kaimei.org/note/mag/in_cyg.html
また WIN32s では API 自体は成功するが一部情報が入っていないという記述がありました。
http://kmaebashi.com/bbs/bbs09.html
MSDN の記載
May fail, return partial information ...
の意味は私は以下のように解釈しましたが正しいかどうかは定かではありません。
ネットワークドライブの割り当て等で接続した先 例: net use n: \\server\share
のファイルは、当該サーバに存在します(当然)
当該サーバのファイルシステム/OS が Windows と同一であるとは限りません。
たとえば接続先はいにしえの MS-DOS MS-Networks server かもしれませんし、
OS/2 か samba か NetWare か、あるいは私の見たことの無い OS かもしれません。
接続先ファイルシステム/OS によっては Windows でいうところの
「ファイル属性」「タイムスタンプ」の概念が無いかもしれません。
そーいう場合には(すべての)内容が得られるとは限らない、ということのようです。
同様の記載は FindFirstFile/WIN32_FIND_DATA のところにもあります。
サーバーがどうのこうのは W2k Server Edition 等や SQL サーバとは無関係かと。
wood 2004/09/06(月) 06:10:55
ローカルサービスをネットワークドライブにインストールすることは可能です。
ローカルサービスを FAT12 なフロッピーディスクにインストールすることは可能です。
# 実用的運用ができるかどうかは別。
補足 2004/09/06(月) 23:58:29
さんの言葉を借りておきます。
掲示板に発言された情報を「取捨選択するのは貴方の自由」です。
ただ、「俺にはそんな情報は不要だ」と公言するのはいかがなものかと。
tetrapod さん
大変ご苦労をおかけし、貴重な情報を探してくれた事に感謝いたします
雑談の法へ
「シャノン さんへ」あてに書いたとおり、障害が発生してから悩むことにしました
ご尽力を尽くしてくださった、大変ご迷惑をおかけしました
質問 1 については、この記載を持ってクローズいたします
なお、質問 2 については、「あいる さん」への報告は
この時点でかけません(試してません)ので、解決マークのチェックは
入れません
あいる さんへ
timer は関係無いみたいです
SetServiceStatus(SERVICE_STOPPED);
をいきなり使おうとするから、異常終了メッセージが出るようです
そこで 変わりに
Uninstall();を記述するか
教えてもらったように記述をし
SetServiceStatus(SERVICE_STOP_PENDING);
さらに
PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
このようにすると
正常に終了するみたいです
ただし。Uninstall では無い、後者の方法ですと
デバックウィンドウに0X00による正常終了メッセージの前に「名前がありません」
の表示がされてます
なお、お騒がせしている「サーバー」と言う言葉について
プロジェクトのビルドの最中にビルドウィンドウに
---------------------------
リンク中...
登録を行っています
サーバー登録が完了しました! ←← ここ
ブラウザ データベースを作成中...
HOGEHOGE.exe - エラー 0、警告 0
---------------------------
「サーバー登録が完了しました!」と出てました、詳細は不明(説明できません)ですが
普段「エラー 0、警告 0」しか見ていませんでしたから気づきませんでしたけど
何サーバーか良くわからないけど、たとえローカル(単体マシン)OSでも
サーバーと言う種類のものに何かしてるんですね