0

管理者以外のWindowsユーザーにのみ発生する非常に複雑な問題があります。

デスクトップに常駐し、C++dllの関数を呼び出すスクリプトSを実行します。その場合のフローは次のとおりです。

  1. 私のC++dllは、Delphiプロセスを作成し、パラメータとしてGUIDを送信します。
  2. 初期化時に、Delphiプロセスは、COMオブジェクトファクトリを使用してクラスCを指定されたGUIDに登録します。
  3. 私のC++dllは、同じGUIDでCoCreateInstanceExを呼び出そうとします。==>操作はHResult0x80029c4aで失敗しますタイプライブラリ/DLLのロード中にエラーが発生しました。

Delphi側から例外はスローされません-登録はスムーズに機能しているようです。

プロセスモニターを使用して、CoCreateInstanceExが呼び出されたときに、Delphiexeファイルを間違った場所から読み取ろうとしていることに驚きました。exeが登録されている場所にアクセスしようとする代わりに、スクリプトSが存在するデスクトップからexeにアクセスしようとしますが、もちろんexeはそこにありません。

これは、管理者以外のユーザーにのみ発生します。また、管理者ユーザーが以前にこのスクリプトを実行したことがある場合、非管理者にとっては完全に正常に実行されます。

私は今、なぜこれが起こっているのかを理解しようとしています。これが、CoCreateInstanceExのフローを理解しようとする理由です。Web上で有用な情報は見つかりませんでした。では、CoCreateInstanceExはどのように型をロードしようとしますか?どこを見ようとしますか?説明されている状況がどのように発生する可能性があるかについて何か考えがありますか?

どんな情報やアイデアも大歓迎です!

4

1 に答える 1

0

Delphiプロセスのexeが、フルパスではなく相対パスで登録されていることがわかりました。

管理者ユーザーにとってなぜそれが正しく機能したのかはまだわかりません...だから誰かがアイデアを持っているなら私は聞いてみたいと思います。

于 2011-01-10T07:42:24.230 に答える