その2

前回の引き続いてストリーミング再生でのお話。
通知イベント用のイベントオブジェクトを(ややこしい^^;)、


    static int m_nInstance = 0;
    ::wsprintf(name, "NGDK_DSOUND_EVENT0%d", m_nInstance++);
    m_hEvent = ::CreateEvent(NULL, FALSE, FALSE, name);


このように用意してたのですが、プロセスを複数起動するとこれはまずいです。*1
複数起動を禁止してるので気付かなかったんですが^^;

CreateEvent()で既にその名前オブジェクトがあると::GetLastError()==ERROR_ALREADY_EXISTS)となるのでこれを使えそうですが、

この関数はシグナル状態を変更してしまうので::OpenEvent()を使って調べます。


    for(;;) {
        ::wsprintf(name, "NGDK_DSOUND_EVENT0%d", m_nInstance++);
        if (m_hEvent = ::OpenEvent(EVENT_ALL_ACCESS, FALSE, name)) {
            // 既に存在してるので次の名前
            ::CloseHandle(m_hEvent);
            continue;
        }
        if (m_hEvent = ::CreateEvent(NULL, FALSE, FALSE, name)) {
            break;
        }
    }


違う名前で::CreateEvent()しててかつエラーもない。これでばっちり!
…のハズなのですが。どうも再生がぐちゃぐちゃに。
ハンドルの値を調べると複数のプロセスで一致してる。
名前は違うしエラーもでてないのに何故??


後日。
よくよく考えるとハンドルはプロセス内のみの値なので一致してもおかしくない。
結局原因は昨日の「うちのドライバ君は一つの通知オブジェクトしか扱えない」ことによるものでした(´ω`)
ちゃんちゃん。

*1:イベントを共有してると同時に再生したとき連続してシグナル状態になったりしてしまう