2011-11-22 1 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에서 이에 상응하는 데이터 유형은 무엇입니까?

AutoResetEvent StopEvent = new AutoResetEvent(false); 

클래스 AutoResetEvent는 그런 다음 그들은이 같은 메서드를 호출 System.Threading에 존재 : 마지막에 그런

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

여기

그리고 그들이 C# 코드에서 사용하는 방법입니다 로깅을 중지하려면 다음을 사용하십시오.

StopEvent.Set(); 

정말 혼란스럽고 이것을하는 법을 모르겠습니다. 당신의 도움에 감사드립니다. 감사합니다.

+0

이 경우 이벤트 핸들처럼 들립니다. CreateEvent API에 의해 반환됩니다. Delphi RTL에서 TEvent 래퍼를 제공하는지 다시는 알 수 없습니다. –

답변

2

SyncObjsTEvent을 사용할 수 있습니다. 인수가 FalseManualReset 인수를 사용하여 만들면 거의 동일한 방식으로 작동합니다. Event.Handle (THandle이며 API를 기대하는 API와 호환 가능)을 전달하십시오.

수동 리셋이 아닌 이벤트를 사용하는 샘플이 없지만 TEvent을 만드는 예는 수락 된 응답 here에서 찾을 수 있습니다. 수동으로 재설정하지 않으려면 (IOW, AutoReset) 두 번째 매개 변수를 False으로 변경하십시오.

+0

+1하지만 Delphi에서 AutoResetEvent를 재현하는 방법을 확인하고 SafeWaitHandle이 win 32 이벤트의 핸들 인 경우 유용합니다. 그래서 나는 단지 논평했다. –

+0

'TLightweightEvent'는 대기 핸들이없는 수동 재설정 이벤트입니다. 여기서는 사용할 수 없습니다. 'TSimpleEvent'는'TEvent'와 동일합니다 :'TSimpleEvent = class (TEvent);'대답은'ManualReset'을'False'로 설정하여 만든'TEvent'입니다. 당신이 이미했기 때문에 나는 대답을 게시하지 않을 것이지만 내 견해에서 그것을 향상시켜야합니다. –

+0

@David : 더 좋습니까? 이벤트 사용에 대한 예를 들어 더 자세히 설명하고 싶습니다만 지금은 시간이 없습니다. 더 나은 답변을 게시하려면 이후에 삭제하겠습니다. –

0

Like David Hefferman이 승인 된 답변에 대한 응답으로 TSimpleEvent (System.SyncObjs)는 C#의 AutoResetEvent와 동일한 방식으로 작동합니다. 당신은 수동 리셋을 사용하는 경우

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

, 그냥 간단하게 사용합니다 :

는 그것은처럼 사용할 수 있습니다 _WaitEvent.ResetEvent을;

관련 문제