如何为Win32 API声明变量?

彼得·康斯特勃

我想要一个有关如何使用任意Win32 API编写VBA声明语句通用指南对于某些Win32 API(可能不包括我现在正在寻找的API或六个月后将要寻找的API),它不是声明语句的列表。

通用指南将教我如何处理不同的C / Win32数据类型。适用于32位或64位Office。

关于使VBA适应64位Office的主题告诉我,我可以使用LongPtr,并且32位或64位Office可以适当地对其进行适应。这仅在我知道32位何时需要Long时才有用。

这个VB.Net主题说不支持“任意”,但这是VB.Net,而不是VBA。我认为“任意”适用于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?

塞尔格

有关如何编写使用任意Win32 API的VBA声明语句的一般指南。

这就是我的方法。

我转到https://docs.microsoft.com/zh-cn/windows/win32/winprog/windows-data-types,找到我需要的数据类型(Ctrl+ F)。
如果是在同一页面上用另一种类型的术语定义的,那么我也要查找(Ctrl+ F),直到找到基本类型。
然后,我使用VB中适当大小的类型。intLongshortIntegerchar*Stringwchar_t*LongPtr,你需要传递StrPtrvoid*LongPtr

我认为“任意”仍然适用于VBA。但是什么时候使用呢?对于采用VOID的API?还是pVOID?或LPVOID?

As Any 当有帮助时

  • 您不想声明接收到的实际类型(例如,它是一个复杂的结构,该参数是可选的,并且您没有使用它)
  • 可能有多种不同的东西可以传递到那里,而您想将它们全部传递到不同的地方

否则,As Any使用API​​标头中指定的实际类型进行重新声明始终是可能,安全且正确的通常,它是一个指针ByVal LongPtr

保持As Any呼叫者承担更多责任,但给了他们更大的灵活性。重新声明As Any为实际类型可以消除这种灵活性,但会降低灵活性。

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第一个示例中的ByRef的能力,并且VarPtr每次都需要显式使用它,但是您不必考虑太多如何调用该函数。但是仍然存在一些危险,因为您仍然可以像CopyMemory a, b使用Long参数一样调用它,并且将值作为指针传递时会崩溃,但是至少您会从函数定义中看到正在传递错误的内容,而As Any没有传递给您一个提示。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何禁用按钮-Win32 API

来自分类Dev

Windows:如何拦截Win32磁盘I / O API

来自分类Dev

如何清除Win32 API中的屏幕

来自分类Dev

将变量传递给WIN32 API LPCWSTR?

来自分类Dev

GetGuiResources WIn32 API使用

来自分类Dev

Win32 API SearchPath失败

来自分类Dev

GetGuiResources WIn32 API使用

来自分类Dev

Java到Win32加密API

来自分类Dev

Win32 API 无法 CreateWindowW()

来自分类Dev

Win32 API:如何读取序列,如果不是数据,如何在超时内退出

来自分类Dev

WIN32 API中WM_MOUSEHOVER上的POPUP窗口-如何关闭它?

来自分类Dev

如何使用Win32 API获取任何线程的堆栈大小和堆栈限制

来自分类Dev

Win32 API:如何在Edit控件中捕获转义键?

来自分类Dev

如何仅通过Win32 API实现.NET Process.Exited事件

来自分类Dev

如何从MFC应用程序调用函数的Win32 API版本?

来自分类Dev

如何确定两个Win32 API句柄代表同一对象?

来自分类Dev

Win32 API:如何在编辑控件中更改部分文本的颜色

来自分类Dev

Golang:如何在没有cgo的情况下调用win32 API?

来自分类Dev

如何使用WIN32 API for C ++更改文本的颜色和大小?

来自分类Dev

如何在Win32中正确调用HeapSummary API?

来自分类Dev

C ++如何使用Win32 API通过线程从文本框中获取文本

来自分类Dev

Win32 API:如何在Edit控件中捕获转义键?

来自分类Dev

如何使用Win32 API获取任何线程的堆栈大小和堆栈限制

来自分类Dev

Win32 API:如何读取序列,如果不是数据,则在超时后退出

来自分类Dev

如何从MFC应用程序调用函数的Win32 API版本?

来自分类Dev

Win32 API:如何在编辑控件中更改部分文本的颜色

来自分类Dev

WIN32 API中WM_MOUSEHOVER上的POPUP窗口-如何关闭它?

来自分类Dev

如何使用Win32 API从INI文件中删除部分?

来自分类Dev

如何使用 Win32 API 阻止来自透明窗口的鼠标输入?

Related 相关文章

  1. 1

    如何禁用按钮-Win32 API

  2. 2

    Windows:如何拦截Win32磁盘I / O API

  3. 3

    如何清除Win32 API中的屏幕

  4. 4

    将变量传递给WIN32 API LPCWSTR?

  5. 5

    GetGuiResources WIn32 API使用

  6. 6

    Win32 API SearchPath失败

  7. 7

    GetGuiResources WIn32 API使用

  8. 8

    Java到Win32加密API

  9. 9

    Win32 API 无法 CreateWindowW()

  10. 10

    Win32 API:如何读取序列,如果不是数据,如何在超时内退出

  11. 11

    WIN32 API中WM_MOUSEHOVER上的POPUP窗口-如何关闭它?

  12. 12

    如何使用Win32 API获取任何线程的堆栈大小和堆栈限制

  13. 13

    Win32 API:如何在Edit控件中捕获转义键?

  14. 14

    如何仅通过Win32 API实现.NET Process.Exited事件

  15. 15

    如何从MFC应用程序调用函数的Win32 API版本?

  16. 16

    如何确定两个Win32 API句柄代表同一对象?

  17. 17

    Win32 API:如何在编辑控件中更改部分文本的颜色

  18. 18

    Golang:如何在没有cgo的情况下调用win32 API?

  19. 19

    如何使用WIN32 API for C ++更改文本的颜色和大小?

  20. 20

    如何在Win32中正确调用HeapSummary API?

  21. 21

    C ++如何使用Win32 API通过线程从文本框中获取文本

  22. 22

    Win32 API:如何在Edit控件中捕获转义键?

  23. 23

    如何使用Win32 API获取任何线程的堆栈大小和堆栈限制

  24. 24

    Win32 API:如何读取序列,如果不是数据,则在超时后退出

  25. 25

    如何从MFC应用程序调用函数的Win32 API版本?

  26. 26

    Win32 API:如何在编辑控件中更改部分文本的颜色

  27. 27

    WIN32 API中WM_MOUSEHOVER上的POPUP窗口-如何关闭它?

  28. 28

    如何使用Win32 API从INI文件中删除部分?

  29. 29

    如何使用 Win32 API 阻止来自透明窗口的鼠标输入?

热门标签

归档