Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#9

AW: COM Out of Process Server mit einem oder keinem Client

  Alt 9. Mai 2017, 21:01
Keine Ahnung, ob ich jetzt Blödsinn schreibe, versuche es trotzdem mal:

In Unit2 wird in initialization was gemacht, das, so wie ich das verstehe, für den Server, der als Server arbeiten soll, wesentlich ist.

Wäre es irgendwie möglich, dann, wenn der Server "nur als normales Programm" laufen soll, diesen Teil nicht auszuführen?

Bin da jetzt erstmal ganz naiv:
Delphi-Quellcode:
initialization
  if ParamCount = 0 then begin
    TAutoObjectFactory.Create(ComServer, TTestClass, Class_TestClass,
      ciSingleInstance, tmSingle);
  end;
end.
Das könnte dann gehen, wenn man den Server nur als Programm nutzen will, immer mit irgendeinem Parameter aufruft.

Weitere Alternative, wenn auch unelegant.
Es gibt von der Exe zwei Versionen, die sich nur durch den Namen unterscheiden.

Also nach dem Kompilieren wird halt eine Kopie der EXE erstellet.

Wir hätten dann z. B.

copy Server.exe Anwender.exe

In Unit2 fragen wir dann den Dateinamen ab:
Delphi-Quellcode:
initialization
  if ParamStr(0) = 'Server.exethen begin
    TAutoObjectFactory.Create(ComServer, TTestClass, Class_TestClass,
      ciSingleInstance, tmSingle);
  end;
end.
Keine Ahnung, welcher administrative Aufwand dann entsteht, um sicherzustellen, dass die Anwender dann nicht mehr Server.exe starten, sondern Anwender.exe.

Gebe ja zu: Elegant sind diese Vorschläge gewiss nicht.

Unit2 wird ja nur in Server.dpr eingebunden.

Die über einen Kompilerschalter einbinden.
Delphi-Quellcode:
{$DEFINE ComServer}
program Server;

uses
  Vcl.Forms,
  Unit1 in 'Unit1.pas{Form1},
  Project1_TLB in 'Project1_TLB.pas',
{$IFDEF ComServer}
  Unit2 in 'Unit2.pas{TestClass: CoClass};
{$ENDIF}

{$R *.TLB}

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Durch Nutzung des Compilerschalters bekommt man zwei gleichnamige Exen, bei denen man dann aber sicherstellen muss, dass der Anwender nicht die falsche aufruft. Sie müssten also zumindest an unterschiedlichen Stellen liegen. Und wenn dann beide im Suchpfad liegen, gewinnt die, die zuerst gefunden wird. Auch äußerst unelegant.

Ok, irgendwie ist da alles nicht so das Wahre, aber vielleicht hilft es ja so als Idee für 'ne vernünftige Lösung.
  Mit Zitat antworten Zitat