imm32: Make space for a 64bit pointer in the IMM window.

Aric Stewart aric at codeweavers.com
Wed Feb 11 07:25:02 CST 2009


Ok digging into my IME documentation I see this:

"The cbWndExtra of the UI class has to be 2 * sizeof(LONG). The purpose 
of this WndExtra is defined by the system (for example, IMMGWL_IMC and 
IMMGWL_PRIVATE)."

So any IME developer is properly reserving 64 bits already. Which means 
my concern is not valid.

-aric

Michael Stefaniuc wrote:
> Aric Stewart wrote:
>> I am not a 64 bit expert but i do not think this is going to work.
>>
>> ddk/imm.h is a Microsoft header so IMEs and programs compiled with the
>> original header will not have the expanded space.
> They will as the Microsoft header has the exact same change as I did in
> this patch. It's not directly in imm.h but in immdev.h; our imm.h header
> would need to be split for "full compatibility" with the Microsoft DDK
> headers but that's something for an other patch.
> 
> bye
> 	michael
> 
>> To fix this properly (I assume you are trying to support 64 bit) is that
>> we will probibly have to store a handle instead of a pointer in the LONG
>> value.  The IME is expecting a HIMC in that value.
>>
>> Which leads to a more general question.  What is the suggested way to
>> generate handles like that? Working toward 64 bit means that everywhere
>> that we are using pointers as  LONG handles is going to have problems.
>>
>> -aric
>>
>> Michael Stefaniuc wrote:
>>> ---
>>> Next try at fixing this problem. I didn't find any other place where
>>> IMMGWL_IMC is used and the window classes are not my area of expertise.
>>>
>>>
>>>
>>>  dlls/imm32/imm.c       |    2 +-
>>>  dlls/winex11.drv/ime.c |    2 +-
>>>  include/ddk/imm.h      |    2 +-
>>>  3 files changed, 3 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/dlls/imm32/imm.c b/dlls/imm32/imm.c
>>> index 14178c3..bb50e5e 100644
>>> --- a/dlls/imm32/imm.c
>>> +++ b/dlls/imm32/imm.c
>>> @@ -2291,7 +2291,7 @@ BOOL WINAPI ImmSetOpenStatus(HIMC hIMC, BOOL fOpen)
>>>          data->imeWnd = CreateWindowExW( WS_EX_TOOLWINDOW,
>>>                      data->immKbd->imeClassName, NULL, WS_POPUP, 0, 0,
>>> 1, 1, 0,
>>>                      0, data->immKbd->hIME, 0);
>>> -        SetWindowLongW(data->imeWnd, IMMGWL_IMC, (LONG)data);
>>> +        SetWindowLongPtrW(data->imeWnd, IMMGWL_IMC, (LONG_PTR)data);
>>>          IMM_GetThreadData()->hwndDefault = data->imeWnd;
>>>      }
>>>  
>>> diff --git a/dlls/winex11.drv/ime.c b/dlls/winex11.drv/ime.c
>>> index 87d4faa..6d083d1 100644
>>> --- a/dlls/winex11.drv/ime.c
>>> +++ b/dlls/winex11.drv/ime.c
>>> @@ -1326,7 +1326,7 @@ static LRESULT WINAPI IME_WindowProc(HWND hwnd,
>>> UINT msg, WPARAM wParam,
>>>       * messages.
>>>       */
>>>  
>>> -    hIMC = (HIMC)GetWindowLongW(hwnd,IMMGWL_IMC);
>>> +    hIMC = (HIMC)GetWindowLongPtrW(hwnd,IMMGWL_IMC);
>>>      if (!hIMC)
>>>          hIMC = RealIMC(FROM_X11);
>>>  
>>> diff --git a/include/ddk/imm.h b/include/ddk/imm.h
>>> index 6e4d42f..bc9617e 100644
>>> --- a/include/ddk/imm.h
>>> +++ b/include/ddk/imm.h
>>> @@ -114,7 +114,7 @@ HIMCC  WINAPI ImmReSizeIMCC(HIMCC, DWORD);
>>>  DWORD  WINAPI ImmGetIMCCSize(HIMCC);
>>>  
>>>  #define IMMGWL_IMC                      0
>>> -#define IMMGWL_PRIVATE                  (sizeof(LONG))
>>> +#define IMMGWL_PRIVATE                  (sizeof(LONG_PTR))
>>>  
>>>  /* IME Property bits */
>>>  #define IME_PROP_END_UNLOAD             0x0001
>>>
>>>
>>> ------------------------------------------------------------------------
>>>
>>>
> 



More information about the wine-devel mailing list