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

Вниз

ActiveX в компонент   Найти похожие ветки 

 
J_S ©   (2002-07-22 11:52) [0]

Есть следующий вопросик.
Имеецца active-x - он, по идее визуальный - форма - в ней поле для подачи запроса, кнопка. По нажатию кнопки результаты по запросу выводяцца в мемо...
Мне же нужно это дело преобразовать к дельфевому компоненту так что бы он был невизульный - для строки запроса отдельное свойство, а для получения ответа по этому запросу отдельный метод...
Подскажите, если кто сталкивался.


 
Kapusto ©   (2002-07-22 12:44) [1]

Не совсем понятна постановка задачи...
Необходимо создать свою обертку для данного компонента, или что? Доступен ли исходный текст ActiveX"a? От ответов на эти вопросы зависят и
дальнейшие действия...


 
Romkin ©   (2002-07-22 12:48) [2]

Это dll или ocx?
вообще-то обычно достаточно сделать import type library


 
J_S ©   (2002-07-22 13:56) [3]

это *.ocx.
а сделать надо именно обертку..:)

еще кстати вопрос - но это скорее техника - этот актив-х вроде инсталлируецца, как сообщает дельфи, но не ActiveX, ни на Samples, и вообще ни на одной из вкладок его нет...


 
Kapusto ©   (2002-07-22 16:56) [4]

После Import ActiveX Control по умолчанию в Imports должен лежать файл-обертка _TLB, который и представляет собой компонент. Посмотри в самом конце файла должен быть вызов RegisterComponents, который и должен инсталлить компонент...

А насчет обертки - можно действительно import type library и смотреть, какие методы есть у компонента... Если есть проперти, или методы, эквивалентные едиту, куда вводится запрос и нажатию кнопки, то тебе повезло... Создаешь класс этого компонента в своей обертке и работаешь с ним...


 
J_S ©   (2002-07-22 17:25) [5]

файл смотрела - процедуры RegisterComponents не нашла - хотя она должна там быть..это-то действительно странно.
в чем фишка?


 
Romkin ©   (2002-07-22 18:05) [6]

Component -> Import ActiveX Control -> (Найти в списке либо в файле) -> Install
Создастся компонент, у которого Visible есть
или Import Type Library with Generate Component wrapper (Install - пойдет на палитру)


 
J_S ©   (2002-07-22 18:33) [7]

Ребята, все это правильно...
делаю как вы и говорите.. да тока не выходит ничего - RegisterComponents у него по отсутствует... Причем любым из двух способов - результат одинаковый - компилиться без проблем, а вот устанавливаться не хотит..
Вернее, что устанавливаться не хотит он тоже не сообщает.. его просто не видно, ну а не видно естессно за отсутсвием Register.
подскажите чего делать?..
уже пробовала и в другой пакет, и на другую вкладку поместить - не получаецца...:(


 
J_S ©   (2002-07-23 10:12) [8]

Пробовала поставить его (ActiveX) на MFC. Поставился...
Вопрос - почему же этот конкретный OCX дельфи воспринимать не хочет?.


 
Romkin ©   (2002-07-23 10:17) [9]

Если нужен невизуальный компонент, то зачем мучиться?
Должен получиться модуль Delphi, в нем компонент. Register можно и вручную написать, только зачем?
Просто создавать в run-time и пользоваться


 
J_S ©   (2002-07-23 10:45) [10]

Register я вручную пробовала прописывать - тока все равно когда пакет формируешь оно все перетираецца.

я посмотрела описание которое дельфя создает - различие состоит еще в том что она к тому же не гинирит описание класса - тока интерфейсы


 
Romkin ©   (2002-07-23 11:26) [11]

а Generate component wrapper?
ВЫшли мне этот ocx, посмотрю, как это вообще модет быть....


 
J_S ©   (2002-07-23 11:44) [12]

Generate component wrapper - он тоже дает такой же результат как и Import ActiveX...
то есть описание создаецца - но оно какое-то урезанное - как я говорила отсутсвует Register - это раз, и сам класс - это два.
присутствуют тока компоненты...

interface

uses ActiveX, Classes, Graphics, OleCtrls, OleServer, StdVCL, Variants,
Windows;


// *********************************************************************//
// GUIDS declared in the TypeLibrary. Following prefixes are used:
// Type Libraries : LIBID_xxxx
// CoClasses : CLASS_xxxx
// DISPInterfaces : DIID_xxxx
// Non-DISP interfaces: IID_xxxx
// *********************************************************************//
const
// TypeLibrary Major and minor versions
axAmdProWebMajorVersion = 2;
axAmdProWebMinorVersion = 0;

LIBID_axAmdProWeb: TGUID = "{BE32B240-16C0-4D49-BAF5-7FB7EBB57AD4}";

IID__ctlAmdProWeb: TGUID = "{9E22D3E7-0B99-42D9-A1AC-7CB838297B63}";
DIID___ctlAmdProWeb: TGUID = "{91D6D5B5-F289-4464-9A86-FA176E50C744}";
CLASS_ctlAmdProWeb: TGUID = "{12DBEE5C-9A88-4143-9FD8-A01854AE0F24}";
type

// *********************************************************************//
// Forward declaration of types defined in TypeLibrary
// *********************************************************************//
_ctlAmdProWeb = interface;
_ctlAmdProWebDisp = dispinterface;
__ctlAmdProWeb = dispinterface;

// *********************************************************************//
// Declaration of CoClasses defined in Type Library
// (NOTE: Here we map each CoClass to its Default Interface)
// *********************************************************************//
ctlAmdProWeb = _ctlAmdProWeb;


// *********************************************************************//
// Interface: _ctlAmdProWeb
// Flags: (4560) Hidden Dual NonExtensible OleAutomation Dispatchable
// GUID: {9E22D3E7-0B99-42D9-A1AC-7CB838297B63}
// *********************************************************************//
_ctlAmdProWeb = interface(IDispatch)
["{9E22D3E7-0B99-42D9-A1AC-7CB838297B63}"]
procedure GhostMethod__ctlAmdProWeb_28_0; safecall;
procedure GhostMethod__ctlAmdProWeb_32_1; safecall;
...................
дальнейшее описание интерфейсов
..................
procedure GhostMethod__ctlAmdProWeb_1952_481; safecall;
function Disconnect: OleVariant; safecall;
function Reconnect: OleVariant; safecall;
function Get_GetConnectStatus: WordBool; safecall;
function MyQuery(const sQuery: WideString): WideString; safecall;
property GetConnectStatus: WordBool read Get_GetConnectStatus;
end;

// *********************************************************************//
// DispIntf: _ctlAmdProWebDisp
// Flags: (4560) Hidden Dual NonExtensible OleAutomation Dispatchable
// GUID: {9E22D3E7-0B99-42D9-A1AC-7CB838297B63}
// *********************************************************************//
_ctlAmdProWebDisp = dispinterface
["{9E22D3E7-0B99-42D9-A1AC-7CB838297B63}"]
procedure GhostMethod__ctlAmdProWeb_28_0; dispid 1610743808;
procedure GhostMethod__ctlAmdProWeb_32_1; dispid 1610743809;

.................................

procedure GhostMethod__ctlAmdProWeb_1952_481; dispid 1610744289;
function Disconnect: OleVariant; dispid 1610809346;
function Reconnect: OleVariant; dispid 1610809347;
property GetConnectStatus: WordBool readonly dispid 1745027072;
function MyQuery(const sQuery: WideString): WideString; dispid 1610809349;
end;

// *********************************************************************//
// DispIntf: __ctlAmdProWeb
// Flags: (4240) Hidden NonExtensible Dispatchable
// GUID: {91D6D5B5-F289-4464-9A86-FA176E50C744}
// *********************************************************************//
__ctlAmdProWeb = dispinterface
["{91D6D5B5-F289-4464-9A86-FA176E50C744}"]
end;

implementation

uses ComObj;

end.


 
Kapusto ©   (2002-07-23 12:29) [13]

Ну и все замечательно...
делаешь свой компонент (хотя я сделал бы просто свой класс), в Create которого вызываешь получение интерфейса _ctlAmdProWeb,
и гоняешь его function MyQuery(const sQuery: WideString): WideString;
(естественно, в uses указываешь данную TLB)

2Romkin: я не уверен, что сие получится, ибо у интерфейса стоит флаг hidden?...


 
Romkin ©   (2002-07-23 13:37) [14]

Не делает, потому что интерфейсы не начинаются с "I"
У меня через _ctlAmdProWebDisp сделалось, его hidden не сделаешь
А так, конечно, непонятно, как этим пользоваться.
И непонятно, зачем еще явный dispinterface, у основного-то Dual


 
Romkin ©   (2002-07-23 13:43) [15]

Упс! Ошибка, wrapper все равно, как интерфейс называется, а не делает компенент, имхо, потому, что Hidden


 
J_S ©   (2002-07-23 16:28) [16]

Можно немного подробнее? (про Create которого вызывает получение интерфейса _ctlAmdProWeb) и вообще что сделать в исходнике (VB) чтоб таких приколов не было?


 
Kapusto ©   (2002-07-23 17:45) [17]

TMyClass = class(TObject)
private
intf: _ctlAmdProWeb;
public
constructor Create; override;
function Query(q: string): string;
end;

TMyClass.Create
begin
intf := CreateComObject(CLASS_ctlAmdProWeb) as _ctlAmdProWeb;
end;

TMyClass.Query(q: string): string;
begin
Result := intf.MyQuery(q);
end

PS: а насчет Басика - не в курсах...
2Romkin: проверь, вроде бы должно прокатить...


 
Romkin ©   (2002-07-23 18:08) [18]

я вроде письмо послал...

uses axAmdProWeb_TLB, ComObj;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
Amd: _ctlAmdProWebDisp;
ifi: BOOL;
begin
amd := CreateComObject(CLASS_ctlAmdProWeb) as _ctlAmdProWebDisp;
ifi := amd.GetConnectStatus;
if ifi then
ShowMessage("Connected")
else
ShowMessage("Not Connected");
end;


 
J_S ©   (2002-07-23 18:58) [19]

спасибки:))
сегодня обязательно попробую...


 
J_S ©   (2002-07-24 15:29) [20]

No such interface supported

вот такая вот штука возникает при вызове метода

function TMyClass.GetResponse: String;
begin
Result := Self.FObj.MyQuery(Self.GetQuery);
end;

Self.GetQuery - возвращает строку запроса..
и вообще такая ошибка возникает при любой попытке использования функций _ctlAmdProWeb.

подскажите как бороться


 
J_S ©   (2002-07-24 15:53) [21]

а теперь
EOleException
"OLE error 800A01A9"


 
Romkin ©   (2002-07-24 15:58) [22]

Используй не _ctlAmdProWeb, а _ctlAmdProWebDisp, у меня код (выше) проходит без ошибки, если Disp


 
J_S ©   (2002-07-24 16:13) [23]

да спасибо большое:) - а в чем различие?


 
Romkin ©   (2002-07-24 16:37) [24]

Это Dispinterface, и обращение происходит не через vtable, а через вызовы invoke



Страницы: 1 вся ветка

Текущий архив: 2002.08.19;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.016 c
1-60733
bobr12
2002-08-07 10:12
2002.08.19
Как узнать имя компьютера на котором запущена программа?


4-60892
MARcoDEN
2002-06-13 21:15
2002.08.19
Проблема с хэндлом ListBox a чужого окна


1-60591
alex_dorin
2002-08-07 17:15
2002.08.19
как ограничть время выполнения DataSetProvider


4-60921
Starkom
2002-06-07 12:36
2002.08.19
Как отследить существует ли дочерний процесс в системе?


1-60631
Лысый
2002-08-08 19:01
2002.08.19
Настройки