2013-05-31 2 views
2

В VBA, тип данных Long и Object - это 4 байта, который является размером адреса памяти. Означает ли это, что, технически, тип данных объекта не делает ничего, что Long не мог бы сделать? Если да, то можно ли сказать, что тип данных объекта существует просто, чтобы облегчить программисту различать назначение переменной?Разница между длинным и объектным типом данных в VBA

Этот вопрос возник, поскольку я рассматривал заявления функции API Win32. Они часто объявляются как Длинные, и, если я не ошибаюсь, их возвращаемое значение является просто адресом памяти. Похоже, что определять эти функции, поскольку объект был бы более уместным.

Неужели я полностью отключен? Заранее спасибо.

+0

«Объект» скрывает большую сложность, его базовый указатель на 4 байта * должен указывать на COM-объекты vTable/IDispatch - вы не можете назначить ему адрес чего-либо еще и ожидать, что он будет работать. –

+0

Я не знал, что это может указывать только на объекты COM. Итак, что это говорит о функциях API Win32? Если они возвращают COM-указатели, то почему они не объявлены как Object, а не Long? – cadsharp

+0

Большая часть Win32, которая использует COM, реализована с использованием COM-интерфейсов напрямую, а не как экспортируемых функций, я полагаю теоретически, что если вы нашли тот, который действительно возвращал такие (например, последний аргумент COM-кода CoCreateInstance), вы могли бы передать аргумент 'as Object' –

ответ

2

Основываясь на VBA/MSDN помощью:

Длинных (длинное целое) переменных которые хранятся в виде подписанного 32-бита (4 байта) числа в диапазоне по величине от -2147483648 до 2147483647.

и другое определение:

переменного объект сохраняются в виде 32-битного (4 байта) адрес, которые относятся к объектам . Используя инструкцию Set, переменная, объявленная как объект, может иметь любую ссылку на объект, назначенную ей.

С практической точки зрения они оба разные и используются в различной ситуации. Что необходимо: Длинные >> относится к цифрам и Объект >> относится к объекту.

Посмотрите в котором я добавил комментарии, которые разрешено и которые в следующем коде VBA (для Excel) не является:

Sub test_variables() 

    Dim A As Object 
    Dim B As Long 

    'both below are not allowed, throwing exceptions 
    'A = 1000 
    'Set B = ActiveSheet 

    'both are appropriate 
    Set A = ActiveSheet 
    B = 1000 
End Sub 

Наконец, с точки зрения API, лучше остаться с оригинальной декларации, а не манипулировать что во избежание риска непредвиденного поведения функций API.

+0

Спасибо, что ответили. Я знаю, как эти типы данных используются и что они не могут быть взаимозаменяемы. Я просто смущен, почему функции API Win32 возвращают указатель, который определяется как длинный, а не объект. С одной стороны, Longs может удерживать половину всех возможных адресных значений. Во-вторых, для согласованности я бы подумал, что Object должен использоваться исключительно для указателей, а Long - исключительно для целых чисел со знаком. – cadsharp

Смежные вопросы