在我的Windows-Terminal用户上,我试图让两个应用程序指向同一个VB6目录,一个是用VBA编写的,一个是用VB6编写的。
从GetWindowsDirectory()调用VB6 API时,它返回正确的路径。
C:\文档和设置\%用户%\Windows
从VBA宏调用它时,它将返回
C:\窗口
注意,同样的结果适用于 GetSystemWindowsDirectory()
偷窃可能是VBA代码没有意识到它是一个终端站,我调用了返回1的GetSystemMetrics(SM_REMOTESESSION)
API,这意味着它知道它是一个终端。
在VB6和VBA中都使用了完全相同的代码
Windows2003R2,Office版本是2010 64位(当我输入这个时,我想知道它是否相关,知道vb6是32位.)
有什么想法吗?
编辑:,正如下面IInspectable所解释的,vba和vb6之间的区别在于vb6不像Office那样具有终端服务意识。
发布于 2015-06-16 09:05:56
你所观察到的行为被记录在案。请参阅GetWindowsDirectory的备注部分
终端服务:如果应用程序在终端服务环境中运行,则每个用户都有一个专用的目录。系统还有一个共享的Windows目录。如果应用程序具有终端服务感知(在图像头中设置了IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE标志),该函数将返回系统GetSystemWindowsDirectory目录的路径,就像GetSystemWindowsDirectory函数所做的那样。否则,它将为用户检索私有Windows目录的路径。
可以使用带有IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE选项的杜普宾工具来验证是否为二进制设置了/HEADERS标志。
dumpbin /HEADERS WINWORD.EXE
产生以下输出(Microsoft 2013 32位):
OPTIONAL HEADER VALUES
10B magic # (PE32)
...
2 subsystem (Windows GUI)
8140 DLL characteristics
Dynamic base
NX compatible
Terminal Server Aware
...
换句话说: Microsoft是终端服务感知的,从Microsoft中托管的VBA脚本调用GetWindowsDirectory
将返回系统的共享Windows目录。
如果您使用DUMPBIN检查您的VB6应用程序,您将发现它不支持终端服务,调用GetWindowsDirectory
将返回用户的专用Windows目录。
追加资源:
https://stackoverflow.com/questions/30861846
复制相似问题