▼ 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
|