Interface'y COM galimatias

0

Witam. Mimo poszukiwań w sieci muszę się zwrócić z prośba o pomoc. Muszę się dobrać do interface'u pewnego programu, który udostępnia obiekty COM. Wygenerowałem plik o nazwie fvW_TLB.pas i udało mi się połączyć z serwerem i wyświetlić ikony na mapie. Problem polega na tym jak zaimplementować (a właściwie "przykryć") procedury i funkcje zawarte w ICallback. kawałek kodu
Sekcja uses:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, fvw_TLB, ComObj, StdCtrls, ExtCtrls, Mask, Sockets,
IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer, IdSocketHandle, Math, Buttons,
ComCtrls;
Zmienne:
Var
MyLayer: fvw_TLB.Layer;
aVar: OleVariant;
LayerHandle: Integer;
IconHandle: Integer;

No i kawałek kodu:
begin
aVar := CreateComObject(fvw_TLB.CLASS_Layer) as IDispatch;
MyLayer := fvw_TLB.CoLayer.Create;
MyLayer.RegisterWithMapServer('Falcon Data Feed',Self.Handle,aVar);
LayerHandle := MyLayer.CreateLayer('Falcon Data Feed');

Jak teraz np. jak zaimplementować taką procedurkę:
ICallback = interface(IDispatch)
['{8D8FF1EB-C50D-473F-B223-757BE2280F5D}']
procedure GetHelpText(layer_handle: Integer; object_handle: Integer; var help_text: WideString); safecall;
...itd
Jest jeszcze coś takiego:
ICallbackDisp = dispinterface
['{8D8FF1EB-C50D-473F-B223-757BE2280F5D}']

Im więcej czytam o tych COM -owych rozwiązaniach tym bardziej się zniechęcam. Może jakaś strona z konkretnymi przykładami?

0

Tworzysz swoją klasę i dziedziczysz po TInterfacedObject:

TMyCallbackHandler = class(TInterfacedObject, ICallback)
//GUID(ctrl + shift + G) - ale chyba nie jest konieczny.
//implementacja metod
end;
0

Zrobiłem tak jak podałeś.
Przy deklarowaniu metod dostaję komunikat "[Error] FBMS.pas(18): Unsatisfied forward or external declaration: 'TMyCallbackHandler.GetHelpText'"
A kod klasy:
type

TMyCallbackHandler = class(TInterfacedObject, ICallback)
public
procedure GetHelpText(layer_handle: Integer; object_handle: Integer; var help_text: WideString); safecall;
function GetIDsOfNames(const IID: TGUID; Names: Pointer; NameCount: Integer; LocaleID: Integer; DispIDs: Pointer): HRESULT; stdcall;

.....
//Tu inne metody
procedure OnToolbarButtonPressed(toolbar_id: Integer;
button_number: Integer); safecall;
procedure SetCurrentViewTime(layer_handle: Integer; date: TDateTime); safecall;
end;
Będę wdzięczny za podpowiedź o co chodzi bo z obiektami COM, interface'ami itp. stykam się po raz pierwszy

0

No tak. i teraz musisz te metody jeszcze zaimplementować. Najeżdżasz na metodę i dajesz Ctrl + Shift + C i IDE Ci generuje implementacje tych metod. Uzupełniasz je, tworzysz obiekt i ustawiasz go jako listener w komponencie.

0

Dzięki serdeczne. Chyba się sam przez te poszukiwania w sieci rozwiązania zapętliłem. Oczywiście wiem, że po deklaracji trzeba jeszcze metodę zaimplementować... Ale dzięki Tobie nie tylko rozwiązałem problem, ale i poznałem nowy skrot klawiszowy ;-)
Jeszcze raz dzięki

0

No super. Myślałem, że już po sprawie kiedy zaczął się program kompilować. Ale niestety nie ma komunikacji między programem - serwerem a moim klientem. Zasugerowałem się tym, że wcześniej to robiłem w VB i wystarczyło w procedurę wpisać co ma się dziać np. po najechaniu myszką na ikonę (powinien się pojawić tool_tip czyli "dymek").
Teraz tworzę obiekt klasy TMyCallbackHandler:
FCallBack := TMyCallbackHandler.Create;
gdzie FCallBack jest
FCallback: TMyCallbackHandler; w sekcji private

następnie w odpowiedniej metodzie wpisuję treść np.
procedure TMyCallbackHandler.GetToolTip(layer_handle,
object_handle: Integer; var tool_tip: WideString);
begin
if object_handle := IconHandle then
tool_tip := 'jakis text';
end;
Co dalej?

0

Ale musisz jeszcze ten TMyCallbackHandler ustawić dla komponentu jako listener zdarzeń. Poza tym FCallBack powinien być typu interfejsowego - ICallback, bo używasz licznika referencji.

0

Domyślam się że musisz poinformować tego COM'a że chcesz tych callback'ów.

0

Tak, próbowałem gadać z serwerem, ale mnie nie rozumie i to z wzajemnością :-) Technologia COM jak już wspomniałem jest mi obca. Generalnie do serwera mogę wysyłać co chcę, stawiać ikony na mapie, przesuwać je (w ten sposób oznaczam pozycje urządzeń wysyłających dane ze współrzędnymi geograficznymi). Problem pojawia się przy komunikacji w drugą stronę gdy np. chcę umożliwić użytkownikowi skasowanie ikonki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1