![]() |
![]() ![]() ![]() | |
|
Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|| Форумы Здесь вы можете задать свой вопрос и наверняка получите ответ |
ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
| ||
![]() | ||
|
Чтобы не потерять эту дискуссию, сделайте закладку
« предыдущая ветвь | форум | следующая ветвь »
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;
DLLlibrary 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;
пишу sqlEXEC @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. И много то как )
Разрешается использование тегов форматирования текста:
версия для печати
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)
|
![]() ![]() ![]() |