如何使 WinHttpCrackUrl 在 64 位下工作

2023-12-01

我有 Visual Basic for Applications 代码,使用WinHttp并可与在 32 位 Windows XP 上运行的 32 位 Office 2010 完美配合。即使可以正常编译,相同的代码也无法在 64 位 Windows 8 上的 64 位 Office 2013 上正常运行。

问题是WinHttpCrackUrl()在 Windows 8 上返回错误 87“参数不正确”。

我已经双重检查和三重检查,确保所有指针都在代码中适当的地方声明为 LongPtr。我究竟做错了什么?

以下代码在 32 位 Excel/Windows 上运行良好,但在 64 位 Excel/Windows 上运行失败:

Private Type URL_COMPONENTS
    dwStructSize      As Long
    lpszScheme        As LongPtr
    dwSchemeLength    As Long
    nScheme           As Long
    lpszHostName      As LongPtr
    dwHostNameLength  As Long
    nPort             As Long
    lpszUserName      As LongPtr
    dwUserNameLength  As Long
    lpszPassword      As LongPtr
    dwPasswordLength  As Long
    lpszUrlPath       As LongPtr
    dwUrlPathLength   As Long
    lpszExtraInfo     As LongPtr
    dwExtraInfoLength As Long
End Type

Private Declare PtrSafe Function WinHttpCrackUrl Lib "WinHTTP" ( _
    ByVal pwszUrl As LongPtr, _
    ByVal dwUrlLength As Long, _
    ByVal dwFlags As Long, _
    ByRef lpUrlComponents As URL_COMPONENTS) As Long

Sub Test()
    Dim result as Long
    Dim URLComp As URL_COMPONENTS
    Dim mURL as String
    mURL = "http://www.stackoverflow.com" & vbNullChar

    With URLComp
        .dwStructSize = Len(URLComp)
        .dwHostNameLength = -1
        .dwSchemeLength = -1
        .dwUrlPathLength = -1
    End With

    result = WinHttpCrackUrl(StrPtr(mURL), 0, 0, URLComp)

    ' Prints 1 on 32-bit Excel/Windows (indicating success)
    ' Prints 0 on 64-bit Excel/Windows (indicating failure)
    Debug.Print result

    ' Prints 87 on 64-bit Excel/Windows ("The parameter is incorrect.")
    Debug.Print err.LastDllError
End Sub

The struct在 C++ 代码中是对齐的,但 VBA 结构是打包的。在 32 位中,对于您的结构体来说,这并不重要,因为所有成员都有对齐 4。但在 64 位中,指针需要 8 字节对齐,并且结构体有一些额外的填充。像这样放入:

Private Type URL_COMPONENTS
    dwStructSize      As Long
    padding1          As Long
    lpszScheme        As LongPtr
    dwSchemeLength    As Long
    nScheme           As Long
    lpszHostName      As LongPtr
    dwHostNameLength  As Long
    nPort             As Long
    lpszUserName      As LongPtr
    dwUserNameLength  As Long
    padding2          As Long
    lpszPassword      As LongPtr
    dwPasswordLength  As Long
    padding3          As Long
    lpszUrlPath       As LongPtr
    dwUrlPathLength   As Long
    padding4          As Long
    lpszExtraInfo     As LongPtr
    dwExtraInfoLength As Long
    padding5          As Long
End Type

我想您会需要一些条件编译来切换更好的 32 位和 64 位版本,但我必须承认我不知道如何使用 VBA 做到这一点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使 WinHttpCrackUrl 在 64 位下工作 的相关文章

随机推荐

  • 如何使用 proguard 获取发布构建 apk 文件

    我正在尝试使用ProGuard为了为我的项目制作发布 apk 文件 显然我正在使用许多第三方库 我只需要使用其中的几个类 我真的很想得到一些关于此的解释 我的调试版本超过20 MB 所以我想通过使用来减少它shrinking用于progua
  • NDB 查询 fetch() 和 ContextOptions

    我想仅在我的一个查询中禁用上下文缓存 我想我可以这样做 MyModel query ancestor user key fetch 100 options ContextOptions use cache False use memcach
  • HTML5 的 History.js - 需要进行黑客攻击才能不破坏 IE7

    我的目标是仅支持 HTML5 浏览器的 AJAX 历史记录 但是 我希望我的网站能够使用 HTML4 浏览器 但没有 AJAX 历史记录 许多 History js 示例在执行任何操作之前都包含以下检查 if History enabled
  • mailto链接多条正文线

    无法在 mailto 链接中使多行正常工作 就我而言 我正在使用 Outlook 默认邮件阅读器对其进行测试 以下内容放入锚点 href 中 mailto email protected subject test body type 20y
  • 如何防止 XmlSerialzer 转义“嵌套 XML”?

    我正在使用 XmlSerializer 来序列化 反序列化复杂对象 一个属性包含一个 XML 字符串 应将其写入字符串属性而不进行反序列化 示例 可在 LinqPad 中执行 XmlRoot RootObject Serializable
  • 从日期时间获取日期名称

    如何从 Python 中的日期时间对象获取日期名称 例如星期一 星期二 星期三 星期四 星期五 星期六和星期日 所以 举例来说 datetime 2019 9 6 11 33 0 应该给我 Friday import datetime no
  • 覆盖单个文件的编译标志

    我想使用一组全局标志来编译项目 这意味着我在顶级 CMakeLists txt 文件中指定了 ADD DEFINITIONS Wall Weffc pedantic std c 0x 但是 对于子目录中的特定文件 假设为 foo cpp 我
  • 用于重复数据删除的 Kafka 压缩

    我试图了解 Kafka 压缩的工作原理 并有以下问题 kafka 是否保证启用压缩的主题中存储的消息的键的唯一性 Thanks 简短的回答是否定的 Kafka 不保证启用主题保留时存储的密钥的唯一性 在 Kafka 中有两种类型cleanu
  • 如何在android中的fragment中添加选项卡?

    我尝试在片段内添加选项卡 我可以添加 但特定选项卡的内容与选项卡重叠 MainFragmentActivity java public class MainActivity extends FragmentActivity Override
  • 这是什么网页效果

    当你在堆栈溢出时达到 1000 声望时 你将获得一张消耗性用户卡 当您将鼠标悬停在卡片上时 我怎样才能重现这种效果 怎么称呼 我的猜测是它是一个 Jquery 方法 但如果是的话 有人可以指出我正确的方向 因为我寻找它但无法准确得到我需要的
  • 从 Android 中的 url 加载图像,仅当图像很小时

    我在用着BitmapFactory decodeStream从 Android 中的 url 加载图像 我只想下载低于特定尺寸的图像 我目前正在使用getContentLength检查这个 然而 我被告知getContentLength并不
  • java.lang.IllegalArgumentException:未知实体

    我有一个试驾 package com chinalbs service RunWith SpringJUnit4ClassRunner class ContextConfiguration locations classpath appli
  • 简单页面应用程序路由到相同视图或控制器 SailsJS

    如何将多个 url 路由到同一控制器或视图以使用 Angular 单页应用程序 我可以做到这一点 但我觉得很丑 view homepage login view homepage register view homepage troller
  • PHP - 使用简单 XML 复制 XML 节点

    我需要使用简单 XML 加载 XML 源 复制现有节点及其所有子节点 然后在渲染 XML 之前自定义此新节点的属性 有什么建议吗 SimpleXML 不能做到这一点 所以你必须使用DOM 好消息是 DOM 和 SimpleXML 是同一枚硬
  • 如何在mongodb中删除具有特定条件的重复项?

    例如 我的收藏中有以下文档 id GuqXmAkkARqhBDqhy beatmapset id 342537 version MX diff approach 5 artist Yousei Teikoku title Kokou no
  • 如何在 C# 中使用“for”循环创建动态递增变量

    如何在 C 中使用 for 循环创建动态递增变量 像这样 track 1 track 2 track 3 track 4 so on 您无法创建动态命名的变量 您所能做的就是创建一些集合或数组 并对其进行操作 我认为最适合你的课程是通用课程
  • Magento 2 重定向到支付网关错误

    我已经使用转换器转换了我的 Magento 1 支付模块 我想我需要修改代码以适应 Magento 2 我被困在结账过程中 重定向到支付网关 以下是当 magento 尝试重定向到时我的错误http localhost 8083 mm pd
  • Alfresco 社区版和 Alfresco 企业版有什么区别?

    Alfresco 社区版和 Alfresco 企业版有什么区别 它提供的两种功能有什么区别吗 我们可以下载具有更长试用许可证的企业版吗 企业版是商业支持的版本 除了支持之外 您还可以获得补丁 更新 赔偿以及与认证合作伙伴的联系 从功能的角度
  • 如何在Python中获取__main__模块的文件名?

    假设我有两个模块 a py import b print name file b py print name file 我运行 a py 文件 这打印 b C path to code b py main C path to code a
  • 如何使 WinHttpCrackUrl 在 64 位下工作

    我有 Visual Basic for Applications 代码 使用WinHttp并可与在 32 位 Windows XP 上运行的 32 位 Office 2010 完美配合 即使可以正常编译 相同的代码也无法在 64 位 Win