2011-11-22 52 views
2

我想將C#項目轉換爲Delphi,C#代碼本身是從本機DLL導入函數讓我們將其命名爲'dmp.dll',我沒有它的本機功能的簽名,我必須看看如何這些函數在c#中導入並嘗試在Delphi代碼中導入它們,並且我導入了很多它們,它們工作正常,但現在我正在使用此函數(StartLogging)掙扎。這是他們在C#中如何導入:將C#代碼轉換爲Delphi,相當於SafeWaitHandle的功能是什麼?

[DllImport("dmp.dll", CharSet = CharSet.Auto, EntryPoint = "StartLogging")] 
public static extern int StartLogging(String AdapterName, 
    PLOG_RECORD_CALLBACK LogRecordCallback, 
    SafeWaitHandle StopLoggingEvent); 

此參數SafeWaitHandle沒有問題有關PLOG_RECORD_CALLBACK,但問題是它是類Microsoft.Win32.SafeHandles命名空間存在。我如何將它移植到Delphi? Delphi中的等效數據類型是什麼?

這裏是他們如何使用它在C#代碼:

AutoResetEvent StopEvent = new AutoResetEvent(false); 

AutoResetEvent存在System.Threading 然後他們調用的方法是這樣的:在最後

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

然後和停止他們使用的測井:

StopEvent.Set(); 

我真的很困惑,我不知道該怎麼做,感謝你的幫助。 謝謝

+0

在這種情況下,它聽起來像一個事件句柄。由CreateEvent API返回。不記得Delphi RTL是否提供了TEvent包裝。 –

回答

2

您可以使用SyncObjsTEvent。如果使用設置爲False的參數ManualReset創建它,它應該以相同的方式工作。只需通過Event.Handle(這是一個THandle,並與API中的任何內容兼容)。

我沒有使用非手動重置事件的示例,但可以在接受的答案here中找到創建TEvent的示例;使其成爲非手動復位(IOW,AutoReset),只需將第二個參數更改爲False即可。

+0

+1但是,如果您確定瞭如何在Delphi中重現AutoResetEvent並且SafeWaitHandle是一個獲勝32事件的句柄,那將會很好。這就是爲什麼我只評論。 –

+0

'TLightweightEvent'是一個沒有等待句柄的手動重置事件。不能在這裏使用。 'TSimpleEvent'和'TEvent'完全相同:'TSimpleEvent = class(TEvent);'答案是'ManualReset'設置爲'False'創建的'TEvent'。我不會發表一個答案,因爲你已經做了,但你需要在我看來改進它。 –

+0

@David:好點?我希望它能夠以事件使用爲例更完整,但現在沒有時間。如果你想發佈一個更好的答案,我會在之後刪除我的。 –

0

像David Hefferman在對已批准的答案的迴應中說的:TSimpleEvent(System.SyncObjs)的工作原理與C#的AutoResetEvent方法相同。

它可以用於像:

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

如果使用手動復位,只是簡單地使用: _WaitEvent.ResetEvent;