Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.03.04;
Скачать: [xml.tar.bz2];

Вниз

Как создать 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.005 c
1-9208
Fighter
2002-02-15 04:26
2002.03.04
Подскажите какой самый безглючный компонент FTP клиент?


3-9096
jenbond
2002-02-05 10:45
2002.03.04
Проблема с запросом


1-9168
Zool
2002-02-12 17:32
2002.03.04
Просвитите чайника!


1-9198
PVOzerski
2002-02-14 17:21
2002.03.04
tDbGrid.ClientHeight at run time


3-9071
latvija
2002-02-06 14:53
2002.03.04
Господа програмисты подскажите кто знает .





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский