Форум: "Основная";
Текущий архив: 2003.06.02;
Скачать: [xml.tar.bz2];
ВнизСоздание COM-объекта Найти похожие ветки
← →
Calm (2003-05-21 14:48) [0]Уважемые коллеги,
возникли проблемы с созданием com-объекта из программы :((
Производственная необходимость заставила написать свой первый COM-сервер.
Сервер реализован в DLL. Имя проекта SAPLink.
COM-сервер реализует всего один интерфейс
Ir3TimeKeeperPipe = interface(IUnknown)
["{9C12D600-E89D-48F0-88F3-9837B8708D98}"]
function ExtractAbsence(const DateFrom: WideString; const DateTo: WideString;
const TabelNum: WideString): SYSINT; stdcall;
function Test(Msg: Integer): HResult; stdcall;
function Log(const Msg: WideString): HResult; stdcall;
end;
Как вызывать его с испльзованием позднего связывания?
Предполагал, что требуется такой код:
var
SAPLink:Variant;
begin
SAPLink:=CreateOLEObject("SAPLink.r3TimeKeeperPipe");
SAPLink.ExtractAbsence("01.04.2003", "01.07.2003", "1051");
SAPLink.Release;
end
Однако получаю сообщение "интерфейс не поддерживается", хотя сервер был зарегистрирован мною утилитой regsvr32.
В тоже время раннее связывание работает вполне корректно:
var
SAPLink:Ir3TimeKeeperPipe;
begin
SAPLink:=Cor3TimeKeeperPipe.Create;
SAPLink.ExtractAbsence("01.04.2003", "01.07.2003", "1051");
SAPLink:=nil;
end
Думаю, что неправильно указываю параметр функции CreateOLEObject,
хотя допускаю, что проблема может быть и в другом месте.
Пожалуйста, помогите запустить сервер через позднее связывание.
Заранее спасибо.
P.S.
Бесценна будет помощь тех, кто работал с COM из PHP
← →
Goffman (2003-05-21 14:54) [1]Может я и ошибаюсь, но помнится мне, что для того чтобы сервер мог поддерживать позднее связывание, он должен быть внешним (так как только внешние сервера поддерживают автоматизацию)
← →
VMcL (2003-05-21 14:56) [2]1. IMHO, позднее связывание реализуется на IDispatch, а не IUnknown.
← →
VMcL (2003-05-21 14:58) [3]2. CreateOleObject возвращает IDispatch.
← →
Serginio (2003-05-21 14:59) [4]Найди по Guid в реестре свой объект. И посмотри как он прописан.
Можешь задать свое название например
ComServer.SetServerName("AddIn");// Задоешь имя фабрики классов
TComObjectFactory.Create(ComServer,TAddInObject,CLSID_AddInObject,
"AddInFromITypeInfo","V7.7 AddInFromITypeInfo 1.0",ciMultiInstance,tmApartment);
тогда строка будет иметь следующий вид
AddIn.AddInFromITypeInfo
← →
Serginio (2003-05-21 15:00) [5]VМCL прав CreateComObject
← →
Внук (2003-05-21 15:16) [6]Чтобы работало позднее связывание, нужна поддержка интерфейса IDispatch (интерфейс-наследник), как тут правильно заметили. Потому как именно он и реализует позднее связывание посредством методов GetIDsOfNames и Invoke.
← →
Calm (2003-05-21 15:16) [7]
> Serginio (21.05.03 14:59)
> Найди по Guid в реестре свой объект. И посмотри как он прописан.
Да я нашел. Он прописан, как я указывал.
> CreateComObject
Пишу
SAPLink:=CreateCOMObject({DFB76C43-C485-4372-90AD-57B55103C587});
Копилятор ругается и говорит, что not enough actual paramenters, хотя в help"е ясно написано
Unit
ComObj
Category
COM utilities
function CreateComObject (const ClassID: TGUID): IUnknown;
В чем проблема?
Относительно внешнего сервера... Да, скорее всего нужно сделать exe. Попробую. Но почему не компилится CreateComObject?
← →
Calm (2003-05-21 15:21) [8]
> Внук © (21.05.03 15:16)
> Чтобы работало позднее связывание, нужна поддержка интерфейса
> IDispatch (интерфейс-наследник), как тут правильно заметили.
> Потому как именно он и реализует позднее связывание посредством
> методов GetIDsOfNames и Invoke.
Я создавал ActiveX Library, а потом COM Object.
Что сделать для того, чтобы мой сервер поддерживал IDispatch?
Насколько я понимаю, в Delphi должен быть какой-то мастер, автоматизирующий это дело.
Хотя может и руками можно реализовать методы GetIDsOfNames и Invoke? Как они должны быть устроены?
← →
VMcL (2003-05-21 15:23) [9]
const
G: TGUID = "{DFB76C43-C485-4372-90AD-57B55103C587}";
// ...
SAPLink := CreateCOMObject(G);
← →
Внук (2003-05-21 15:26) [10]Можно и руками, конечно. А можно, наверно, Automation Object создать в Delphi.
http://anatolix.naumen.ru/combooks.htm
← →
Calm (2003-05-21 15:33) [11]
> Внук © (21.05.03 15:26)
Спасибо за ссылочку.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.06.02;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c