2015-05-22 2 views
2

Мне нужно получить дескриптор окна Excel 2013 x64 из 64-битного кода VBA, работающего в электронной таблице. Есть несколько вариантов, чтобы сделать это:Является ли приложение Excel Application.Hwnd пригодным для использования с 64-битным VBA?

 
    Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (_ 
      ByVal lpClassName As String, _ 
      ByVal lpWindowName As String) As LongPtr 

Проблема в том, что Application.Hwnd возвращает Long, то есть 32 бита (я проверил это с MsgBox TypeName(Application.Hwnd) в 64 битной среде), в то время как FindWindow возвращает LongPtr, который занимает 64 бит в Office x64.

Означает ли это, что объекту Application.Hwnd нельзя доверять, чтобы быть всегда корректным в 64-битной среде?

+1

Все в порядке, оконные ручки по-прежнему работают как 32-битное значение в 64-битном коде. Верхние 32 бита всегда равны 0. –

+1

true @ HansPassant. Msdn Ref: Последняя ссылка в моем сообщении. –

ответ

2

Означает ли это, что объекту Application.Hwnd нельзя доверять, чтобы быть всегда корректным в 64-битной среде?

Нет, это не так. LongPtr это просто переменный типа данных, который представляет собой тип данных 4-байт на 32-битную версию и тип данных 8 байт на 64-разрядные версии Office 2010.

Вы можете прочитать больше о LongPtrHere

В случае, если вышеуказанное соединение умирает ...

LongPtr (Длинного целое на 32-битных системах, LONGLONG целого числа на 64-битных системах) переменные хранятся в виде 32-разрядных (4-байтовое) номера в диапазоне от -2,147,483,648 to 2,147,483,647 на 32-битных системах; и подписанные 64-битные (8-байтовые) номерами в диапазоне от -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 на 64-битных системах.

Примечание

LongPtr не является истинным типом данных, потому что он преобразует к длинной в 32-разрядных средах или LongLong в 64-разрядных средах. Использование LongPtr позволяет записывать портативный код, который может работать как в 32-разрядной, так и в 64-разрядной средах. Используйте LongPtr для указателей и ручек.

Рекомендуется для дальнейшего чтения:

Compatibility Between the 32-bit and 64-bit Versions of Office 2010

Followup от комментариев

Однако, я волнуюсь, что с FindWindow может возвращать большее значение, окно ручка может превышать 32 бит на определенном этапе. И если это так, то Application.Hwnd не сможет вернуть правильное значение. Или вы говорите, что дескриптор окна никогда не будет превышать 32 бит?

Следующая ссылка объясняет это красиво. Interprocess Communication Between 32-bit and 64-bit Applications

+0

Большое спасибо за ваш ответ. Позвольте мне просто убедиться, что мы находимся на одной странице: 'FindWindow' возвращает 64 бит, предполагая, что дескрипторы окон могут превышать 32 бита значения. Однако 'Application.Hwnd' возвращает только 32 бита. Поэтому, если дескриптор окна может превышать максимальное значение с 32 битами, что происходит с 'Application.Hwnd'? –

+0

Я не уверен, что я тебя понимаю. Если приложение 'hwnd' говорит' 11872538', то 'Findwindow' вернет то же значение. Вы также можете использовать Spy ++ для проверки этого. 'Findwindow' в 64 бит использует' LongPtr' для совместимости, поскольку какое-то приложение может иметь более крупные 'hwnds' –

+0

Спасибо за ваш ответ. Я понимаю, что если дескриптор имеет значение от -2,147,483,648 до 2,147,483,647, то оба способа возвращают одинаковое значение. Тем не менее, я беспокоюсь, что, поскольку FindWindow _can_ возвращает большее значение, дескриптор окна _may_ превышает некоторую стадию на 32 бита. И если это так, то «Application.Hwnd» не сможет вернуть правильное значение. Или вы говорите, что дескриптор окна никогда не будет превышать 32 бит? –