将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();
我真的很困惑,我不知道该怎么做,谢谢你的帮助。感谢
您可能可以使用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;