ファイルタイムスタンプ取得 +α について – プログラミング – Home

ファイルタイムスタンプ取得 +α につ...
 
通知
すべてクリア

[解決済] ファイルタイムスタンプ取得 +α について

固定ページ 1 / 3

wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
Topic starter  

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
周辺で聞ける人いません(汎用コボラー のみ)


引用未解決
トピックタグ
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
Topic starter  

追伸
「MFCは使えない」みたいな解説ありましたのでWin32APIでの回答をお願いします


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
Topic starter  

環境変更
 VC6 SP6 WinXP(Pro) SP2

実行環境
 開発中および、デバック中はWinXP(Pro) SP2
 本稼動は、Win2000(Pro)で実行したいと思ってます
 


返信引用
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 22年前
投稿: 160
 

>   CreateFile関数は使用するとファイルをオープンしてしまう様に解釈出来て
>   しまうのですが間違いでしょうか?

MSDNを参照すると、第二引数を0とするコトで「問い合わせアクセス」が可能なようです。
その場合、「最終アクセス時間」が更新されるかどうかは不明です。
# 試したことはありませんが。

>   間違いでなければ、ファイルオープンをせづに、ハンドルの習得または
>   ファイルタイムスタンプの取得を行うことは出来ませんでしょうか
>   出来るのであれば、どんな関数を使って取得すればよいか教えてください

FindFirstFile()で、WIN32_FIND_DATA構造体に取得できるかと。


返信引用
成歩堂
 成歩堂
(@成歩堂)
ゲスト
結合: 20年前
投稿: 4
 

ただ、GetFileTimeの第一引数について、MSDNにはこう書かれているのですが。

>ファイルのハンドルを指定します。このハンドルは、GENERIC_READ アクセスを持って
いなければなりません。


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
Topic starter  

成歩堂さん はじめまして
>ただ、GetFileTimeの第一引数について、MSDNにはこう書かれているのですが。
>ファイルのハンドルを指定します。このハンドルは、GENERIC_READ アクセスを持って
>いなければなりません。

そのとおり CreateFile を行う際に
GENERIC_READ を指定したソースを最初に掲示したつもりですが、方法が違うのでしょうか?
何に対する回答なのか不明です

瀬戸っぷ さん 早々の回答ありがとうございます
>FindFirstFile()で、WIN32_FIND_DATA構造体に取得できるかと。
いわれてみれば記憶の片隅に「FindFirstFile」聞いたことあります
自宅に帰ったら早速調べてみます


返信引用
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 22年前
投稿: 160
 

> ただ、GetFileTimeの第一引数について、MSDNにはこう書かれているのですが。
> >ファイルのハンドルを指定します。このハンドルは、GENERIC_READ アクセスを持っ

> >いなければなりません。

ありゃ、調べていなかった。(というか、第二引数以降の型を確認しただけで(^_^;))
フォローどうもです。

アクセス無しって条件なら私はFindFrstFile()で処理しようとしますので。
(単体ファイルが対象だとCreateFile()とGetFileTime()かも知れませんが。)


返信引用
成歩堂
 成歩堂
(@成歩堂)
ゲスト
結合: 20年前
投稿: 4
 

WOODさん初めまして

>何に対する回答なのか不明です

話の流れで瀬戸っぷさんの書き込みに対して書いただけです。

前後しますが

>そのとおり CreateFile を行う際に
>GENERIC_READ を指定したソースを最初に掲示したつもりですが、方法が違うのでし
ょうか?

その通りと言われましても、少なくとも質問でそれと明文化されてませんし。


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
Topic starter  

再度 質問1の主旨
単体ファイルが更新された日付・時間の取得が対象だとCreateFile()とGetFileTime()
の組み合わせ以外ない物でしょうか
つまりファイルをオープンしなければ、取得できないのでしょうか


返信引用
成歩堂
 成歩堂
(@成歩堂)
ゲスト
結合: 20年前
投稿: 4
 

(最初の質問が端折られたようにしか見えませんが…)

最初の質問や途中の私に対するレスから勘案するに、WOODさんは次の点が知りたい
のではないのですか?

>CreateFile 以外で GENERIC_READ 属性を持つ FileHandle を取得できる関数が
>有るか無いか。

ならば、少なくとも私は無いと思っています。

ちなみに既に書きましたように、GetFileTime に渡す FileHandle には GENERIC_READ
属性が付けられていなければなりませんが、この仕組みはこのケースに限らず
GetFileSize 等でも同様です。
インターネット上で見つかるサンプルソースでも CreateFile との組み合わせ以外は
見かけたことはありません。


返信引用
通りすがり
 通りすがり
(@通りすがり)
ゲスト
結合: 24年前
投稿: 92
 

>再度 質問1の主旨
>単体ファイルが更新された日付・時間の取得が対象だとCreateFile()とGetFileTime()
>の組み合わせ以外ない物でしょうか
>つまりファイルをオープンしなければ、取得できないのでしょうか

瀬戸っぷさんが
>FindFirstFile()で、WIN32_FIND_DATA構造体に取得できるかと。
と書かれていますよ。
FindCloseしなければならないので手間はオープンする場合と同じだと思いますが。


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
Topic starter  

見つけた!
瀬戸っぷさんが教えてくれた「問い合わせアクセス」がでファイルの状態を取得可能
関数ありました

秀和システム 「Visual C++ 逆引き大全」の399に解説ありました
関数名は「GetFileInformationByHandle」だそうです

まだ、試していないのと 質問2も解決していないのでもう少しお付き合い
ください


返信引用
補足
 補足
(@補足)
ゲスト
結合: 20年前
投稿: 4
 

この関数は、オペレーティングシステムのネットワークコンポーネントと、それに接続
されるサーバーの種類によっては、失敗することがあります。したがって、アプリケー
ションの動作環境がはっきりしている場合以外は、この関数を使わないようにしてくだ
さい。


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
Topic starter  

今回はローカルサービスとしてexeを作成するつもりですが
>サーバーの種類によっては、失敗することがあります
せっかく補足していただいたので
失敗しないサーバーの種類とはどんなものがあり、失敗するサーバーの種類とは
どんなものがあるのでしょうか
向学のため是非教えてください


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
Topic starter  

サービス.EXE本体がネットワークドライブに存在した場合は
>補足 2004/09/05(日) 20:36:38
に該当するのでしょうか?


返信引用
固定ページ 1 / 3

返信する

投稿者名

投稿者メールアドレス

タイトル *

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