Главная страница
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.021 c
1-6035
Kair
2004-02-19 08:05
2004.03.03
Message


1-6136
Saturn
2004-02-19 17:36
2004.03.03
Express!!! Type


1-6049
Слава_
2004-02-13 22:34
2004.03.03
Подскажите пожалуйста по TrayIcon


14-6208
Style
2004-02-10 15:52
2004.03.03
Stack Overflow при компиляции 8)


14-6197
Nikolay M.
2004-02-10 10:00
2004.03.03
Кто за электробритву скажет?