gpt4 book ai didi

excel - 如何为 Win32 API 声明变量?

转载 作者:行者123 更新时间:2023-12-04 22:21:56 25 4
gpt4 key购买 nike

我想要一个 一般指南了解如何编写使用任意 Win32 API 的 VBA 声明语句。不是针对某些 Win32 API 选择的声明语句列表(可能不包括我现在正在寻找的 API,或者我将在六个月后寻找的 API)。
一般指南会告诉我应该如何处理不同的 C/Win32 数据类型。适用于 32 位或 64 位 Office。
这个话题在adapting VBA for 64-bit Office告诉我我可以使用 LongPtr 并且 Office 32 位或 64 位将酌情调整。只有当我知道 32 位何时需要 Long 时,这才有用。
This VB.Net topic说不支持“任意”,但那是 VB.Net,而不是 VBA。我认为“As Any”适用于 VBA,但我什么时候使用它?对于采用 VOID 或 pVOID 或 LPVOID 的 API?
作为一个具体的例子,我需要修改这个声明:

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal ByteLen As Long)
根据 MSDN ,最后一个参数是SIZE_T:
void CopyMemory(
_In_ PVOID Destination,
_In_ const VOID *Source,
_In_ SIZE_T Length
);
我已经看到了一些针对 64 位 Office 的修改,在声明中将其保留为 ByVal ... As Long但其他人将其更改为 LongPtr .什么是正确的?
我不想卡在一个坏掉的内核调用上。
是否有一个通用指南来确定应该如何处理任何 Win32 API?

最佳答案

a general guide for how to write VBA declare statements for using arbitrary Win32 APIs.



我就是这样做的。

我去 https://docs.microsoft.com/en-us/windows/win32/winprog/windows-data-types并找到我需要的数据类型 (Ctrl+F)。
如果它是用同一页面中的另一种类型定义的,我也会查找它(Ctrl+F),直到找到基本类型。
然后我使用来自 VB 的适当大小的类型。 intLong , shortInteger , char*String , wchar_t*LongPtr需要经过的地方 StrPtr , void*LongPtr .

I gather that 'As Any' is still appropriate for VBA. But when do I use it? For APIs that take VOID? Or pVOID? or LPVOID?


As Any有帮助的时候
  • 您不想声明它接收的实际类型(例如,它是一个复杂的结构,参数是可选的,并且您没有使用它)
  • 那里可以传递多种不同的东西,您希望在不同的点将它们全部传递

  • 否则,重新声明 As Any 始终是可能的、安全且正确的使用 API header 中指定的实际类型。通常它是一个指针,即 ByVal LongPtr .

    保管 As Any给调用者更多的责任,但给他们更多的灵 active 。重新声明 As Any作为一种实际类型,以牺牲所述灵 active 为代价消除了危险。
    CopyMemory是这个原则的一个很好的例子。 pDest As Any, pSrc As Any的声明是最灵活的,可以用作:

    Dim a As Long, b As Long

    CopyMemory a, b, ... ' Copying from variable b to a (a = b)
    CopyMemory ByVal VarPtr(a), ByVal VarPtr(b), ... ' Same

    Dim a As LongPtr, b As LongPtr

    CopyMemory ByVal a, ByVal b, ... ' Copying from memory pointed to by b to memory pointed to by a

    这是灵活的,但如果你滥用它:

    Dim a As Long, b As Long

    CopyMemory ByVal a, ByVal b, ... ' Wrong: passing values as pointers; likely memory access violation
    CopyMemory VarPtr(a), VarPtr(b), ... ' Wrong: passing pointers to pointers;
    ' Overwrites the temporary storage VB provides
    ' No crash, but no meaningful copying either

    Dim a As LongPtr, b As LongPtr

    CopyMemory a, b, ... ' Likely wrong: copying the pointer value of b into a (a = b)

    您可能会崩溃和/或损坏数据。

    声明了与 ByVal pDest As LongPtr, ByVal pSrc As LongPtr 相同的参数,你就失去了通过的能力 Long s ByRef 与第一个示例一样,需要显式使用 VarPtr每次,但您无需考虑如何调用该函数。但是仍然存在一些危险,因为您仍然可以将其称为 CopyMemory a, bLong参数,并且它会因为将值作为指针传递而崩溃,但至少你会从函数定义中看到你传递了什么错误,而 As Any没有给你提示。

    关于excel - 如何为 Win32 API 声明变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62098988/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com