Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

COM автомат. Что делаю не так?


ВладОшин ©   (22.12.20 09:56

Основательно игнорировал эту тему ранее, так, только на прикладном уровне, для решения конкретной задачи, как пользователь чужих com-серверов.

Захотелось свой сделать. Простой для начала. Цель - сделать в mssql аля так
EXEC @rc = sp_OACreate 'MSXML2.ServerXMLHTTP', @object OUTPUT

для начала, у меня будет 1 свойство, int. Его можно читать и писать

На Королевстве почитал статью, сделал в визарде
TLB

 
 LIBID_Project1: TGUID = '{0BC67202-580B-4E29-B5F6-9CB0AD67CE0F}';

 IID_Itest22: TGUID = '{7BEA0943-9D58-467B-BBA0-978B8B5CE142}';
 CLASS_test22: TGUID = '{4252962B-7784-4A07-9630-18A5965A9505}';
type

 Itest22 = interface;
 Itest22Disp = dispinterface;

 test22 = Itest22;

 Itest22 = interface(IDispatch)
   ['{7BEA0943-9D58-467B-BBA0-978B8B5CE142}']
   function Get_Property1: SYSINT; safecall;
   procedure Set_Property1(Value: SYSINT); safecall;
   property Property1: SYSINT read Get_Property1 write Set_Property1;
 end;


DLL
library Project1;

uses
 ComServ,
 Project1_TLB in 'Project1_TLB.pas',
 Unit1 in 'Unit1.pas' {test22: CoClass};

exports
 DllGetClassObject,
 DllCanUnloadNow,
 DllRegisterServer,
 DllUnregisterServer;

{$R *.TLB}

{$R *.RES}

begin
end.
//----------------------------------------------------------
type
 Ttest22 = class(TAutoObject, Itest22)
 protected
   FProperty1: Integer;
   function Get_Property1: SYSINT; safecall;
   procedure Set_Property1(Value: SYSINT); safecall;
 public
   property Property1: Integer  read Get_Property1 write Set_Property1;
 end;

implementation

uses ComServ;

function Ttest22.Get_Property1: SYSINT;
begin
 Result :=  FProperty1;
end;

procedure Ttest22.Set_Property1(Value: SYSINT);
begin
 FProperty1 := Value;
end;

initialization
 TAutoObjectFactory.Create(ComServer, Ttest22, Class_test22,
   ciMultiInstance, tmApartment);
end.


в меню RUN нажимал Register ActivX server

в тестовом приложении все нормально
procedure TForm1.btn1Click(Sender: TObject);
var
 tt: Itest22;
begin
 tt:= CreateComObject(CLASS_test22) as Itest22;
  tt.Property1 := 3;
  ShowMessage(IntToStr(tt.Property1));
end;


пишу sql
EXEC @rc = sp_OACreate '{7BEA0943-9D58-467B-BBA0-978B8B5CE142}', @object OUTPUT
IF @rc <> 0
begin
   EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
   print @src
   print @desc
end

получаю
ODSOLE Extended Procedure
Класс не зарегистрирован


делаю с правами админа
c:\windows\syswow64\regsvr32.exe C:\Users\oshin\Desktop\ccc\22\Project1.dll
пишет - ok

опять делаю  - EXEC @rc = sp_OACreate '{7BEA0943-9D58-467B-BBA0-978B8B5CE142}', @object OUTPUT
опять Класс не зарегистрирован

что не так?


Styx ©   (23.12.20 20:38[1]

Не специалист в COM, но тот ли GUID указывается? Часом не {4252962B-7784-4A07-9630-18A5965A9505} нужен?


ВладОшин ©   (24.12.20 09:34[2]

пробовал все три )
даже при очевидном бреде первого, но вдруг..
LIBID_Project1: TGUID = '{0BC67202-580B-4E29-B5F6-9CB0AD67CE0F}';
IID_Itest22: TGUID = '{7BEA0943-9D58-467B-BBA0-978B8B5CE142}';
CLASS_test22: TGUID = '{4252962B-7784-4A07-9630-18A5965A9505}';


зы
задачу (к которой подходил, которую через COM хотел сделать) сделал через консольку и xp_shellexecute, с запуском с параметром и чтением результата ее вывода

 declare @T table (C varchar(999));
 declare @CMD varchar(999) = 'PROGRAMM.exe параметры'
 insert into @T EXEC xp_cmdshell @cmd;
 select * from @T

Но вопрос не снимается, интересно же как надо все-таки


Styx ©   (24.12.20 17:31[3]

А если продолжить эксперименты с MSXML2.ServerXMLHTTP - по CLSID {AFBA6B42-5692-48EA-8141-DC517DCF0EF1} с ним получится работать? Если да - то копать в сторону того, чем отличаются записи в реестре для этого CLSID и для Вашего...


ВладОшин ©   (25.12.20 10:06[4]

EXEC @rc = sp_OACreate '{AFBA6B42-5692-48EA-8141-DC517DCF0EF1}', @object OUTPUT

- успешно..

понял, посмотрим..


virex(home) ©   (26.12.20 21:33[5]

> ВладОшин ©   (25.12.20 10:06) [4]
>
> EXEC @rc = sp_OACreate '{AFBA6B42-5692-48EA-8141-DC517DCF0EF1}', @object OUTPUT
>
> - успешно..
>
> понял, посмотрим..
такое же делал.
у меня проблема была в том что сервер был x64 а dll и тестовая были скомпилены для 32 разр.

пришлось на delphi10 компилить для x64


virex(home) ©   (28.12.20 08:00[6]

> virex(home) ©    [5]
ну что удалось решить проблему?
ошибка "класс не зарегистрирован" какбэ намекает.

можно зарегить 32разр. как x64 но там нужно проделать много лишних манипуляций


ВладОшин ©   (31.12.20 08:32[7]

>> удалось решить проблему?
Нет, не занимался пока. Тут работы навалилось резко )

>>чем отличаются записи в реестре для этого CLSID и для Вашего...
в реестре отличия есть от MSXML2.ServerXMLHTTP. И много то как )


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо