Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как создать DLL который работает как EXE сервер. [D3, D4, D5, D6, Win95/98, WinME, NT4, Win2k, WinXP]


ikar ©   (2002-02-14 09:48:00) 

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


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

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


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

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


Digitman (M)   (2002-02-14 17:46:00) [3]

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


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

>Digitman (M) (14.02.02 17:06)

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


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

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


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

>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 14:41:00) [7]

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

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

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


Adder (M)   (2002-02-14 13:57:00) [8]

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

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

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


Adder (M)   (2002-02-14 13:46:00) [9]

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.


Digitman (M)   (2002-02-14 12:25:00) [10]

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


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

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

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

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


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

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


ikar   (2002-02-14 11:58:00) [13]

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


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

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


ikar   (2002-02-14 11:52:00) [15]

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


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

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


Digitman (M)   (2002-02-14 11:27:00) [17]

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

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

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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо