我正在尝试将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}}
我真的很困惑,我不知道该怎么做,感谢你的帮助。 感谢
答案 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;