2015-06-16 79 views
0

我的Windows終端用戶,我試圖讓兩個應用程序指向同一個Windows目錄,一個用VB6寫在VBA中。GetWindowsDirectory()API返回錯誤(vba vb6)

當調用GetWindowsDirectory() API從VB6它返回正確路徑

C:\ Documents和Settings \%用戶%\ Windows下

當從VBA調用它的宏,它返回

C:\ WINDOWS

注意相同結果也適用於GetSystemWindowsDirectory()

Thiking可以是VBA代碼不知道它的一個終端站,我稱爲其返回1 GetSystemMetrics(SM_REMOTESESSION) API,這意味着它是知道它是一個終端。

完全相同的代碼在VB6都使用和VBA

的Windows 2003R2,Office版本是2010版64位(這是我打字這一點,讓我不知道,如果是相關的,知道VB6是32位... )

任何想法?

編輯:由下面的可以預見的解釋,vba和vb6之間的區別是因爲vb6不像Office是終端服務意識。

+0

[_ 「該功能用於與傳統應用程序兼容性主要提供」 _](https://msdn.microsoft.com/en-us/library /windows/desktop/ms724454(v=vs.85).aspx)。你想做什麼?改用'FOLDERID_Windows'調用'SHGetKnownFolderPath'。 – CodeCaster

+0

嘗試 - 將編輯 – Stavm

+0

我的意思是「你期望什麼」?什麼是「相同的Windows目錄」?你的意思是Windows安裝目錄?見上面更新的評論。 – CodeCaster

回答

5

您正在觀察的行爲已記錄在案。見備註GetWindowsDirectory

終端服務:如果應用程序是在終端服務環境中運行,每個用戶都有一個私有的Windows目錄。系統還有一個共享的Windows目錄。如果應用程序是支持終端服務的(在圖像頭中設置了IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE標誌),該函數返回系統Windows目錄的路徑,就像GetSystemWindowsDirectory函數一樣。否則,它將爲用戶檢索專用Windows目錄的路徑。

DUMPBIN工具與/HEADERS選項可用於進行驗證,所述IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE標誌是否被設置爲一個二進制。

dumpbin /HEADERS WINWORD.EXE 

產生以下輸出(如Microsoft Office 2013 32位):

OPTIONAL HEADER VALUES 
      10B magiC# (PE32) 
       ... 
       2 subsystem (Windows GUI) 
      8140 DLL characteristics 
        Dynamic base 
        NX compatible 
        Terminal Server Aware 
       ... 

換句話說:微軟Office終端,服務意識,並從VBA腳本中調用GetWindowsDirectory微軟內部託管Office將返回系統的共享Windows目錄。

如果使用DUMPBIN檢查了您的VB6應用程序,您會發現它不支持終端服務,並且調用GetWindowsDirectory將爲用戶返回專用Windows目錄。


其他資源:

+0

完美解釋。謝謝。有沒有繞過或另一個建議如何在VBA的邊界內從辦公應用程序中檢索實際的win文件夾? – Stavm

+0

@ polisha989:我不知道強制GetWindowsDirectory返回遺留(即非終端服務意識)結果的方法。將[SHGetKnownFolderPath](https://msdn.microsoft.com/en-us/library/windows/desktop/bb762188.aspx)與[FOLDERID_Windows](https://msdn.microsoft.com/en -us/library/windows/desktop/dd378457.aspx)? – IInspectable

+0

得到C:\ Windows,這不是什麼後即時通訊。 – Stavm