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

时间:2011-11-22 23:45:19

标签: c# delphi interop

我正在尝试将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命名空间中的类AutoResetEvent StopEvent = new AutoResetEvent(false); 。我怎样才能将它移植到Delphi? Delphi中它的等效数据类型是什么?

以下是他们在C#代码中使用它的方式:

AutoResetEvent

System.Threading中存在班级StartLogging(comboBox1.Text, CallbackProcedure, StopEvent.SafeWaitHandle); 然后他们调用这样的方法:

StopEvent.Set();

然后在最后并停止他们使用的记录:

{{1}}

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

2 个答案:

答案 0 :(得分:2)

您可以使用SyncObjs TEvent。如果在ManualReset参数设置为False的情况下创建它,它应该以相同的方式工作。只需传递Event.Handle(这是一个THandle,并且与期望的API中的任何内容兼容)。

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

答案 1 :(得分:0)

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

可以像:

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

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