首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GetWindowsDirectory() API返回错误(vba\vb6)

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

Stack Overflow用户
提问于 2015-06-16 07:56:55
回答 1查看 1K关注 0票数 0

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-16 09:05:56

你所观察到的行为被记录在案。请参阅GetWindowsDirectory的备注部分

终端服务:如果应用程序在终端服务环境中运行,则每个用户都有一个专用的目录。系统还有一个共享的Windows目录。如果应用程序具有终端服务感知(在图像头中设置了IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE标志),该函数将返回系统GetSystemWindowsDirectory目录的路径,就像GetSystemWindowsDirectory函数所做的那样。否则,它将为用户检索私有Windows目录的路径。

可以使用带有IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE选项的杜普宾工具来验证是否为二进制设置了/HEADERS标志。

代码语言:javascript
运行
复制
dumpbin /HEADERS WINWORD.EXE

产生以下输出(Microsoft 2013 32位):

代码语言:javascript
运行
复制
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目录。

追加资源:

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30861846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档