0

CreateFile()を使用して名前付きパイプを開こうとしています:

g_hPipe = CreateFile(szPipeName, 
                    GENERIC_READ | GENERIC_WRITE, 
                    0, 
                    NULL, 
                    OPEN_EXISTING, 
                    FILE_FLAG_OVERLAPPED, 
                    NULL);

ここで、szPipeNameはのよう\\\\.\\pipe\\service_nameになり、INVALID_HANDLE_VALUEが返されます。

MSDNによると、OPEN_EXISTINGフラグは、ファイルが存在しない場合にのみエラーを返しますが、GetLastError()ERROR_ALREADY_EXISTS(183)を示します。ファイルが存在することはわかっているので、OPEN_EXISTINGを使用しています... MSDNは、これはOPEN_ALWAYSまたはCREATE_ALWAYSが設定されている場合にのみ発生することを示唆しています。結果が関数を参照していることを確認するために、SetLastError(0)直前に呼び出します。CreateFile()GetLastError()CreateFile()

私はかなり検索しましたが、このエラーが発生する理由を示唆するものは何も見つかりませんでした。どんな助けでも大歓迎です。

4

1 に答える 1

2

ドキュメントCreateFileは、単一のクライアントで一度だけできることを示しています。その後、返されたハンドルを複製する必要があります。

CreateFile が名前付きパイプのクライアント エンドを開く場合、関数はリッスン状態にある名前付きパイプの任意のインスタンスを使用します。開くプロセスでは、必要に応じて何度でもハンドルを複製できますが、開いた後は、別のクライアントが名前付きパイプ インスタンスを開くことはできません。

パイプはポイントツーポイントのトランスポートです。他のアプリをサーバーに接続する場合は、独自のパイプ インスタンスが必要になります。これは、サーバー上で別の CreateNamedPipe 呼び出しを行うことを意味します。

于 2013-02-14T20:45:43.897 に答える