Как COM CoCreateInstanceEx пытается загрузить типы (для победителя без прав администратора)? - PullRequest
0 голосов
/ 04 января 2011

У меня очень сложная проблема, которая возникает только для пользователей без прав администратора.

Я запускаю скрипт S, который находится на рабочем столе и вызывает функцию в DLL C ++. Тогда поток выглядит следующим образом:

  1. My C ++ dll создает процесс Delphi, отправляя ему GUID в качестве параметра.
  2. При инициализации мой процесс Delphi регистрирует класс C с заданным GUID, используя фабрику COM-объектов.
  3. Моя C ++ dll пытается вызвать CoCreateInstanceEx с тем же GUID. ==> Сбой операции с HResult 0x80029c4a Ошибка загрузки библиотеки типов / DLL.

Нет исключений со стороны Delphi - регистрация, кажется, работает гладко.

Я использовал монитор процесса и с удивлением обнаружил, что при вызове CoCreateInstanceEx происходит попытка прочитать исполняемый файл Delphi из неправильного расположения. Вместо того, чтобы пытаться получить доступ к тому месту, где зарегистрирован exe-файл, существует попытка получить доступ к exe-файлу с рабочего стола, где находится сценарий S, и, конечно, exe-файл отсутствует.

Это происходит только с пользователем без прав администратора. Кроме того, если администратор когда-либо запускал этот скрипт ранее, он отлично работает для не-администратора.

Теперь я пытаюсь выяснить, почему это происходит. Вот почему я пытаюсь понять поток CoCreateInstanceEx. Я не нашел никакой полезной информации в Интернете. Так как же CoCreateInstanceEx пытается загрузить типы? Где это пытается посмотреть? Ты хоть представляешь, как может сложиться описанная ситуация?

Любая информация или идеи будут очень благодарны!

1 Ответ

0 голосов
/ 10 января 2011

Оказывается, что exe процесса Delphi был зарегистрирован с относительным путем вместо полного пути.

Я до сих пор не уверен, почему для администратора он работал правильно ... Так что, если у кого-то есть идея, мне будет интересно услышать.

...