Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.008 c
14-3070
Style
2003-05-15 22:57
2003.06.02
PAS 2 HTML


1-2993
Term
2003-05-21 16:47
2003.06.02
Вопрос по динамическим массивам.......


1-2878
User
2003-05-22 12:43
2003.06.02
Быстрое копирование блоков памяти


14-3107
SKing
2003-05-14 10:54
2003.06.02
Изменение DBCheckBox по двойному клику?


1-2841
BillyJeans
2003-05-20 15:42
2003.06.02
QReport без DataSet?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский