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

Вниз

Принудительная регистрация OLE-сервера   Найти похожие ветки 

 
den777   (2004-02-18 15:17) [0]

В программе есть OLE-сервер. При старте программы соотвественно происходит принудительная регистрация OLE-сервера. Но в Win2000 если у пользователя нет определенных прав программа выдает ошибку и вылетает. Понятно что можно запустить программу один раз от "АДМИНИСТРАТОР" и потом спокойно работать. Но чаще всего в OLE-сервере, который встроен в мою программу, нет необходимости. Вопрос - можно ли запустить EXEшник без регистрации OLE-сервера или написать коды программы так, чтобы OLE-сервер регистировался только при определенных входных параметрах (не при REGSERVER, а при каком-то определенном мной параметре).


 
Digitman ©   (2004-02-18 15:20) [1]

где и как у тебя в приложении выполняется регистрация ?


 
den777   (2004-02-18 15:35) [2]

unit comserv.pas

procedure InitComServer;
begin
if SaveInitProc <> nil then TProcedure(SaveInitProc);
ComServer.FStartSuspended := (CoInitFlags <> -1) and
Assigned(ComObj.CoInitializeEx) and Assigned(ComObj.CoResumeClassObjects);
ComServer.Initialize; в этом методе и происходит регистрация
if ComServer.FStartSuspended then
ComObj.CoResumeClassObjects;
end;

initialization
begin
OleAutHandle := SafeLoadLibrary("OLEAUT32.DLL");
ComServer := TComServer.Create;
if not ModuleIsLib then
begin
SaveInitProc := InitProc;
InitProc := @InitComServer;
AddTerminateProc(@AutomationTerminateProc);
end;
end;

А в моих кодах соответственно есть
TMyAutoObject = class(TAutoObject, IConnectionPointContainer, IcoPP)

и

uses ComServ;

Наверное отсюда можно что-то понять, а иначе еще много кодов вставить придется.


 
just me   (2004-02-18 15:47) [3]

Посмотри реализацию конструктора класса TComServer - с помощью параметров командной строки этим можно управлять


 
Digitman ©   (2004-02-18 16:04) [4]

думаю, нужно каким-то образом сделать условным выполнение кода, выделенного жирным :

initialization

TAutoObjectFactory.Create(ComServer, TMyAutoObject, Сlass_MyAutoObject, ciMultiInstance, tmApartment);


 
den777   (2004-02-18 16:46) [5]


> думаю, нужно каким-то образом сделать условным выполнение
> кода, выделенного жирным :


Думаю это как раз никак не повлияет. Из приведенных мною выше кодов стандартного UNITа DELPHI comserv.pas следует что регистрация происходит не при создании класса TAutoObjectFactory, а при инициализации модуля comserv.pas. А вот на секцию initialization UNITA comserv.pas повлиять не удасться. Есть предположение переписать TComServer описанный в этом юните и перекрыть TComServer.Initialize в котором выполнять UpdateRegistry(FStartMode <> smUnregServer) по какому-либо условию. Соответственно сделав потом что-то типа TAutoObjectFactory.Create(ComServerMy ...) я смогу управлять процессом регистрации.Но как-бы потом это не аукнулось в каком-нибудь другом месте. Есть ли мнения на данный счет.


 
den777   (2004-02-18 18:22) [6]

Может кто-нибудь еще выскажется.


 
Бином Ньютоныч   (2004-02-18 21:15) [7]

Регистрация класса производится его фабрикой - метод UpdateRegistry.
Если не создавать фабрику в инициализации, то и регистрации не будет. Но при этом, возможно, придется вручную загрузить библиотеку типов, если этот класс - единственный, который ее использует.


 
den777   (2004-02-18 21:40) [8]

Действительно, так оно и есть. Сразу и не понял смысла строки 9, а ведь именно в ней и производится вызов метод UpdateRegistry всех фабрик.

1 procedure TComServer.UpdateRegistry(Register: Boolean);
2 begin
3 if FTypeLib <> nil then
4 if Register then
5 RegisterTypeLibrary(FTypeLib, GetModuleFileName) else
6 UnregisterTypeLibrary(FTypeLib);
7 FRegister := Register;
8 ComClassManager.ForEachFactory(Self, FactoryUpdateRegistry);
9 end;

Спасибо за ответ и Digitmanу. Сразу не разобрался, а ответ по сути правильный.



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

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

Наверх




Память: 0.49 MB
Время: 0.011 c
14-6213
syte_ser78
2004-02-11 12:09
2004.03.03
разбивка имени компонента


1-6059
Mr.XpeH
2004-02-17 14:04
2004.03.03
Как сделать прогу по сканированию директории?


4-6280
xoluay
2003-12-25 21:31
2004.03.03
Как узнать координаты Курсора мыши?


14-6203
syte_ser78
2004-02-11 17:48
2004.03.03
Подсчет количества ключей в заданой секции инифайла


14-6190
Andreas
2004-02-11 18:29
2004.03.03
Пропали подключения ?