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 COM Object freigeben (https://www.delphipraxis.net/164100-com-object-freigeben.html)

WizoHulk 28. Okt 2011 14:33

COM Object freigeben
 
Hallo,

Ich bin hier schon am verzweifeln und komme nicht weiter.

Ich habe einen ComServer der über die Anwendung1 mit
Delphi-Quellcode:
ole := createOLEObject('Application.updater');
erstellt bzw. gestartet wird, was auch so weit alle sganz gut klappt, aber ich möchte über die Anwendung2 die Instanz beenden.
Über die Anwendung2 greife ich auf die Instanz mit
Delphi-Quellcode:
getActiveOLEobject('Application.updater')
zu.
Mein Problem ist, wenn sie die erste Anwendung schließt, schließt sich die Instanz auch.
wie kann ich über die Zweite Anwendung das Object schließen?

WizoHulk 28. Okt 2011 16:29

AW: COM Object freigeben
 
Hat denn keiner eine Lösung?

WizoHulk 29. Okt 2011 10:34

AW: COM Object freigeben
 
*Push*

Bernhard Geyer 29. Okt 2011 10:43

AW: COM Object freigeben
 
Wie war das nochmal mit den 24 Stunden zwischen puschen:gruebel:

Stichworte wären hier der direkt aufruf der Release und AddRef Methoden um den Referenzcounter entsprechend zu beeinflussen.
Oder schauen ob das Marshallen von Interface-Pointer auch über Applikations-Grenzen möglich wäre.

Oder du schaust ob du nicht eine COM+-Applikation verwendest. Dort sind solche Anwendungsfälle mit "stehenbleibenden" COM-Server vorgesehen.

WizoHulk 30. Okt 2011 00:59

AW: COM Object freigeben
 
Oh entschuldige bitte, ich wusste nicht das ich 24h warten muss.


Zitat:

Oder du schaust ob du nicht eine COM+-Applikation verwendest. Dort sind solche Anwendungsfälle mit "stehenbleibenden" COM-Server vorgesehen.
Ich habe eine Application mit einen COM Server, oder meinst du was anderes?

Ich starte ja die COM + Application über eine andere Anwendung. jedoch schließt die Application, wenn die Anwendung beendet wird.

WizoHulk 15. Nov 2011 14:40

AW: COM Object freigeben
 
hallo

ich habe die Funktionen
Delphi-Quellcode:
AddRef
,
Delphi-Quellcode:
Release
und
Delphi-Quellcode:
QueryInterface
gefunden.
Nun leider kann ich diese nicht ausführen da ich immer eine fehlermeldung bekomme, das dies vom Objekt nicht unterstützt wird.

Muss ich das noch irgendwo einbinden?

shmia 15. Nov 2011 15:36

AW: COM Object freigeben
 
Wenn du verhindern willst, dass deine Serveranwendung beendet wird, dann kannst du das über das Event OnLastRelease verhindern:
Delphi-Quellcode:
procedure TMainForm.FormCreate(Sender: TObject);
begin
   // Wenn die Anwendung über COM hochgezogen wurde und der letzte Client die Verbindung
   // beendet dann Anwendung nicht beenden (wird in dem Event-Handler gesteuert).
   ComServer.OnLastRelease := Self.HandleComServerOnLastRelease;
...

procedure TMainForm.HandleComServerOnLastRelease(var Shutdown: Boolean);
begin
   // Anwendung weiter laufen lassen, wenn der letzte Client die Verbindung abbaut
   ShutDown := False;
end;

WizoHulk 18. Nov 2011 06:57

AW: COM Object freigeben
 
wo hast du diese Funktion her
Delphi-Quellcode:
Self.HandleComServerOnLastRelease;
muss mann da jetzt noch eine Unit einbinden?

DeddyH 18. Nov 2011 08:16

AW: COM Object freigeben
 
Die steht doch direkt unten drunter.

WizoHulk 18. Nov 2011 08:30

AW: COM Object freigeben
 
ja ich über geber der Procedure ein Parameter der nie benutzt wird?
und das versteh ich grad nicht so ganz.

DeddyH 18. Nov 2011 08:34

AW: COM Object freigeben
 
Das ist ein Var-Parameter, mit dem Du steuern kannst, wie sich das Objekt verhalten soll.

WizoHulk 18. Nov 2011 08:52

AW: COM Object freigeben
 
Die Funktion habe ich hin bekommen.

Aber wenn ich meine Application schließe dann wird mein COM server auch mit beendet.
Ich denke ich habe hier noch irgendwas vergessen.


falls es hilft hier mal mein Quellcode


Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
 try
   test := CreateOleObject('Application.Updater');
 except
   test := GetActiveOleObject('Application.Updater');
 end;

  test.FTP_Host     := FTPHost.Text;
  test.FTP_User     := FTPUser.Text;
  test.FTP_Passwort := FTPPasswort.Text;
  test.ClientName   := ClientName.Text;
  test.ClientVersion := ClientVersion.Text;

  test.ClientHandle := ClientHandle.Text;
  Test.StartServer;
  ComServer.OnLastRelease := self.HandleComServerOnLastRelease;


end;

DeddyH 18. Nov 2011 09:09

AW: COM Object freigeben
 
Was ist denn ComServer und was ist test?

WizoHulk 18. Nov 2011 09:22

AW: COM Object freigeben
 
ohh sorry...
Hab vergessen mit rein zulegen...

Delphi-Quellcode:
  test : OLEVariant;
ComServer ist aus der Uses ComServ
da ist die Funktion
Delphi-Quellcode:
OnLastRelease
deklariert.

DeddyH 18. Nov 2011 09:25

AW: COM Object freigeben
 
Was ich meinte: Du startest doch Test (das ist der COM-Server, der Dich interessiert). Wieso weist Du dann nicht auch Test den Eventhandler zu? Oder habe ich Dich falsch verstanden?

WizoHulk 18. Nov 2011 09:42

AW: COM Object freigeben
 
ich kann das Event nicht dem test zuweisen, bekomme dann eine Fehlermeldung, das dies vom Objekt nicht unterstützt wird.
Delphi-Quellcode:
b:= false;
test.OnLastRelease := self.HandleComServerOnLastRelease(b);

DeddyH 18. Nov 2011 09:49

AW: COM Object freigeben
 
Und so?
Delphi-Quellcode:
test.OnLastRelease := self.HandleComServerOnLastRelease;

WizoHulk 18. Nov 2011 09:54

AW: COM Object freigeben
 
ne.
Fehlermeldung : Parameter erwartet.

shmia 18. Nov 2011 10:25

AW: COM Object freigeben
 
ComServer ist ein globales Objekt der VCL, genauso wie z.B. Application und Screen.
Und natürlich muss mein vorgeschlagener Code im Server und nicht im Client platziert werden!

WizoHulk 18. Nov 2011 10:34

AW: COM Object freigeben
 
ja das habe ich grad gemerkt, danke für eure Hilfe


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:59 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