Текущий архив: 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.46 MB
Время: 0.007 c