Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi ActiveX - Non blocking calls (https://www.delphipraxis.net/11807-activex-non-blocking-calls.html)

Karl-Heinz 14. Nov 2003 08:37


ActiveX - Non blocking calls
 
Hallo,
ich möchte mir einen ActiveX-Server schreiben, der zu einem gegebenen Thema eine Hilfe in einem Fenster anzeigt. Das Problem ist nur, dass das aufrufende Programm dann einfriert (wartet, bis ActiveX-Server zurückkommt).
Gibt es einen Trick direkt per ActiveX, den Client vollständig "weiterleben" zu lassen, ohne Clientcode ändern zu müssen?

Oder muss ich im ActiveX-Server womöglich eine eigene Threadverwaltung bauen?

Danke und beste Grüsse,

Bernd Ua 14. Nov 2003 09:01

Re: ActiveX - Non blocking calls
 
Hi,

Zitat:

Gibt es einen Trick direkt per ActiveX, den Client vollständig "weiterleben" zu lassen, ohne Clientcode ändern zu müssen?
Oder muss ich im ActiveX-Server womöglich eine eigene Threadverwaltung bauen?
Threads wären natürlich die beste Wahl, aber schneller bzw einfacher gehts vielleicht mit einem
asynchronen PostMessage an das Anzeigefenster.

Code:
const
  CM_MyMsg = WM_User + 4000;

type
  TForm1 = class(TForm)
  private
    procedure MyMsg (var Message : TMessage); message CM_MYMsg;
  public
    { Public-Deklarationen }
  end;
...

procedure TForm1.MyMsg(var Message: TMessage);
begin
  Message.Result := 0;
  Show;
end;
Aufruf könnte dann so aussehen

Code:
procedure ActiveXServerdings.ShowHelpWnd;
begin
  with TForm1.Create(nil) do
    PostMessage(Handle,CM_MYMsg,0,0);
end;

Grüsse Bernd

Karl-Heinz 14. Nov 2003 09:21

Re: ActiveX - Non blocking calls
 
Hallo Bernd,
der Fehler lag woanders. Trotzdem danke für Deine schnelle Antwort, die aber so nicht funktioniert:

procedure XServerDings.showhelp(helpidx: longint); // egal
begin
with helpwnd.create(nil) do // oder application oder was auch immer
begin
findhelp(helpidx);
show; // Non-blocking, aber ActiveServer ist gleich wieder weg, Fenster flackert nur kurz auf...
end;
end; //

Der Fehler war, dass ich Depp im Clientprogramm die Olevariable lokal gemacht habe. Wenn raus aus der lokalen Methode (hier: Button1.onclick(..), dann wird natürlich auch die Variable zerstört.
Solche Dummheiten kosten Stunden unseres Programmiererlebens :-;

ok, hier isser nun raus, Client lebt weiter, aber das "Hilfe"-Fenster aus ActiveX-Server flackert
nur kurz auf und verschwindet dann wieder. Ich nehme an, dass die ActiveX-Application keine "Lebensdauer" hat. Kenne mich aber mit ActiveX zuwenig aus.

Der Aufruf aus Client läuft etwa so:
var
v: variant;
begin
v:= CreateOleObject(pchar('adelphi.meinprog'));
v.showhelp(1);
// nein, v wird nicht "unassigned" und sollte eigentlich weiterleben...
end; // raus und ... tot!


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:33 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz