2013-05-31 70 views
2

在VBA中,Long和Object數據類型都是4字節,這是內存地址的大小。這是否意味着,在技術上,Object數據類型不能執行Long無法做到的任何事情?如果是的話,那麼可以肯定地說,Object數據類型的存在只是爲了讓程序員更容易區分變量的目的嗎?VBA中Long和Object數據類型之間的區別

這個問題出現了,因爲我正在考慮Win32 API函數聲明。他們經常被宣佈爲Long,並且,除非我誤認爲,他們的返回值只是一個內存地址。似乎像定義這些函數一樣,那麼Object就更合適了。

我完全沒有?提前致謝。

+0

「對象」隱藏了大量的底層複雜性,其底層4字節指針必須指向COM對象vTable/IDispatch - 您無法爲其分配任何其他地址並期望它可以正常工作。 –

+0

我不知道它只能指向COM對象。那麼,這對Win32 API函數有何說法?如果它們返回COM指針,那麼爲什麼它們不被聲明爲Object而不是Long? – cadsharp

+0

大多數使用COM的Win32都是直接使用COM接口實現的,而不是作爲導出的函數實現的,理論上我假設如果你發現一個返回這樣的實例(例如COM的CoCreateInstance的最後一個參數),你可以將參數'as Object' –

回答

2

基於VBA/MSDN幫助:

龍(長整型)存儲爲帶符號的32位(4字節)的變量 數爲在值從-2147483648〜2,147,483,647。

,另一個定義:

對象變量被存儲爲參考 對象32位(4字節)的地址。使用Set語句,聲明爲Object的變量可以爲其分配任何對象引用。

從實際的角度來看,它們都是不同的,並在不同的情況下使用。哪些是必要的:長>>指號碼對象>>指對象

看到,我加入這是允許的,哪些意見如下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

感謝您的回覆。我知道這些數據類型是如何使用的,而且它們不能互換。我只是困惑爲什麼Win32 API函數返回一個定義爲Long而不是Object的指針。首先,長整數只能佔據所有可能地址值的一半。其次,爲了保持一致性,我認爲Object應該專門用於指針,Long專門用於有符號整數。 – cadsharp

相關問題