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

Вниз

Создание 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
3-2776
paxer
2003-05-13 17:20
2003.06.02
query


14-3091
Aferist
2003-05-13 18:32
2003.06.02
Катриджи от canon


1-2906
leonidus
2003-05-19 01:11
2003.06.02
Высота меню PopUp


14-3082
Saracin
2003-05-14 10:18
2003.06.02
Работа с системным журналом.


3-2786
VladN
2003-05-14 13:30
2003.06.02
Как в SQL запросе, сортировка в обратном порядке?