【发布时间】: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 上运行,是否存在导致问题的项目设置?
【问题讨论】:
-
我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
-
它是一个句柄,在 C# 中是一个 IntPtr。您根本不应该对此进行调用,使用 System.Management 执行 Win32_NTEventlogFile.BackupEventlog 方法。让WMI Code Creator 实用程序为您生成代码。
标签: .net vb.net winapi visual-studio-2012 dll