hModule из Stream
От: NSP Россия  
Дата: 06.09.06 21:49
Оценка:
Доброго времени дня!

В потоке лежит DLL, из которой нужно вызвать 'DllRegisterServer' НЕ записывая на диск.
Пытаюсь получить hModule из Stream таким способом,но почему-то hModule = 0.

procedure RegisterStreamDLL(Stream: TResourceStream);
type 
  TDllRegisterServer = function: HResult; stdcall; 
var
  RegFunc: TDllRegisterServer;
  Instance: THandle;
  IntStream: IStream;
begin
IntStream := Classes.TStreamAdapter.Create(Stream);
GetHGlobalFromStream(IntStream, Instance); //видимо работает не так
RegFunc := GetProcAddress(Instance, 'DllRegisterServer');
if @RegFunc <> nil then
    RegFunc
else
    MessageDlg('Error during DllRegisterServer!', mtWarning,[mbYes],0);
end;


Может вместо GetHGlobalFromStream() хэндл потока из интерфэйса IStream надо получать другим способом?Или весь подход неверен?
Спасибо!
На интересной работе и сны интересные видишь
Re: hModule из Stream
От: Danchik Украина  
Дата: 07.09.06 12:32
Оценка:
Здравствуйте, NSP, Вы писали:

NSP>Доброго времени дня!


NSP>В потоке лежит DLL, из которой нужно вызвать 'DllRegisterServer' НЕ записывая на диск.

NSP>Пытаюсь получить hModule из Stream таким способом,но почему-то hModule = 0.

[Skip]

NSP>Может вместо GetHGlobalFromStream() хэндл потока из интерфэйса IStream надо получать другим способом?Или весь подход неверен?

NSP>Спасибо!

GetHGlobalFromStream — это вообще не из той оперы

И чего вы хотели добиться при регистрации DLL, которая находится в потоке? Гы, честно, смешно. Интересно откуда Windows будет подымать этот COM сервер Из потока какой то програмы, которая может уже и скончалась

Совет:
лучше все таки скидывать DLL на диск (грузить ее из памяти очень не тривиальная задача). В вашем примере вы для не просто запортили registry — в потоках даный подход работать не будет.
Имя можете DLL подобрать уникальное.
Загружаем ее, находим процедуру GetProcAddress ('CreatePluginObject') — вызываем ее и получаем нужный нам интерфейс. COM в даном случае можна и не использовать, зачем лишние минингиты, вы же не занимаетесь interprocess взаимодействием.
Попользовались DLL — выгрузили, удалили.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.