GetWindowsDirectory()API返回错误(vba \ vb6)

时间:2015-06-16 07:56:55

标签: vba winapi vb6

在我的 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那样终端服务意识。

1 个答案:

答案 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目录。


其他资源: