将C#代码转换为Delphi,SafeWaitHandle的等价物是什么?

问题描述 投票:2回答:2

我正在尝试将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 interop
2个回答
2
投票

你可以使用SyncObjs TEvent。如果你使用设置为ManualResetFalse参数创建它,它应该以相同的方式工作。只需通过Event.Handle(这是一个THandle,并与API期望的任何东西兼容)。

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


0
投票

就像David Hefferman在回答批准的答案时说的那样:TSimpleEvent(System.SyncObjs)的工作方式与C#的AutoResetEvent相同。

它可以像:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.