VC6 ATL サービス.EXE
Win XP SP1a
質問は2つあります
-------------ソース-------------
void CServiceModule::Run()
・
・
MSG msg;
// ユーザーコーディング ST
m_timer = SetTimer(NULL, NULL, 1000, NULL); //1秒設定
GetCurrentDirectory(sizeof(dir_str),dir_str);
strcat(dir_str,\\SCRIDX\\TLCSVC.IDX);
m_chkfil = CreateFile(
dir_str ,
GENERIC_READ|GENERIC_WRITE ,
FILE_SHARE_READ ,
NULL ,
OPEN_EXISTING ,
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_WRITE_THROUGH|FILE_FLAG_RANDOM_ACCESS
,
NULL);
if(m_chkfil == INVALID_HANDLE_VALUE ){
sprintf(m_error_str,%s,GetSystemMessage(GetLastError()));
MessageBox(NULL,m_error_str, err,MB_OK);
SetServiceStatus(SERVICE_STOPPED); ←ここ(2つ目質問
}
// ユーザーコーディング ED
while (GetMessage(&msg, 0, 0, 0))
・
・
-------------ソース-------------
1つ目:表題にもあります
ファイルのタイムスタンプを取得するために関数「GetFileTime」を使用する
と思うのですが、この関数の引数で、HANDLEが必要とされるため
CreateFile関数を使用してファイルハンドルを取得しなければいけない
ようなのですが
CreateFile関数は使用するとファイルをオープンしてしまう様に解釈出来て
しまうのですが間違いでしょうか?
間違いでなければ、ファイルオープンをせづに、ハンドルの習得または
ファイルタイムスタンプの取得を行うことは出来ませんでしょうか
出来るのであれば、どんな関数を使って取得すればよいか教えてください
2つ目:初期エラー発生時にサービスEXEのSHUTDOWNまたはSTOPをしたいと考え
SetServiceStatus(SERVICE_STOPPED);
のような記述をしました
コンパイルが通って、デバック実行したら アクセスバイオレーション
起こしてしまいました
目的にあったコーディングでは無いようなので、この目的を達成するためには
どのようにコーディングしたらよいでしょうか
参考書
技術評論社 「VisualC++6.0 ATLによるCOM プログラミング入門」
読んでみたがほとんど意味不明(理解できない)
参考にしたページ
http://program.station.ez-net.jp/special/vc/atl/service_vc6.asp
周辺で聞ける人いません(汎用コボラー のみ)
追伸
「MFCは使えない」みたいな解説ありましたのでWin32APIでの回答をお願いします
環境変更
VC6 SP6 WinXP(Pro) SP2
実行環境
開発中および、デバック中はWinXP(Pro) SP2
本稼動は、Win2000(Pro)で実行したいと思ってます
> CreateFile関数は使用するとファイルをオープンしてしまう様に解釈出来て
> しまうのですが間違いでしょうか?
MSDNを参照すると、第二引数を0とするコトで「問い合わせアクセス」が可能なようです。
その場合、「最終アクセス時間」が更新されるかどうかは不明です。
# 試したことはありませんが。
> 間違いでなければ、ファイルオープンをせづに、ハンドルの習得または
> ファイルタイムスタンプの取得を行うことは出来ませんでしょうか
> 出来るのであれば、どんな関数を使って取得すればよいか教えてください
FindFirstFile()で、WIN32_FIND_DATA構造体に取得できるかと。
ただ、GetFileTimeの第一引数について、MSDNにはこう書かれているのですが。
>ファイルのハンドルを指定します。このハンドルは、GENERIC_READ アクセスを持って
いなければなりません。
成歩堂さん はじめまして
>ただ、GetFileTimeの第一引数について、MSDNにはこう書かれているのですが。
>ファイルのハンドルを指定します。このハンドルは、GENERIC_READ アクセスを持って
>いなければなりません。
そのとおり CreateFile を行う際に
GENERIC_READ を指定したソースを最初に掲示したつもりですが、方法が違うのでしょうか?
何に対する回答なのか不明です
瀬戸っぷ さん 早々の回答ありがとうございます
>FindFirstFile()で、WIN32_FIND_DATA構造体に取得できるかと。
いわれてみれば記憶の片隅に「FindFirstFile」聞いたことあります
自宅に帰ったら早速調べてみます
> ただ、GetFileTimeの第一引数について、MSDNにはこう書かれているのですが。
> >ファイルのハンドルを指定します。このハンドルは、GENERIC_READ アクセスを持っ
て
> >いなければなりません。
ありゃ、調べていなかった。(というか、第二引数以降の型を確認しただけで(^_^;))
フォローどうもです。
アクセス無しって条件なら私はFindFrstFile()で処理しようとしますので。
(単体ファイルが対象だとCreateFile()とGetFileTime()かも知れませんが。)
WOODさん初めまして
>何に対する回答なのか不明です
話の流れで瀬戸っぷさんの書き込みに対して書いただけです。
前後しますが
>そのとおり CreateFile を行う際に
>GENERIC_READ を指定したソースを最初に掲示したつもりですが、方法が違うのでし
ょうか?
その通りと言われましても、少なくとも質問でそれと明文化されてませんし。
再度 質問1の主旨
単体ファイルが更新された日付・時間の取得が対象だとCreateFile()とGetFileTime()
の組み合わせ以外ない物でしょうか
つまりファイルをオープンしなければ、取得できないのでしょうか
(最初の質問が端折られたようにしか見えませんが…)
最初の質問や途中の私に対するレスから勘案するに、WOODさんは次の点が知りたい
のではないのですか?
>CreateFile 以外で GENERIC_READ 属性を持つ FileHandle を取得できる関数が
>有るか無いか。
ならば、少なくとも私は無いと思っています。
ちなみに既に書きましたように、GetFileTime に渡す FileHandle には GENERIC_READ
属性が付けられていなければなりませんが、この仕組みはこのケースに限らず
GetFileSize 等でも同様です。
インターネット上で見つかるサンプルソースでも CreateFile との組み合わせ以外は
見かけたことはありません。
>再度 質問1の主旨
>単体ファイルが更新された日付・時間の取得が対象だとCreateFile()とGetFileTime()
>の組み合わせ以外ない物でしょうか
>つまりファイルをオープンしなければ、取得できないのでしょうか
瀬戸っぷさんが
>FindFirstFile()で、WIN32_FIND_DATA構造体に取得できるかと。
と書かれていますよ。
FindCloseしなければならないので手間はオープンする場合と同じだと思いますが。
見つけた!
瀬戸っぷさんが教えてくれた「問い合わせアクセス」がでファイルの状態を取得可能
関数ありました
秀和システム 「Visual C++ 逆引き大全」の399に解説ありました
関数名は「GetFileInformationByHandle」だそうです
まだ、試していないのと 質問2も解決していないのでもう少しお付き合い
ください
この関数は、オペレーティングシステムのネットワークコンポーネントと、それに接続
されるサーバーの種類によっては、失敗することがあります。したがって、アプリケー
ションの動作環境がはっきりしている場合以外は、この関数を使わないようにしてくだ
さい。
今回はローカルサービスとしてexeを作成するつもりですが
>サーバーの種類によっては、失敗することがあります
せっかく補足していただいたので
失敗しないサーバーの種類とはどんなものがあり、失敗するサーバーの種類とは
どんなものがあるのでしょうか
向学のため是非教えてください
サービス.EXE本体がネットワークドライブに存在した場合は
>補足 2004/09/05(日) 20:36:38
に該当するのでしょうか?