在我的 Windows-Terminal 用户上,我正在尝试将两个应用程序指向同一个Windows目录,一个用VBA写在VB6中。
从VB6调用GetWindowsDirectory() API时,它返回正确的路径
C:\ documents and settings \%user%\ Windows
从VBA宏调用它时,它返回
C:\视窗
请注意, GetSystemWindowsDirectory()
的结果相同 Thiking可能是VBA代码不知道它是一个终端站,我调用了返回1的GetSystemMetrics(SM_REMOTESESSION)
API,这意味着它知道它是一个终端。
VB6和VBA中使用了完全相同的代码
Windows 2003R2,Office版本是2010 64bit(因为我打字这个,让我想知道它是否相关,知道vb6是32位...)
有什么想法吗?
编辑:如下面的IInspectable所解释的,vba和vb6之间的区别是因为vb6不像Office那样终端服务意识。
答案 0 :(得分: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
...
换句话说:Microsoft Office支持终端服务,从Microsoft Office中托管的VBA脚本调用GetWindowsDirectory
将返回系统的共享Windows目录。
如果您使用DUMPBIN检查了VB6应用程序,您将看到它不支持终端服务,并且调用GetWindowsDirectory
将返回该用户的专用Windows目录。