C#から呼び出すことができるようにラップしているCdllがあります。1つの関数は、イベントを使用して状態が変化したときに通知しますが、それに対処するためにいくつかの調査が必要でした。うまく機能しているようですが、誰かが私よりもこれについての経験があり、アドバイスを提供できるかどうか知りたいです。
この関数は、dllの.hファイルで次のように定義されています。
int NotifyStateChange(OVERLAPPED *overlapped);
typedef int (*NOTIFY_STATE_CHANGE_PROC)(OVERLAPPED *);
それを呼び出すサンプルCコード:
OVERLAPPED overlapped;
overlapped.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
fns.NotifyStateChange(&overlapped);
WaitForSingleObject(overlapped.hEvent, INFINITE);
// ...query for the new state or whatever...
これは私がC#でそれにアプローチした方法です:
[DllImport("myfuncs.dll")]
unsafe public static extern int NotifyStateChange(NativeOverlapped* lpOverlapped);
static private ManualResetEvent m_stateChangeEvent = new ManualResetEvent(false);
public static DeviceState WaitForStateChange()
{
unsafe
{
Overlapped overlapped = new Overlapped(0, 0,
m_stateChangeEvent.SafeWaitHandle.DangerousGetHandle(), null);
IOCompletionCallback callback = StateChangeCallback;
byte[] userData = new byte[100];
NativeOverlapped* nativeOverlapped = overlapped.Pack(callback, userData);
NotifyStateChange(nativeOverlapped);
m_stateChangeEvent.WaitOne();
Overlapped.Unpack(nativeOverlapped);
Overlapped.Free(nativeOverlapped);
}
return GetCurrentState();
}
[ComVisibleAttribute(true)]
unsafe static public void StateChangeCallback (
uint errorCode,
uint bytesTransferred,
NativeOverlapped* overlapped)
{
m_stateChangeEvent.Set();
}
私がはっきりしないことの1つは、userDataの必要性です。NotifyStateChangeはイベントを発生させるだけで、データを返しません。nullのuserDataをPack()に渡すことは問題なく機能しているように見えましたが、私が気付いていない内部でuserDataで何かが起こっているのではないかと心配しています。
これを行うためのより適切な方法があるかどうかについてのアドバイスに感謝します。
エリック