将Lib advapi32.dll中的OpenEventLog()声明为Integer或Long?

时间:2014-05-19 22:24:58

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

对于我的应用,只有W2K8R2和W2K12才能使用Long。

我有一个现有的应用程序,通过使用三个调用来保存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”中声明Handle参数和返回值。大型VB应用程序现在可以在W2K8和W2K12上运行。

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

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

有更好的方法对此进行编码吗?

是否有“As Handle”方式对此进行编码?

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

1 个答案:

答案 0 :(得分:1)

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

默认情况下,.NET应用程序在64位操作系统上以x64身份运行,在32位操作系统上以x86身份运行。因此,手柄的大小取决于您正在运行的操作系统。

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