【问题标题】:Convert Windows API call to 64-bit in Excel VBA在 Excel VBA 中将 Windows API 调用转换为 64 位
【发布时间】:2015-10-07 22:52:43
【问题描述】:

我在 32 位 Excel 中使用这个 Windows API 调用,它工作正常:

Declare Function WNetGetConnection Lib "MPR.DLL" _
    Alias "WNetGetConnectionA" ( _
        ByVal lpszLocalName As String, _
        ByVal lpszRemoteName As String, _
        lSize As Long) As Long

有人告诉我,我们的一小部分企业用户很快就会使用 64 位 Excel。我无法访问 64 位 Excel,也找不到附近的同事。

根据这个文件,如果我没看错的话……

http://www.cadsharp.com/docs/Win32API_PtrSafe.txt

...这是该函数在 64 位 Excel 中的正确语法:

Declare PtrSafe Function WNetGetConnection Lib "MPR.DLL" _
    Alias "WNetGetConnectionA" ( _
        ByVal lpszLocalName As String, _
        ByVal lpszRemoteName As String, _
        lSize As Long) As Long

但这是正确的吗?唯一的区别是添加了 PtrSafe。它是否应该指向不同的 64 位版本的 MPR.DLL?另外,lSize 应该是 LongLong 而不是 Long?

【问题讨论】:

  • 请不要要求我们为您进行测试。自己安装 64 位 Excel。
  • “测试”不是在 Excel 中确定 API 声明的可靠方法。首先,Excel 在 API 调用后进行堆栈校正:隐藏声明错误:在这种情况下,它将隐藏返回值的位长度错误。其次,测试 API 需要一个已知有效的测试框架,而这几乎从来都不是这样。第三 - 一些 API 具有几乎从未使用过的可选术语,从而导致隐藏错误。

标签: vba api excel winapi


【解决方案1】:

但这是正确的吗?

是的。但不要相信我的话。获取 Office 副本并进行测试。

唯一的区别是添加了 PtrSafe。它是否应该指向不同的 64 位版本的 MPR.DLL?

没有。 Windows 为您的进程的位数选择适当的 DLL。对于标准 WinAPI 组件,您应该只使用 DLL 名称,而不是完整路径。 Windows 会选择正确的。

另外,lSize 应该是 LongLong 而不是 Long?

应该是ByRef LongWNetGetConnection 文档显示了函数原型:

DWORD WNetGetConnection(
  _In_    LPCTSTR lpLocalName,
  _Out_   LPTSTR  lpRemoteName,
  _Inout_ LPDWORD lpnLength
);

DWORD 是一个 32 位无符号整数。1LPDWORD 是一个指向 DWORD 的指针,在 VB(6/A) 中是 ByRef lpnLength As Long

作为奖励:

  • 在 Windows API 中,LONG 也是 32 位的。无论您运行的是 32 位还是 64 位,这都不会改变。 (sizeof(DWORD) == sizeof(LONG) == sizeof(INT))
  • VBA Data Types

1有趣的事实:VBA 没有无符号整数类型,因为 VB6 没有。 VB6 于 98 年问世。

截至 2015 年 10 月 7 日,Office 2016 从未使用过的全新单用户许可证的售价约为 150 美元。它也可以通过 MSDN 订阅计划获得。它也可以在许多优质零售商处购买。 (我故意不发布链接。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 2020-09-21
    • 2017-07-22
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多