1. ホーム
  2. tensorflow

エラーコード2:指定されたファイルが見つかりません。

2022-02-17 03:48:09

一般的なクライアントPCでは、これは大きな問題ではありません。しかし、サーバーアプリケーション環境では、これは大変なことなのです。次のようなコードを想像してみてください。

// Process 1:

......

HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, _T("my_private_event_name")); // Assume it will work here

......

// Process 2:

HANDLE hEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, _T("my_private_event_name")); // Do you succeed????










次の2つのシナリオを想像してください。

1. 通常のユーザーコール。すなわち、ユーザーがプロセス1を開始し、その後プロセス2を開始する場合。

2. ユーザーが最初にプロセス1を起動し、プロセス2がスクリプト言語(例:asp、データベースプロシージャ......)によって呼び出された場合。

明らかに、最初のケースでは、基本的に問題はありません。問題は、2番目のアプリケーション環境です

この場合、残念ながら "The system cannot find the file specified" エラーに直面します! これはどうしたことでしょう。パーミッションでしょうか?そんな簡単なことなら、問題を記録するために別の記事を書く必要はないでしょう。私もこの件で午前中を無駄にしました。問題の根源は "名前空間" です! 見覚えありますよね?見覚えありますよね?しかし、これは本当に呆れるほどです しかし、これは本当に不可解です!カーネルオブジェクトである以上、OSのグローバルに存在するはずで、どんなアプリケーションがそれを見つけることができても、なぜ名前を追加したのにそれを見つけることができないのでしょうか?これは、カーネル名がOS内部の名前空間にも格納されていることを意味しているとしか思えません。エクスプローラやcmdで両プロセスを起動すると、同じ空間に名前が格納されます。しかし、スクリプト言語がこれらのプロセスを呼び出すと、これらの子プロセスは親プロセス(スクリプト言語)の特徴の一部-カーネルオブジェクトの名前空間を含む-を継承する可能性があります。そのため、上記の2つのプロセスを異なるアプリケーション環境で別々に起動すると、通常は問題にならないAPIの問題が発生します。名前空間が異なるため、名前によるカーネルオブジェクトの検索に失敗(ErrorCode: 2)してしまうのです!

<スパン この問題の最終的な解決策は、カーネル・オブジェクトの名前にグローバルな名前空間を追加することです すなわち、上の2つの段落は次のように変更された。

//Process 1:
......

HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, _T("global\\my_private_event_name")); // Assume it will succeed here

......





// Process 2:

HANDLE hEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, _T("Global\\\my_private_event_name")); // Do you succeed????





この後、今後このようなコードを書く場合は、"Global"名前空間を追加することをお勧めします。