作成しているプログラムにWINAPIを使用しています。プログラムには別のプロセスのProcessIdがあり、そのハンドルを取得する必要があります(後で終了できるようにするため、またプロセスが稼働していて、WaitForSingleObjectを使用して応答しているかどうかを定期的に確認するため)。プログラムを(Embarcadero RAD Studio 2010 C ++ Builderで)コンパイルすると、うまく機能します。プログラムは正常にハンドルを取得しているようで、通常は意図したとおりに機能します。ただし、スタンドアロンexeとしてフォルダから起動すると、ハンドルを正しく取得できないようです。比較して確認しました(CompanionはHANDLEで、Companion_PIDはDWORDです)。
GetProcessId(Companion)
と
Companion_PID
ここで、数行前に、Companionは次のコードのCompanion_PIDから取得されます。
Companion = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Companion_PID);
また、「GetProcessId(Companion)」の結果は0になります(これは、OpenProcessが適切なハンドルを返さなかったことを示す良い兆候です。
このコードがコンパイラから実行された場合とスタンドアロンのexeとして実行された場合では、動作が異なることにかなり驚いています。最初のケースでは、セキュリティ属性はコンパイラ自体から継承されていると思いますが、特にWINAPIとセキュリティ属性の経験が豊富な人から、この動作のより良い説明を聞きたいと思います。
小さな更新:はい、私が思ったように、OpenProcessはエラー0x5=ERROR_ACCESS_DENIEDになります。