Конвертировать код C # в Delphi, что эквивалентно SafeWaitHandle? - PullRequest
2 голосов
/ 23 ноября 2011

Я пытаюсь преобразовать проект 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 # Code:

AutoResetEvent StopEvent = new AutoResetEvent(false);

Класс AutoResetEvent существует в System.Threading Затем они вызывают метод следующим образом:

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

Затем, наконец, и для остановки регистрации они используют:

StopEvent.Set();

Я действительно запутался и не знаю, как это сделать, благодарю вас за помощь. Спасибо

Ответы [ 2 ]

2 голосов
/ 23 ноября 2011

Возможно, вы можете использовать SyncObjs TEvent .Если вы создаете его с аргументом ManualReset, установленным на False, он должен работать примерно так же.Просто передайте Event.Handle (который является THandle и совместим со всем, что ожидается в API).

У меня нет примера использования события ручного сброса, но пример создания TEvent можно найти в принятом ответе здесь ;чтобы сделать его без ручного сброса (IOW, AutoReset), просто измените второй параметр на False.

0 голосов
/ 16 января 2018

Как сказал Дэвид Хефферман в ответе на утвержденный ответ: TSimpleEvent (System.SyncObjs) работает так же, как AutoResetEvent в C #.

Он может использоваться следующим образом:

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

Если вы используете ручной сброс, просто используйте: _WaitEvent.ResetEvent;

...