将C#代码转换为Delphi,这相当于SafeWaitHandle

本文关键字:相当于 SafeWaitHandle Delphi 代码 转换 | 更新日期: 2023-09-27 18:15:23

我正在尝试将C#项目转换为Delphi,C#代码本身正在从本机dll导入函数,让我们将其命名为"dmp.dll",我没有其本机函数的签名,我必须看看这些函数是如何在C#中导入的,并尝试在Delphi代码中导入它们,我确实导入了很多函数,它们运行良好,但现在我正在为这个函数(StartLogging(而挣扎。这就是他们在C#中导入的方式:

[DllImport("dmp.dll", CharSet = CharSet.Auto, EntryPoint = "StartLogging")]
public static extern int StartLogging(String AdapterName, 
  PLOG_RECORD_CALLBACK LogRecordCallback, 
  SafeWaitHandle StopLoggingEvent);

PLOG_RECORD_CALLBACK没有问题,但问题在于这个参数SafeWaitHandle,它是Microsoft.Win32.SafeHandles命名空间中存在的类。如何将其移植到Delphi?在Delphi中,它的等效数据类型是什么?

以下是他们如何在C#代码中使用它:

AutoResetEvent StopEvent = new AutoResetEvent(false);

AutoResetEvent存在于System.Threading中然后他们这样调用方法:

StartLogging(comboBox1.Text, CallbackProcedure, StopEvent.SafeWaitHandle);

然后在最后和停止日志记录他们使用:

StopEvent.Set();

我真的很困惑,我不知道该怎么做,谢谢你的帮助。感谢

将C#代码转换为Delphi,这相当于SafeWaitHandle

您可能可以使用SyncObjs TEvent。如果创建它时ManualReset参数设置为False,那么它的工作方式应该大致相同。只需传递Event.Handle(这是一个THandle,与API中预期的任何东西都兼容(。

我没有使用非手动重置事件的示例,但可以在此处的已接受答案中找到创建TEvent的示例;要使其成为非手动重置(IOW,AutoReset(,只需将第二个参数更改为False

正如David Hefferman在回应批准的答案时所说:TSimpleEvent(System.SyncObjs(的工作方式与C#的AutoResetEvent相同。

它可以像这样使用:

_WaitEvent := TSimpleEvent.Create(nil, resetmanual {boolean}, false, '', false);
_WaitEvent.SetEvent;
_WaitEvent.WaitFor;

如果您使用手动重置,只需使用:_WaitEvent.ResetEvent;