喫茶XRAYトップページ

[スレッド全体
]

[3972] Re:フォルダ監視 in Win2000返信 削除
2010/12/1 (水) 21:22:47 Sara
▼ Mr.XRAYさん こんばんは

> plFolderWatcherですが,Windows2000では使用てきないようです.
>>
>> ありがたく省略
>>
> 非常に残念ですが...  m(_ _)m
> とりあえず,現在までの調査報告です.


むぅ・・・残念と あきらめきれずに、さらに確認をしましたところ。
実際にできている人がいるのがわかりました・・・

ので、さらに調べてみたところ・・・以下の方法で実現できました。(^^)V

  TplFolderWatcher = class(TComponent)
  private
 //
 //上下の記述省略
 //
    Shell32WHND : LongInt;
  protected
 //
 //上下の記述省略
 //

type
  _SHChangeNotifyEntry = record
    pidl: PItemIDList;
    fRecursive: BOOL;
  end;
  SHChangeNotifyEntry  = _SHChangeNotifyEntry;
  TSHChangeNotifyEntry = SHChangeNotifyEntry;
  PSHChangeNotifyEntry = ^TSHChangeNotifyEntry;

{ Windows2000でエラーになるので、コメントアウト
  function ILClone(pidl: PItemIDList): PItemIDList; stdcall; external 'shell32.dll';
  function SHChangeNotifyRegister(hwnd: HWND; fSources: Integer; fEvents: Integer;
    wMsg: UINT; cEntries: Integer;
    var pshcne: TSHChangeNotifyEntry): ULONG; stdcall; external 'shell32.dll';
  function SHChangeNotifyDeregister(ulID: LongWord): BOOL; stdcall;
    external 'shell32.dll';
}
 //
 //上下の記述省略
 //

//グローバル変数として記述
  ILClone1 : function (pidl: PItemIDList): PItemIDList; stdcall;
  SHChangeNotifyRegister1 : function (hwnd: HWND; fSources: Integer; fEvents: Integer; wMsg: UINT; cEntries: Integer; var pshcne: TSHChangeNotifyEntry): ULONG; stdcall;
  SHChangeNotifyDeregister1 : function (ulID: LongWord): BOOL; stdcall;

 //
 //上下の記述省略
 //

constructor TplFolderWatcher.Create(AOwner: TComponent);
var SysDir : String;
    p : pAnsiChar;
 function SpecialFolderGet(CSIDL : Integer):String;
 var pPath : PChar;
 begin
   pPath := StrAlloc(1000);
   SHGetSpecialFolderPath(0,pPath,CSIDL,False);
   Result := StrPas(pPath);
   StrDispose(pPath);
 end;
begin
//
// 上下の記述省略
//

  if (csDesigning in AOwner.ComponentState) then exit;

  SysDir := SpecialFolderGet(CSIDL_SYSTEM);
  Shell32WHND := LoadLibrary(PChar(SysDir + '\SHELL32.DLL' + #0));
  if Shell32WHND >= HINSTANCE_ERROR then begin
     Pointer(p) := GetProcAddress(Shell32WHND, MAKEINTRESOURCE(2));
     @SHChangeNotifyRegister1 := Pointer(p);
     Pointer(p) := GetProcAddress(Shell32WHND, MAKEINTRESOURCE(4));
     @SHChangeNotifyDeregister1 := Pointer(p);
     Pointer(p) := GetProcAddress(Shell32WHND, MAKEINTRESOURCE(18));
     @ILClone1 := Pointer(p);
  end;

end;

destructor TplFolderWatcher.Destroy;
begin
  StopWatch;
  inherited Destroy;

  if (csDesigning in ComponentState) then exit;
  if Shell32WHND >= HINSTANCE_ERROR then FreeLibrary(Shell32WHND);
end;

として、ShCangeNotifyRegisterを実際に使用しているところで、グローバル変数で
記述した名称で呼べばWindows2000で動作するようです。

なるほど、非公開APIというのは、名前が付いてないだけなんですね・・・(^^;
勉強になりました。


PS.
Windows2000でもコンテキストメニューは正常に新規作成が表示されていました。
あとは、XPで常時表示されるようになれば・・・(^^;

よろしくお願いいたします。m(_ _)m

[3973] Re2:フォルダ監視 in Win2000 動作確認返信 削除
2010/12/1 (水) 22:00:18 Mr.XRAY
▼ Saraさん,どうも.

コードありがとうございます.

> むぅ・・・残念と あきらめきれずに、さらに確認をしましたところ。
> 実際にできている人がいるのがわかりました・・・


実は私もできている人がいることを確認しました.

http://clubdelphi.com/foros/showthread.php?t=49722&highlight=SHChangeNotifyRegister

実際に実行してみたら,機能しました.
で,コードをみたら,Saraさんの言われるように,
interface部に定義していました(つまりグローバル).

implementation 部に記述しているのは,他のDelphiのバージョンの
ShlObj.pasに定義があるため,重複しないようにするためだったん
ですが,interface部でもバージョンチェックすればいいのでは
ないかと思っています.

SHChangeNotifyRegisterは,検出の仕方が違うんですね.
いやいや,今回は,非公開APIについて勉強になりました.


[3974] Re3:フォルダ監視 in Win2000 動作確認返信 削除
2010/12/1 (水) 22:10:08 Mr.XRAY
それにしても,SHChangeNotifyRegisterを使用したサンプルや
コンポーネントを提供してる方っているんですね.

あまり調べないで作ってしまいましたが,もう少し調べれば
よかったと反省しています.


[3975] Re4:フォルダ監視 in Win2000 動作確認返信 削除
2010/12/2 (木) 01:27:36 Sara
▼ Mr.XRAYさん こんばんは。

> それにしても,SHChangeNotifyRegisterを使用したサンプルや
> コンポーネントを提供してる方っているんですね.
>
> あまり調べないで作ってしまいましたが,もう少し調べれば
> よかったと反省しています.


いえいえ、日本語で提供しているところが、ほとんどないことを考えれば
非常に貴重だと思います。(^^)

私も、英語はまったくだめで、文書は無視してソースだけを頼りに
調べ物をするので・・・(^^; 結構行き当たりばったりでテストしますし。(^^;


今回も、もとになるMr.XRAYさんのコンポーネントがなかったら、調べなかった
かもしれないし・・・(^^;

今後も、貴重な情報提供をよろしくお願いします。(^^; (他力本願・・・)

[3976] Re5:フォルダ監視 in Win2000 動作確認返信 削除
2010/12/2 (木) 14:26:30 Mr.XRAY
▼ Saraさん

>01:27:36

ひぇー.この時刻.バク睡中です.多分.
でも昔,パソコン通信時代は,こんな時刻のカキコが多かったですね.

> いえいえ、日本語で提供しているところが、ほとんどないことを考えれば
> 非常に貴重だと思います。(^^)


ハハハッ.こういうこと言われると,モチベーションが上がってしまって
困ります.

> 私も、英語はまったくだめで、文書は無視してソースだけを頼りに
> 調べ物をするので・・・(^^; 結構行き当たりばったりでテストしますし。(^^;


同じく(笑).技術者は英語力は必要ですね.痛感しています.
昔,ヒューレッドパッカードのコンピュータを使用している時に,
「マニュアル日本語にならないかなー」と,HPの人に言ったことが
あります.

> 今回も、もとになるMr.XRAYさんのコンポーネントがなかったら、調べなかった
> かもしれないし・・・(^^;


私もSaraさんの発言がなければ知ることができなかったです.
でも,私も調べて,Saraさんも調べて,何か昔のパソコン通信時代のやりとり
を思い出します.


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82