Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизКом сервер в сервисе. Найти похожие ветки
← →
Дмитрий С © (2012-10-31 21:32) [0]Создал, зарегистрировал в реестре:
[HKEY_CLASSES_ROOT\AppID\{914DA410-7FE8-11D2-98FA-204C4F4F5020}]
"LocalService"="SvcWithComServer"
[HKEY_CLASSES_ROOT\CLSID\{914DA413-7FE8-11D2-98FA-204C4F4F5020}]
"AppID"="{914DA410-7FE8-11D2-98FA-204C4F4F5020}"
Работает. Но два вопроса:
1.
Почему код использования получения объекта работает:OleCheck(CoGetClassObject(CLSGUID, CLSCTX_ALL, nil, IClassFactory, Factory));
OleCheck(Factory.CreateInstance(nil, IDispatch, Obj));
А такой нет:OleCheck(CoCreateInstance(CLSGUID, nil, CLSCTX_ALL, IDispatch, Obj))
Ошибка: интерфейс не поддерживается. Замена IDispatch на IUnknown ничего не изменила.
2.
Как сделать чтобы вызов CoGetClassObject не приводил к запуску службы, а возвращал ошибку, если служба не запущена.
← →
Дмитрий С © (2012-10-31 21:53) [1]со 2 разобрался.
1 вопрос актуален еще.
← →
Dimka Maslov © (2012-10-31 22:03) [2]
> со 2 разобрался.
Нам расскажи, интересно же.
← →
Дмитрий С © (2012-10-31 22:09) [3]
> Нам расскажи, интересно же.
Точно.
Для этого в
[HKEY_CLASSES_ROOT\AppID\{914DA410-7FE8-11D2-98FA-204C4F4F5020}]
нужно определить параметр LaunchPermission.
Это можно сделать с помощью, например, dcomcnfg.exe
или самому записать туда DACL
← →
Дмитрий С © (2012-11-01 18:37) [4]с 1 тоже разобрался.
Это было связано с неправильной реализацией метода IClassFactory.CreateInstance.
Было так:
if unkOuter <> nil then
Exit(CLASS_E_NOAGGREGATION);
if IsEqualIID(iid, IDispatch) then
IDispatch(obj) := FConnector
else
Exit(E_NOINTERFACE);
Result := S_OK;
А надо было минимум так:
if unkOuter <> nil then
Exit(CLASS_E_NOAGGREGATION);
if IsEqualIID(iid, IDispatch) then
IDispatch(obj) := FConnector
else
if IsEqualGUID(iid, IInterface) then
IInterface(obj) := FConnector
else
Exit(E_NOINTERFACE);
Result := S_OK;
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.071 c