2011-11-22 11 views
2

私はC#プロジェクトをDelphiに変換しようとしていますが、C#コード自体がネイティブDLLから関数をインポートしていますが、そのネイティブ関数のシグネチャを持っていない 'dmp.dll'という名前を付けることにしました。これらの関数はC#でインポートされ、Delphiコードでそれらをインポートしようとしましたが、それらの多くをインポートして正常に動作しましたが、今はこの機能(StartLogging)で苦労しています。何の問題についてPLOG_RECORD_CALLBACKC#コードをDelphiに変換すると、SafeWaitHandleに相当するものは何ですか?

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

が、問題は、クラスがMicrosoft.Win32.SafeHandles名前空間に存在している、このパラメータSafeWaitHandleである:これは、彼らがC#でインポートする方法はありません。どうすれば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が期待するものと互換性があります)を渡すだけです。

私は手動でないリセットイベントのサンプルを持っていませんが、TEventの作成例は受け入れられた回答hereにあります。それを非手動リセット(IOW、AutoReset)にするには、2番目のパラメータをFalseに変更します。

+0

+1しかし、DelphiでAutoResetEventを再現する方法を特定し、そのSafeWaitHandleがwin32イベントのハンドルであることがわかっていると良いでしょう。それが私がコメントした理由です。 –

+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を。

関連する問題