1

CreateFileA を使用して COM ポートを開くルーチンがあります。関数はDLLとして作成され、別のCOMポートを開くための呼び出しを行うEXE(VS2010を使用)があります。同じ EXE を使用して別のポートを開くと、返されるファイル ハンドル番号が異なります。EXE の複数のインスタンスを開き、異なる COM ポートを開くと、返されるファイル ハンドル番号は同じです。例-> 1 つの exe が COM ポート 11,12,13,14 を開くために使用され、ファイル ハンドル番号 - 0x200、0x210、0x21c、0x220 を返します。 .

これは、exe の各インスタンスに個別のスレッドがあり、したがって同じファイル番号を持つような Windows スレッド化によるものかどうかを知りたいですか? exe を使用してポートとの通信に問題はありません。これを理解する手がかりは役に立ちます。(別のアプリケーションがこの DLL を使用しようとしており、同じファイル ハンドル番号が返されるという問題が発生しています)

ありがとうアディティア

4

1 に答える 1

3

HANDLE の値は、1 つのプロセス内でのみ有効です。より明確にするために、ハンドルはいくつかのカーネル オブジェクト テーブルへのインデックス (またはオフセット) として実装されます。このテーブルはカーネル メモリに格納され、特定のプロセスに割り当てられます。つまり、すべてのプロセスには独自の異なるオブジェクト テーブルがあります。

ハンドルは一部のテーブルへの単なるオフセットであり、それらのテーブルはプロセスごとに完全に異なるため、プロセスごとに HANDLE の値を渡す (または比較する) ことはできません。

あなたのケースに戻ると、アプリケーションが単純で決定論的である場合、アプリケーションを再実行したときに HANDLE の同じ値を取得する可能性が高くなります。これは、OS が決定論的にオブジェクト テーブルに入力する可能性が高いためです。ただし、それは保証されているわけではなく、信頼することはできません。

ハンドルは文字通り別のプロセスに渡すことができないため、Windows にはDuplicateHandle関数があり、あるプロセスが同じオブジェクトを他のプロセスに渡したい場合に使用できます。DuplicateHandle では、ソース ハンドルはソース プロセスでのみ使用でき、宛先ハンドルは宛先プロセスでのみ使用できることに注意してください。

于 2013-05-02T03:12:43.583 に答える