1

アプリケーションをWindows732ビットからWindows764ビットに移植しました。API関数OpenSemaphoreが常にゼロを返していることがわかりました。この呼び出しは32ビットWindowsではうまく機能しますが、64ビットWindowsでは機能しません。

を呼び出すとGetLastError()、2が返されます。

OpenSemaphoreまた、関数を関数に置き換えたところ、アプリケーションは正常に動作しますが、関数が64ビットコードで失敗するCreateSemaphore理由についてはまだ混乱しています。OpenSemaphore

この問題について何か知っている人は誰でも明確にしてください。

4

2 に答える 2

3

関数が失敗したときにエラーコードをチェックすることは良い最初のステップですが、そのエラーコードが何を意味するかを確実に理解する必要があります。GetLastError関数によって返される可能性のあるエラーコードは、ここに記載されています。

この場合、エラーコードは2であると言います。これはに対応しますERROR_FILE_NOT_FOUND

システムは、指定されたファイルを見つけることができません。

あなたはおそらく自分自身に問いかけているでしょう:ファイル、どのファイル?ええ、時々エラーコードを理解することは少し創造的な考えを必要とします。OpenSemaphoreそれでは、考えてみましょう。関数に関して、「ファイルが見つかりません」とはどういう意味でしょうか。パラメータの1つは、開くセマフォの名前を指定する文字列です。それはファイルのようなものですよね?良いリードになるのに十分近い!

その場合、lpNameパラメーターに指定している値が有効なセマフォに対応していない可能性があります。私が通常最初にチェックするのは文字列のlpName大文字と小文字です。値との比較では大文字と小文字が区別されます。しかし、以前は32ビットアプリケーションで動作していたとおっしゃっていたので、おそらくここで問題が発生しているわけではありません。

ただし、32ビットから64ビットへの移行は別の手がかりを与えてくれます。32ビットアプリケーションと64ビットアプリケーションは非常に異なる獣であり、通常、相互に接触することは許可されていないことに注意してください。したがって、64ビットアプリケーションが32ビットアプリケーションによって作成されたセマフォを使用できず、その逆も同様であるのは当然のことです。

新しいCreateSemaphoreセマフォを作成するために電話をかけるとうまくいくとあなたが言ったことを考えると、それは答えを見つけるための私たちの道に私たちをうまく連れて行きます。関数の呼び出しで開こうとしているセマフォは32ビットプロセスによって作成されたものであるため、64ビットプロセスで開いたり使用したりすることはできません。(ドキュメントには、 「関数を使用して、あるプロセスがすでにセマフォを作成している場合にのみ、関数が成功する」と記載されていることを覚えておいてください。)64ビットプロセスで新しいセマフォを作成すると、問題なく開いて使用できます。 。OpenSemaphoreCreateSemaphore

于 2012-07-26T11:53:35.993 に答える
1

OpenSemaphoreとCreateSemaphoreは2つの異なるものです。Open Semaphoreは、セマフォがすでに存在する場合にのみ使用できます。

MSDNから

OpenSemaphore関数を使用すると、複数のプロセスが同じセマフォオブジェクトのハンドルを開くことができます。この関数は、一部のプロセスがCreateSemaphoreを使用してセマフォをすでに作成している場合にのみ成功します。

于 2012-07-26T11:50:21.877 に答える