喫茶XRAYトップページ


[3965] plFolderWatcherとplContextMenuについて返信 削除
2010/11/29 (月) 23:57:41 Sara
いつもお世話になっております。Saraと申します。


当方の環境はDelphi2010 OSはWindows2000〜Windows7です。
(あぁVISTAのテスト環境はないです)
(ちなみに、Win7以外はVMPlayer上の環境です。)


質問1

plFolderWatcherを使ったプログラムをWindows2000で起動すると、
画像のとおりのエラーになります。
(XP以降では正常に動作しています。)

利用する手立てはありますでしょうか?

どこかのサイトにWindows2000のShell32.DLLではSHChangeNotifyRegisterは
序数指定が必要な未定義関数とか書いてあったので、とりあえず定義部分に
Index 2を追加してみましたが、状況は変わりませんでした。

まぁWindows2000を対象外にするのが一番早いのですが、ちょっと悔しくて・・・(^^;


質問2

WindowsXPでplContextMenuを使ったってDelphi付属ShellTreeView改で
コンテキストメニューを表示すると、新規作成メニューが出たり出なかったり
するのですが、なぜでしょうか?
(メニューの一番下に区切り線だけは表示されますが・・・)

Windows7上では正常に動作しているようです。

Windows2000は質問1の問題があって起動できていません。

おわかりになれば、ご教示お願いいたします。

[3966] Re:plFolderWatcherとplContextMenuについて返信 削除
2010/11/30 (火) 11:12:38 Mr.XRAY
▼ Saraさん.こんにちは.
なんか人柱になって頂いているようですね.すみません.

> plFolderWatcherを使ったプログラムをWindows2000で起動すると、
> 画像のとおりのエラーになります。
> (XP以降では正常に動作しています。)


Windows 2000ですか.最近起動していないですね.
VMWareですが.

> どこかのサイトにWindows2000のShell32.DLLではSHChangeNotifyRegisterは

あっ,そうなんですか,私も調べてみます.

> ちょっと悔しくて・・・(^^;

へへへっ,これが命取り,廃人への街道まっしぐらですね.

> (メニューの一番下に区切り線だけは表示されますが・・・)

ハハハッ,全く意味のない表示ですね.
たてぐやさんのところでは,結構例外が発生しているようです.
引き続き調査してみます.

> おわかりになれば、ご教示お願いいたします。

現在のところ分かりません(キッパリ!!  笑)

# 図の添付,ありがたいですね.やはり図は,状況把握に役に立ちます.
# 掲載する側としてはめんどうでしょうけど.


[3967] Re2:plFolderWatcherとplContextMenuについて返信 削除
2010/11/30 (火) 19:45:00 Sara
▼ Mr.XRAYさん、こんにちは。

> なんか人柱になって頂いているようですね.すみません.
いえいえ、こちらはなかなかに有用な情報が多く、大変助かっています。
このコンポーネントも非常に使いやすく素晴らしいです。(^^)V

> > ちょっと悔しくて・・・(^^;
> へへへっ,これが命取り,廃人への街道まっしぐらですね.

ま、まずい・・・ でも 性分だし・・・(^^;


> > (メニューの一番下に区切り線だけは表示されますが・・・)
> ハハハッ,全く意味のない表示ですね.
> たてぐやさんのところでは,結構例外が発生しているようです.
> 引き続き調査してみます.

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

> > おわかりになれば、ご教示お願いいたします。
> 現在のところ分かりません(キッパリ!!  笑)

アハハハ(^^;;

> # 図の添付,ありがたいですね.やはり図は,状況把握に役に立ちます.
> # 掲載する側としてはめんどうでしょうけど.

いえ、メッセージを見て入力しようとも思ったんですが、あまりにも
面倒で、ささっと、コピーして保存して添付しました・・・(^^;

何かわかりましたら、よろしくお願いいたします。m(_ _)m

[3970] フォルダ監視 in Win2000返信 削除
2010/12/1 (水) 11:27:42 Mr.XRAY
▼ Saraさん.こんにちは.

plFolderWatcherですが,Windows2000では使用てきないようです.
SHChangeNotifyRegister,調べました.
調査に使用したソフトは,Dependency Walkerというものです.

Dependency Walkerについては,以下の記事参照
http://owlsperspective.blogspot.com/2010/11/dependency-walker.html

Windows 2000 Pro(SP4) のshell32.dllには,plFolderWatcherで使っている
一連の関数がありませんでした(IEは6.0).

マイクロソフトの以下のページではWindows 2000以降となっていますが,
これは間違いですね.おそらく.
http://msdn.microsoft.com/en-us/library/bb762120%28VS.85%29.aspx

あと,こんな記事もありました.ここのリストにはありますが,
このサイトの方がどんな方法で調べたのかは不明です.

Windows2000SP4のSHELL32.DLL非公開API
http://blog.livedoor.jp/blackwingcat/archives/61990.html

Windows 2000で動作させるためには,shell32.dllを入れ替えないとダメ
でしょうね.
例えば,Windows XPのを使ってしまうとか (^^;

非常に残念ですが...  m(_ _)m
とりあえず,現在までの調査報告です.


[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