Piszę aplikację, która ma obsługiwać pluginy (a zdecydowałem sie na COM). Problem tkwi w tym, że każdy z pluginów ma tworzyć swoją ramkę, która zakotwiczona będzie jako/w TabSheet w PageControlu głównej aplikacji. No i nie wiem jak 'zahaczyć' tę tworzoną przez DLLa ramkę. Ogólnie mówiąc, jedyne co musi zrobić moja aplikacja główna to wywołać w pluginie coś w rodzaju konstruktora ramki o prototypie, dajmy na to:
constructor Create(const AOwner : TComponent, const Parent : TWinControl);
. AOwner jest mi potrzebny do wywołania 'oryginalnego' konstruktora ramki, a Parent, aby przypisać go do NowaRamka.Parent (w tym przypadku parentem będzie wskaźnik do TTabSheet, który powinna przekazać bibliotece moja główna aplikacja).
No i to jest właśnie problem, gdyż używam interfejsów oraz biblioteki typu i nijak nie wiem jak zdefiniować taki konstruktor/funkcję w tejże bibliotece. Oczywiście sam konstruktor mogę dowolnie zmieniać - chodzi mi tylko o to, żeby w jakiś sposób przekazać przez COM odpowiednie wskaźniki. W IDLu oczywiście nie ma czegoś takiego jak TWinControl. Jak w takim razie mam przekazać do pluginu obiekty typu TComponent i TWinControl?
Ew. (i to chyba będzie elegantsze rozwiązanie) <font size="3">jak przesłać do głównej aplikacji uchwyt tej nowoutworzonej ramki, aby ona sama(aplikacja) zatroszczyła się o odpowiednie jej umiejscowienie?</span> (czyli znów... jak przesłać HWND przez COM no i czy potem mógłbym go zrzutować na TFrame)
np. próbowałem wariant z :
wpis w .tlb - interfejs pluginu:
HRESULT _stdcall CreateFrame([in] IArchApp * AppInterface, [in] VARIANT AOwner, [in] VARIANT Parent);/*IArchApp sluzy do celow 'callbackowych'*/
jednak i tak nie wiem jak poprawnie zrzutować Varianta na wymagne typy (poza tym obawiam się, że w ten sposób stracę wszystkie zalety (D)COMa, jak chociażby możliwość wywołania dll-a z innej maszyny /wskaźniki w takim przypadku stracą swoją użyteczność?/)
Oczywiście mógłbym zrezygnować z całego COMa albo tylko z bibliotek typu (i samodzielnie napisać plik z interfejsami - w Delphi, nie przejmując się IDLem i jego ograniczeniami), jednak wierzę że da się to w jakiś łatwy sposób obejść.
Miałem też przez moment masochistyczny pomysł i chciałem udostępnić interfejs pozwalający na ręczne tworzenie komponentów wizualnych w głównej aplikacji. Teoretycznie miałoby to chyba szansę działać, jednak znakomicie skomplikowałoby cały kod (prawie WinApi ;) ). Ew. mógłbym wysyłać jakieś komunikaty, jednak w takim razie tracę całą wygodę związaną z interfejsami.
Z góry dziękuję za wszelką pomoc,