Windows 2000 でも SysLinkが使える?
SysLinkクラスのオブジェクトをクリエートするとダイアログの生成に失敗してしまうので、KDWではSysLinkを作成した場合に限りStaticに置き換えるようにしています。
ところが、この処理を行っていると、Windows
Updateで ダイアログのリンク部分が、テキストになってしまうのです。
これはどういうことなのでしょうか?
というわけで、wuapi.dll
を解析してみました。
すると、
if(SUB_L506DD422(par1,par2,L"SysLink")=S_OK){ msvcrt.dll!??2@YAPAXI@Z(0x24,0); } function WINAPI SUB_L506DD422(void |
どうやってるのかはわかりませんが、Createしてますね。う~ん。
とりあえず、今日はここまで。
続き、実際にトレースしてみたところ、
CreateWindowsExに失敗した場合分岐して、リンクを作成しているということがわかりました
○+<
どてっ。
でも、Shell32.dllの非公開関数の
LinkWindow_RegisterClassを使ってるわけではないんですよね。
じゃあ、どうやってリンクを作成しているのかというと、その直後の命令がどうも担ってるようです。
if(SUB_L506DD422(par1,par2,L"SysLink")==NULL){ res=msvcrt.dll!??2@YAPAXI@Z(0x24); if(res){ hWnd=SUB_L506DDF9F(res); } } |
SUB_L506DDF9Fで何かすごいことをやってるのかなと思って、解析してみたのですが、
Windowスタイルを変更して、クリックしたときに、Window
プロシージャーでジャンプさせてるだけでした。
うーん、残念。
っていうか、分岐させる必要性ないような気がする。
というわけで、一連のコードを、LinkWindow_RegisterClassで実行してみることに。
RECT rc; DWORD STY1,STY2,STY3; HWND hStwnd,hPwnd,hLink; DWORD hFont; char str[512]; HINSTANCE hLibrary; hStwnd=GetDlgItem(hDlg,IDC_STATIC); GetWindowRect(hStwnd,&rc); hPwnd=GetParent(hStwnd); hFont=SendMessageW(hStwnd,WM_GETFONT,0,0); MapWindowPoints(0,hPwnd,(POINT*)&rc,2); GetWindowText(hStwnd,str,512); STY1=GetWindowLongW(hStwnd,GWL_STYLE); if(STY1&0x10000000){ STY1&=~0x10000000; STY3=0x40; } else STY3=0; STY2=GetWindowLongW(hStwnd,GWL_EXSTYLE); BOOL (FAR STDAPICALLTYPE * pLinkWindow_UnregisterClass)(HINSTANCE hInstance) ; BOOL (FAR STDAPICALLTYPE * pLinkWindow_RegisterClass)(void) ; hLibrary = LoadLibrary("shell32.dll"); if (hLibrary){ (FARPROC&)pLinkWindow_RegisterClass = GetProcAddress(hLibrary,(char*)258); (FARPROC&)pLinkWindow_UnregisterClass = GetProcAddress(hLibrary,(char*)259); if(pLinkWindow_RegisterClass){ pLinkWindow_RegisterClass(); hLink=CreateWindowEx(STY2,"Link Window",str,STY1,rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top,hDlg,(HMENU)IDC_STATIC,0,0); if(hLink){ SendMessageW(hStwnd,WM_SETFONT,hFont,0); SetWindowPos(hLink,hStwnd,0,0,0,0,0x13|STY3); DestroyWindow(hStwnd); if(pLinkWindow_UnregisterClass) pLinkWindow_UnregisterClass(GetModuleHandle(NULL)); } } } |
うーむ、ふつーに表示されてるようだ
いただいたコメント
[1] 名の無い猫さん さんのコメント 2008/07/03 07:37:59
LinkWindow_RegisterClassではないでしょうか?
[2] 黒翼猫 さんのコメント 2008/07/03 08:41:19
ところが、SHELL32.258 (LinkWindow_RegisterClass)
を使ってる形跡がないんですよね。
Comments