Announcement

Collapse
No announcement yet.

variable Verwendung von DCOM?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • variable Verwendung von DCOM?

    Hallo

    Ich habe folgendes vor:
    Auf einem PC sind mehrere DCOM-Server von uns installiert.
    Mein Programm soll jetzt Befehle aus einer Datenbank auslesen (DCOM-Server Name, Befehl, Parameter), dann den DCOM-Server starten, den Befehl ausführen, das Ergebnis zurück in die Datenbank schreiben, und dann den DCOM-Server wieder beenden.
    Mein Programm soll nicht auf spezielle DCOM-Server ausgelegt sein, sondern wirklich variabel sein. Einfach das ausführen, was übergeben wird.

    Geht das? Wäre nämlich unheimlich praktisch!
    Bitte helft mir - ich weiss garnicht genau, nach was ich suchen muss. Ich will praktisch folgendes:
    Code:
    string DCOMServer;
    string FunctionName;
    Variant DCOMResult;
    DCOMServer = "Irgendwas, wird normal übergeben";
    FunctionName = "HelloWorld";
    
    Object myObject = new DCOMObject.ByName(DCOMServer);
    DCOMResult = myObject.FunctionByName(FunctionName);
    Gruß David

  • #2
    Hallo,

    Geht das?
    ja - solange nur die späte Bindung über das Dispatch-Interface verwendet wird. Das aufrufende Programm "fragt" über IDispatch.GetIDsOfNames beim aufgerufenen Objekt nach, welcher Token-Wert (DispID) für einen als Zeichenkette übergebenen Eigenschafts- oder Methodensnamen gültig ist. Liegt der numerische Wert des Tokens vor, kann das Programm die gewünschte Eigenschaft oder Funktion über den Aufruf von IDispatch.Invoke ansprechen.

    Die Scriptsprachen (wie VBScript) gehen zum Beispiel den Weg über das Dispatch-Interface.

    Wäre nämlich unheimlich praktisch!
    Das glaube ich nicht ;-)

    Was am Anfang so "verlockend einfach" aussieht, wird in der Realität zu einer Implementierungs-Orgie. Denn nur für den Endanwender (wie im Fall von VBScript) ist es "einfach", für den zuständigen Entwickler wird so etwas sehr schnell zum Albtraum, wenn die Methode mit Parametern der einschlägen Datentypen aufgerufen werden soll.

    Das folgende Beispiel liefert einen Ausgangspunkt: Da .NET für Automation-Server (die das Dispatch-Interface unterstützen) bereits eine Interop-Implementierung mitbringt, kann die Methode InvokeMember genutzt werden, um die aufzurufende Methode als Zeichenkette zu definieren.

    Angenommen, ein Automation-Server implementiert das folgende Interface:

    Code:
      ID7AutoLocalServerObj = interface(IDispatch)
        ['{29D1FF35-5089-4DE8-BD8D-B749C4D2A82F}']
        function DoWork(const sInput: WideString): WideString; safecall;
        function Get_MachineName: WideString; safecall;
        procedure Set_MachineName(const Value: WideString); safecall;
        property MachineName: WideString read Get_MachineName write Set_MachineName;
      end;
    Der Zugriff über C# sieht dann so aus:

    Code:
    private object aSrv;
    private Type aCOMType;
    
    private void Form1_Load(object sender, System.EventArgs e)
    {
    	aCOMType = Type.GetTypeFromProgID("D7AutoLocalServer.D7AutoLocalServerObj");
    	aSrv = Activator.CreateInstance(aCOMType); 
    }
    
    private void button1_Click(object sender, System.EventArgs e)
    {
    	object[] aParam = new object[1];
    	aParam[0] = "Neu";
    	aCOMType.InvokeMember("MachineName", BindingFlags.SetProperty,
    null, aSrv, aParam);
    }
    
    private void button2_Click(object sender, System.EventArgs e)
    {
    	object[] aParam = new object[1];
    	aParam[0] = textBox1.Text;
    	string sResult = (string)aCOMType.InvokeMember("DoWork", 
    BindingFlags.InvokeMethod, null, aSrv, aParam);
    	statusBar1.Text = sResult; 
    }
    Zuletzt editiert von Andreas Kosch; 31.05.2008, 09:45.

    Comment


    • #3
      Hallo
      Vielen Dank für die ausführliche Antwort! Ich denke das ist ganz genau das, und sogar mit Beispiel, was ich gesucht habe!

      Wenn die Parameter jetzt unterschiedliche Typen haben, also z.B. "int, int, string, bool", wie mache ich das dann? Ich bin gerade nicht im Geschäft und zu Hause habe ich nicht die Mittel, das auszuprobieren.
      Kann ich ein Variant-Array machen, oder kann ich alle Parameter als String übergeben?

      Danke,
      David

      Comment

      Working...
      X