Windows 2000 でも SysLinkが使える?

Windows 2000で
SysLinkクラスのオブジェクトをクリエートするとダイアログの生成に失敗してしまうので、KDWではSysLinkを作成した場合に限りStaticに置き換えるようにしています。

ところが、この処理を行っていると、Windows
Updateで ダイアログのリンク部分が、テキストになってしまうのです。
Update

これはどういうことなのでしょうか?
というわけで、wuapi.dll
を解析してみました。

すると、

if(SUB_L506DD422(par1,par2,L"SysLink")=S_OK){
         
msvcrt.dll!??2@YAPAXI@Z(0x24,0);
}

function  WINAPI SUB_L506DD422(void
*par1,void *par2,char *Classname){
    DWORD
RET,RET2,RET3,RET4,STY1,STY2,DAT;
    TRect TMP;
    HWND
hWnd,hWnd2;
    RET4=0;
   
RET=SUB_L506DCF40(par1,par2,&TMP);//GetRect
   
if(RET>0){
          hWnd=GetDlgItem(par1,par2);
         
if(hWnd){
            
RET2=SendMessageW(hWnd,WM_GETFONT,0,0);
            
if(RET){
                RET3=SUB_L506DD22A(hWnd,&RET4);//new and
GetText
                if(RET3){
                 
STY1=GetWindowLongW(hWnd,GWL_STYLE);
                 
STY2=GetWindowLongW(hWnd,GWL_EXSTYLE);
                 
DAT=0;
                  if(STY1&WS_VISIBLE){
                     
STY1&=~WS_VISIBLE;
                      DAT=0x40;
                 
}
                 
hWnd2=CreateWindowExW(STY2,Classname,RET4,RET2,
TMP.Left,TMP.Top,TMP.Right-TMP.Left,TMP.Bottom-TMP.Top,par1,par2,0,0);
                 
if(hWnd2==NULL){
                      
RET=(GetLastError&0xffff)|0x80070000;//SUB_L506B121A
                 
}
                  else{
                    
RET2=SendMessageW(hWnd2,WM_SETFONT,RET2,0);
                    
SetWindowPos(hWnd2,hWnd,0,0,0,0,DAT|0x13);
                    
DestroyWindow(hWnd);
                     RET=0;
                  
}
              }
         }
     }
    
free(&RET4);//SUB_L506DEFE7
     return
RET;
}

どうやってるのかはわかりませんが、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で実行してみることに。

Update

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)); 
     }
  
}
}

Update
うーむ、ふつーに表示されてるようだ


いただいたコメント
[1]  名の無い猫さん さんのコメント 2008/07/03 07:37:59
 LinkWindow_RegisterClassではないでしょうか?

[2]  黒翼猫 さんのコメント 2008/07/03 08:41:19
ところが、SHELL32.258 (LinkWindow_RegisterClass)
を使ってる形跡がないんですよね。

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です