Hallo Leute,
ich möchte zur Laufzeit eine (oder mehrer...) Remotendestopverbindung erzeugen.
Ich habe dazu unter "Verweise>COM" "Microsoft Terminal Services Active Client 1.0 Type Library" in das Projekt eingebunden. Wenn ich nun aber ein Objekt (AxMSTSCLib.AxMsTscAxNotSafeForScripting) erzeuge und Eigenschafften wie Passwort, Server und Nutzername zuweisen möchte gibt eine Exception:> Fehlermeldung:
Eine Ausnahme vom Typ "System.Windows.Forms.AxHost
+InvalidActiveXStateException" wurde ausgelöst.
Hier mal der Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MSTSCLib;
namespace ServerManager
{
class rdp
{
AxMSTSCLib.AxMsTscAxNotSafeForScripting r;
public rdp(string server, string user, string password)
{
r = new AxMSTSCLib.AxMsTscAxNotSafeForScripting();
r.Enabled = true;
r.Location = new System.Drawing.Point(0, 0);
r.Name = "rdp";
r.Size = new System.Drawing.Size(800, 600);
r.TabIndex = 0;
r.Visible = true;
r.Server = server; //An dieser Stelle wird die Exception ausgelöst
r.UserName = user;
IMsTscNonScriptable secured = (IMsTscNonScriptable)r.GetOcx();
secured.ClearTextPassword = password;
}
}
}
Wenn ich das MTSC Objekt über den Formdesigner funktioniert jedoch alles bestenz.
Hat jemand eine Idee was ich falsch mache?
Das erzeugt der Formdesigner übrigens:
this.rdp.Enabled = true;
this.rdp.Location = new System.Drawing.Point(0, 0);
this.rdp.Name = "rdp";
this.rdp.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("rdp.OcxState")));
this.rdp.Size = new System.Drawing.Size(800, 600);
this.rdp.TabIndex = 0;
this.rdp.Visible = false;
Mir ist nicht ganz klar was this.rdp.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("rdp.OcxState")));
macht...
Danke 😃
cin0s
Hallo cin0s,
Wenn ich das MTSC Objekt über den Formdesigner funktioniert jedoch alles bestenz.
dann braucht das MTSC Objekt vielleicht eine Nachrichtenschleifen, muss also in dem (bzw. in einem) GUI-Thread laufen, also in einem Thread der gerade Application.Run ausführt.
herbivore
Eigentlich habe ich an keiner stelle einen neuen Thread aufgerufen. Sollte also im GUI Thread laufen. Wenn ich direkt mit einem Button (also in der Form1.cs) den Code ausführen möchte geht es auch nicht...
Oder füg es zur Form hinzu, öffne die Form.Designer.cs Datei und guck was die anders macht als du
Hab ich ja schon gemacht. Hab ich auch im ersten Beitrag gepostet. Hier nochmal:
this.rdp.Enabled = true;
this.rdp.Location = new System.Drawing.Point(0, 0);
this.rdp.Name = "rdp";
this.rdp.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("rdp.OcxState")));
this.rdp.Size = new System.Drawing.Size(800, 600);
this.rdp.TabIndex = 0;
this.rdp.Visible = false;
Was mich verwundert ist wie gesagt this.rdp.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("rdp.OcxState")));
. Wenn ich das an eine andere Stelle auser dem vom Formdesigner generiertem Code kopiere (also in die Form1.cs oder in meine Klasse rdp.cs) wird das Object "resources" (logischerweise) nicht gefunden: > Fehlermeldung:
Der Name "resources" ist im aktuellen Kontext nicht vorhanden.
Ich glaube das mein Problem damit zusammenhängt...
Hallo cin0s,
schau dir (z.B. im Debugger) an, was resources.GetObject für ein Objekt liefert und welchen Zustand es hat.
herbivore
Hallo cin0s,
was hindert dich, so ein Objekt selbst zu erzeugen und zu zuweisen?
herbivore
Hab das gerade mal versucht.
public rdp(string server, string user, string password)
{
r = new AxMSTSCLib.AxMsTscAxNotSafeForScripting();
r.Enabled = true;
r.Location = new System.Drawing.Point(0, 0);
r.Name = "rdp";
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
r.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("rdp.OcxState")));
r.Size = new System.Drawing.Size(507, 353);
r.TabIndex = 0;
r.Visible = true;
r.Server = server;
r.UserName = user;
IMsTscNonScriptable secured = (IMsTscNonScriptable)r.GetOcx();
secured.ClearTextPassword = password;
}
In "r.OcxState" steht jetzt das gleiche wie wenn ich das ganze über den Formdesigner mache. Funtkionieren tut es leider immernoch nicht. Die gleiche Exception die ich ohne das auch bekommen...
Hallo cin0s,
dann wird es Zeit für [Tutorial] Vertrackte Fehler durch Vergleich von echtem Projekt mit minimalem Testprojekt finden.
herbivore
Hallo,
ich habe das Problem gefunden 😃 Bei Google hab ich diese Seite gefunden:
creating an activeX component at runtime
Im dritten Post wird erklärt was gemacht werden muss. Das ganze sieht dann so aus:
private void button1_Click(object sender, EventArgs e)
{
AxMSTSCLib.AxMsTscAxNotSafeForScripting r = new AxMSTSCLib.AxMsTscAxNotSafeForScripting();
r.BeginInit(); //Das kam hinzu
Controls.Add(r); //Das auch
r.Enabled = true;
r.Location = new System.Drawing.Point(0, 0);
r.Name = "rdp";
r.Size = new System.Drawing.Size(507, 353);
r.TabIndex = 0;
r.Visible = true;
r.Server = "server";
r.UserName = "user";
IMsTscNonScriptable secured = (IMsTscNonScriptable)r.GetOcx();
secured.ClearTextPassword = "passwort";
r.Connect();
r.EndInit(); //Und das hier auch noch...
}
Danke trotzdem für eure Hilfe 😃