【问题标题】:Declare OpenEventLog() in Lib advapi32.dll as Integer or Long?将 Lib advapi32.dll 中的 OpenEventLog() 声明为 Integer 还是 Long?
【发布时间】:2014-05-19 22:24:57
【问题描述】:

对于我的应用程序,只有 Long 在 W2K8R2 和 W2K12 上都有效。

我有一个现有的应用程序,它通过使用三个调用来保存 NT 事件日志:

Declare
FunctionOpenEventLog Lib"advapi32.dll"Alias"OpenEventLogA"(ByValServerName AsString, ByValSourceName AsString) AsInteger

Declare
FunctionBackupEventLog Lib"advapi32.dll"Alias"BackupEventLogA"(ByValEventLogHandle AsInteger, ByValBackupFileName AsString) AsBoolean

Declare
FunctionCloseEventLog Lib"advapi32.dll"(ByValEventLogHandle AsInteger) AsBoolean

在 VS 2012 中构建应用程序后,代码在 Windows Server 2008R2 和 Windows Server 2012 上运行良好,当它在一个小型测试应用程序中时。

我继承了一个也有上述声明的大型应用程序。在大型应用程序中应用了许多设置 - 我只是在 VB 上加快速度。该应用程序在 Windows Server 2008 R2 上运行良好,但在 Windows Server 2012 上,由 OpenEventLog() 返回的句柄是错误的 - 在传递给 BackupEventLog() 时导致错误的句柄错误。句柄是一个很大的负数,所以我尝试在上述声明中声明句柄参数和返回值“As Long”而不是“As Integer”。大型 VB 应用程序现在可以在 W2K8 和 W2K12 上运行。

这有点令人担忧,因为这不是预期的行为(从我的角度来看),这意味着我们需要在所有受支持的 Windows 版本上全面测试所有功能。

哪个声明是正确的 - “As Integer”或 As Long”?

有没有更好的编码方式?

是否有“作为句柄”的方式来编码?

由于小型独立测试应用程序使用“As Integer”并且它在 W2k8R2 和 W2K12 上运行,是否存在导致问题的项目设置?

【问题讨论】:

标签: .net vb.net winapi visual-studio-2012 dll


【解决方案1】:

value in question is a HANDLE。如documented in MSDN,这是一个指针,因此在 x86 应用程序中为 32 位长(整数),在 x64 应用程序中为 64 位长(长整数)。

默认情况下,.NET 应用程序在 64 位操作系统上作为 x64 运行,在 32 位操作系统上作为 x86 运行。所以句柄的大小取决于你运行的操作系统。

使用IntPtr,而不是使用Integer 或Long,它们在所有情况下都不正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 2019-03-10
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多