Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.03.04;
Скачать: CL | DM;

Вниз

Как создать DLL который работает как EXE сервер.   Найти похожие ветки 

 
ikar ©   (2002-02-14 09:48) [0]

То есть он не загружается в адресное пространство программы, а запускается как самостоятельный процесс в системе.


 
Fellomena   (2002-02-14 11:06) [1]

DLL по определению не может иметь своего адресного пространства. Сама концепция динамически компануемых библиотек подразумевает, что эта библиотека будет отражаться на адресное пространство некого процесса и выполняться в контексте этого процесса.
Другое дело, что можно заставить процесс Explorer.exe (думаю, знаком с таким ;) грузить в своё АП твою DLL, а на точку входа в DLL поставить код, использующий всю внутреннюю структуру DLL, т.е. все её ф-ии и процедуры.


 
Digitman (M) ©   (2002-02-14 11:27) [2]

практически любой EXE можно превратить в OutOfProcess-сервер, включив в него код регистрации требуемой фабрики класса.
например, влючив в EXE-проект модуль, реализующий станд.класс TRemoteDataModule, ты фактически превращаешь свой EXE в OutOfProcess-сервер.

см., к примеру, как происходит регистрация фабрики класса TRemoteDataModule в разделе инициализации модуля, реализующего класс, наследующий функциональность TRemoteDataModule.

в общем же случае, см. TComObjectFactory.Create()


 
Fellomena   (2002-02-14 11:34) [3]

2 Digitman: пардон, объясни пожалуйсто, при чём тут DLL ? Вопрос, как мне показалось, вполне определённый стоял - про DLL. Или я просто чего-то не поняла ?


 
ikar ©   (2002-02-14 11:52) [4]

Вопрос именно про Dll но мне кажется что фабрику классов можно зарегистрировать и там, но как сделать это ручками. Я думаю Delphi сама этого делать не будет.


 
Digitman (M) ©   (2002-02-14 11:54) [5]

>ikar
С DLL - никак. И не мучайся даже. OutOfProcess-сервер базируется искл-но на EXE.


 
ikar ©   (2002-02-14 11:58) [6]

Но я слыхал про технологию которая позволяет использовать COM объекты in proc как exe out proc.


 
Digitman (M) ©   (2002-02-14 12:04) [7]

>Fellomena
Действительно - я не "въехал" в суть вопроса)
Но - тем не менее : DLL - всегда InProc-сервер и никогда - OutOfProc-сервер. Это, надеюсь, понятно всем.
А вот по поводу IE и возможности автозагрузки им в свое АП указанной DLL при старте - не думаю, что сию "фичу" можно как-то отнести именно к ClassFactory-механизму. Как ты видишь себе способ заставить IE (даже с загруженной им нужной DLL) автоматически создать указанный объект по COM/OLE-запросу внешней задачи ?


 
Fellomena   (2002-02-14 12:15) [8]

А я и не сказала, что можно использовать фабрику классов и вообще разместить в АП Explorer-a свой сервер.
Я просто постаралась объяснить принцип работы DLL и невозможность запустить её как самостоятельный процесс.

>> Но - тем не менее : DLL - всегда InProc-сервер и никогда - OutOfProc-сервер. Это, надеюсь,
понятно всем.

Именно про это я и сказала в первой мессаги !!!


 
Digitman (M) ©   (2002-02-14 12:25) [9]

>Fellomena
Ok. Ч.н. - "нэма базару"))))
А вот давай-ка по случаю конфуза и испросим у автора : что же он имел ввиду под "DLL который работает как EXE сервер"


 
Adder (M) ©   (2002-02-14 13:46) [10]

MSDN:

DllSurrogate
Enables DLL servers to run in a surrogate process. If an empty string is specified, the system-supplied surrogate is used, otherwise the value specifies the path of the surrogate to be used.

Registry Entry
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\APPID\
{AppID_value}\DllSurrogate = surrogate_path

Note

HKEY_CLASSES_ROOT is equivalent to HKEY_LOCAL MACHINE\SOFTWARE\Classes. These keys can be used interchangeably. HKEY_CLASSES_ROOT also provides compatibility with Microsoft® Windows® 3.1 and Windows 95.

Remarks
The DllSurrogate named value specifies that the class is a DLL that is to be activated in a surrogate EXE process, and the surrogate process to be used. The surrogate_path value is of type REG_SZ. To use the system-supplied generic surrogate process, set surrogate_path to an empty string or NULL. To specify another surrogate process, set surrogate_path to the path of the surrogate. As in the specification of the path of an EXE server under the LocalServer32 key, a full path specification is not necessary. The surrogate EXE must be written to properly communicate with the DCOM service as described in Writing a Custom Surrogate.

The DllSurrogate named value must be present for a DLL server to be activated in a surrogate. Activation refers to a call to CoGetClassObject, CoCreateInstance[Ex], CoGetInstanceFromFile, CoGetInstanceFromIStorage, or IMoniker::BindToObject. DLL servers are easy to write using standard development tools like Microsoft® Visual Basic®, Microsoft® Visual J++™, and Microsoft Visual Studio®. Running DLLs in a surrogate process provides the benefits of an executable implementation, including fault isolation, the ability to serve multiple clients simultaneously, and allowing the server to provide services to remote clients in a distributed environment.



 
Adder (M) ©   (2002-02-14 13:57) [11]

Иначе говоря, можно сделав соответствующую запись в системном реестре, заставить InProc-сервер вести себя как OutOfProc-сервер,
запустив его в "суррогатном процессе". По умолчанию - используется DllHost.exe

А это пример (прям из моего реестра):
REGEDIT4

[HKEY_LOCAL_MACHINE\Software\CLASSES\AppID\{BFD4D0D1-42C9-4791-B4BA-3AE9BE47882E}]
@="InSAT.MFC"
"DllSurrogate"=""



 
Digitman (M) ©   (2002-02-14 14:41) [12]

Да, но ведь "вести себя как" не означает "быть" ? Все равно - и при таком подходе библиотеке требуется "чужое тело" - суррогатный процесс-носитель, чье АП будет использовано (!) без его (процесса) ведома....

А вообще - верно, согласен. Здесь что-то близкое к решению есть.

P.S.
(!) = Вот ведь чудная "дыра"-то для разного рода сетевой заразы ...


 
Набережных С.   (2002-02-14 16:59) [13]

>ikar © (14.02.02 09:48)

Можно сделать DLL, которая будет загружаться RunDll32.exe. Для этого DLL должна экспортировать функцию типа(имя может быть любым):

function Execute(hWind: HWND; Instance: HWND;
pCmdLine: PChar;nCmdShow: Longint): Integer; StdCall;


Запуск можно производить командной строкой(например, через ярлык) примерно такого вида:

RunDll32.exe MyDllName.dll,Execute Param1 Param2


 
Digitman (M) ©   (2002-02-14 17:06) [14]

>Набережных С.
Мы тут как бы о COM-механизме говорим. А ты о чем ?)


 
Набережных С.   (2002-02-14 17:18) [15]

>Digitman (M) (14.02.02 17:06)

Полагаю, автор вопроса имел в виду именно это. Если я неправ, пусть он меня поправит.


 
Digitman (M) ©   (2002-02-14 17:46) [16]

Ок. Но см. <ikar> © (14.02.02 11:58)


 
Набережных С.   (2002-02-14 18:06) [17]

Вероятно, я действительно неверно понял. Надеюсь, меня не расстреляют?:-).


 
Digitman (M) ©   (2002-02-14 18:14) [18]

>Набережных С.
Чуть-чуть :))))) Это не больно, поверь... )



Страницы: 1 вся ветка

Текущий архив: 2002.03.04;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.008 c
14-9286
Alx2
2002-01-18 08:09
2002.03.04
Святая вода, или тема на злобу дня


6-9256
Vlad_NOJABR
2001-12-11 07:49
2002.03.04
Как распечатать содержимое HTML-страничики?


4-9329
solsoft
2001-12-28 10:19
2002.03.04
Прокрутка текста колесом мыши


3-9088
perov
2002-02-07 08:40
2002.03.04
помогите составить запрос, пожалуйста


7-9314
Еремин Дмитрий
2001-11-30 09:39
2002.03.04
Вопрос по системе