Laden...
B
Bytechanger
myCSharp.de - Member
2
Themen
11
Beiträge
Letzte Aktivität
vor 9 Tagen
Dabei seit
04.04.2025
Erstellt vor 9 Tagen

Jepp,

vielen Dank, das war die Hilfe, die mir fehlte!

Super, das funktioniert!! D A N K E!

Jetzt zu meinem zweiten Problem, Properties für "Page Size".

Das hier gibt keine Fehlermeldung. 
Ist das so korrekt umgesetzt?

oCommand.InvokeMember("Properties", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.SetProperty, null, oCommandInst, new object[]{"Page Size", 100} );
Erstellt vor 9 Tagen

Entschuldige,

leider habe ich es nicht verstanden oder wir reden aneinander vorbei.

Ich möchte die Ergebnisse des RecordSet einlesen.

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"});

funktioniert nicht, da SetField und GetField offenbar nicht bei COM funktionieren (Fehlermeldung: Für ein COM-Objekt muss die eigenschaft "Set", "Get" oder ein Methodenaufruf angegeben werden. Parametername: bindingFlags.).

Ich stehe gerade hier:

object objRS = oCommand.InvokeMember("Execute", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.SetProperty, null, oCommandInst, null );
    if((object)objRS==null) { System.Windows.Forms.MessageBox.Show("keine Treffer"); return; }

objRS sollte das RecordSet mit dem Ergebnis beinhalten, dass sich in vba über objRS .Fields("cn").value oder objRS ("cn").value abrufen lassen sollte, wobei "cn" der Spaltenname ist (SELECT cn,extensionAttribute3 FROM 'LDAP://test.de' WHERE ... ).

Alle meine Versuche auf die Spalten im objRS zurückzugreifen schlugen nun fehl. Da wäre ich für Hilfe sehr dankbar!!

Erstellt vor 9 Tagen

Super Danke,

das hatte ich auch schon probiert:

object oo=oRS.InvokeMember("Fields",  System.Reflection.BindingFlags.GetProperty, null, objRS, null );
System.Type oFlds = oo.GetType();
object fd=oFlds.InvokeMember("samaccountname",  System.Reflection.BindingFlags.GetProperty, null, oo, null );

Allerdings kommt beim .InvokeMember("samaccountname"  der Fehler "Unbekannter Name", so dass ich davon ausgehe, dass das oo.GetType ggf nicht richtig funktioniert?!

Also mache ich hier irgendwas falsch?!

LG

Erstellt vor 9 Tagen

Danke,

das könnte ich zum Setzen des .Properties["Page Size"] nutzen, allerdings müsste ich dann die Position wissen in Properties, korrekt?

oCommand.InvokeMember("Properties", System.Reflection.BindingFlags.SetField, null, oCommandInst, new object[]{ "Page Size", 100});

Führt zu einem Fehler:

Für ein COM-Objekt muss die eigenschaft "Set", "Get" oder ein Methodenaufruf angegeben werden. Parametername: bindingFlags.

Mein größtes aktuelles Problem ist, dass ich auf das Ergebnis meiner Abfrage nicht komme.

Ich kann zwar das Recordset ansprechen und bekomme auch das Fields Objekt, kann aber nicht auf die Inhalte zugreifen oder weis nicht, wie ich das machen soll.

Der Aufbau der Struktur ist ja:

   ErgebnisRecordSet.Fields.Items[0].Value

oder

   ErgebnisRecordSet.Fields["name der spalte"].value

Irgendwie muss ich ja an die Daten herankommen. Da stehe ich aktuell auf dem Schlauch und benötige Hilfe.

LG

Erstellt vor 11 Tagen

Hallo,

ich bin ein großes Stück weiter gekommen. Ich stehe aktuell nur noch vor 2 Problemen.

Im Ergebnis RecordSet sind die Daten im rs.Fields Feld. Wie kann ich darauf zugreifen?
Mit InvokeMember bekomme ich das Feld an sich, komme aber nicht auf die einzelnen Einträge im Feld???

Ich muss noch die Page Size in Properties setzen. Bisher kann ich über InvokeMember nur einzelne Properties setzen. Wie ändere ich im Object das Property "Page Size" ??
Ich könnte mir das aktuelle Feld Properties ziehen und dann den Eintrag Page Size anpassen und das Feld wieder zurückschreiben, was mich aber zu Problem 1 führt, wie ich auf einzelne Feldwerte zugreife?

Wäre für Hilfe sehr dankbar.

LG

  System.Type oConnection = System.Type.GetTypeFromProgID("ADODB.Connection");
    System.Type oCommand 	= System.Type.GetTypeFromProgID("ADODB.Command");
    System.Type oRS = System.Type.GetTypeFromProgID("ADODB.Recordset");
        
    object oConnectionInst = System.Activator.CreateInstance(oConnection);
    object oCommandInst = System.Activator.CreateInstance(oCommand);
    
    
    oConnection.InvokeMember("Open", System.Reflection.BindingFlags.SetProperty, null, oConnectionInst, new object[1] {"Provider=ADsDSOObject;"});
    object[] args= new object[] { oConnectionInst };
    
    try { oCommand.InvokeMember("ActiveConnection", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.SetProperty, null, oCommandInst, args); }
    catch (Exception ex) { System.Windows.Forms.MessageBox.Show("1"+ex.Message); }
    
    string cmdText="SELECT cn,extensionAttribute3 FROM 'LDAP://test.de' WHERE objectClass='user' and objectCategory='person' and samaccountname = '12345678'";
    
    try {oCommand.InvokeMember("CommandText", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.SetProperty, null, oCommandInst, new object[1]{cmdText} );}
    catch (Exception ex) { System.Windows.Forms.MessageBox.Show(ex.Message); }
    /*
    //.Properties["Page Size"]=100;  <<-- Wie setzt man das??
    try {oCommand.InvokeMember("Properties", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.SetProperty, null, oCommandInst, new object[1]{"100"} );}
    catch (Exception ex) { System.Windows.Forms.MessageBox.Show(ex.Message); }
    */
    object objRS = oCommand.InvokeMember("Execute", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.SetProperty, null, oCommandInst, null );
    if((object)objRS==null) { System.Windows.Forms.MessageBox.Show("keine Treffer"); return; }
    
    
    object rEOF=oRS.InvokeMember("EOF", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.GetProperty, null, objRS, null );
    object rBOF=oRS.InvokeMember("bof", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.GetProperty, null, objRS, null );
    bool bEOF=(bool) rEOF;
    bool bBOF=(bool) rBOF;

    while(!bEOF && !bBOF)
    {
        System.Windows.Forms.MessageBox.Show("1"); 
        object oo=oRS.InvokeMember("Fields", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.GetProperty, null, objRS, null );

//------ Benötige Fields["cn"] -----------------------------------------


        //--- nächster Eintrag ----------
        oRS.InvokeMember("movenext", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.SetProperty, null, objRS, null );
        rEOF=oRS.InvokeMember("EOF", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.GetProperty, null, objRS, null );
        rBOF=oRS.InvokeMember("bof", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.GetProperty, null, objRS, null );
        bEOF=(bool) rEOF;
        bBOF=(bool) rBOF;
    }
    
    oConnection.InvokeMember("Close", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.SetProperty, null, oConnectionInst, null );
    
Erstellt vor 20 Tagen

Danke.

So habe ich es aktuell gelöst.

Das Hauptprogramm legt einen dunklen „Schleier“ über das Programm beim ausführen der Makros, damit der Benutzer nicht mit der Maus dazwischen klickt. Das verhindert aber auch die Kommunikation mit dem Benutzer, da die Forms auch hinter diesem Schleier verschwinden. Ich setzte im Sekunden Intervall die BringToFront Funktion. Das funktioniert meistens, manchmal halt nicht. Und das Fenster sollte sich vor andere Fenster anderer Programme.

Von früher machte ich die SetWindowPos, SetForegroundWindow wusste aber nicht, dass die aus Sicherheitsgründen nicht mehr geht.

Erstellt vor 22 Tagen

Hallo,

ich entwickle ein Makro innerhalb einer bestehenden Anwendung.

Die Einschränkungen sind, dass ich mich innerhalb einer Funktion bewege.

Daher wäre ein DLL-Import, so wie ich ihn kenne nicht möglich, da er nach meinem Wissen immer außerhalb einer Funktion passieren muss?!

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

Mit "Funktionen" innerhalb einer Funktion behelfe ich mir mit anonymen Lamda ausdrücken:

Func<bool,bool> Test = (dummy) ⇒

{ .. hier die Funktion .. };

Hat jemand eine Idee oder gibt es eine Möglichkeit auf dies API-Funktion zuzugreifen oder gibt es eine Alternative?
Das Fenster soll IMMER im Vordergrund und über ALLE ANDEREN Fenster stehen...

LG

Byte

Erstellt vor 22 Tagen

Ok, ich hatte mich schon mal versucht:

System.Type oConnection = System.Type.GetTypeFromProgID("ADODB.Connection");  
System.Type oCommand    = System.Type.GetTypeFromProgID("ADODB.Command");  

object oConnectionInst = System.Activator.CreateInstance(oConnection);  
object oCommandInst    = System.Activator.CreateInstance(oCommand);  

oConnection.InvokeMember("Open", System.Reflection.BindingFlags.SetProperty, null, oConnectionInst, new object\[1\] {"Provider=ADsDSOObject;"});  
object[] args= new object[] { oConnection };

Allerdings stoße ich schon recht früh auf einen Fehler, da diese Funktion dann schon einen Fehler wirft:

oCommand.InvokeMember("ActiveConnection", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.SetProperty, null, oCommandInst, args);

Erstellt vor 22 Tagen

Leider nein. Wie gesagt, try and error.

Ich muss auch über den gesamten Namespace zugreifen, da ein "using" innerhalb einer Funktion nicht möglich ist.

Auf der selben Maschine funktioniert ein Zugriff über VBA über

Set adoCommand = CreateObject("ADODB.Command")
Set adoConnection = CreateObject("ADODB.Connection")

Das gibt es in C# nicht, oder gibt es ein Äquivalent?

Erstellt vor 22 Tagen

Hallo,

leider gibt es keine Möglichkeit weitere DLL einzubinden. Ich habe da auch keinen Ansprechpartner und bin da etwas auf mich gestellt. Zu allem Überfluss werden Fehler im Makro nur mit einer allgemeinen Fehlermeldung quittiert, so dass immer nur try und error gearbeitet werden kann.

In den Beispielen wird, wie ich bisher auch immer in VB genutzt habe, mit GetObject("LDAP://RootDSE") und CreateObject("ADODB.Command") gearbeitet.

Kann ich diese Verfahrensweise auf C# adaptieren?

also stark vereinfacht auf diese Weise...

Set adoCommand = CreateObject("ADODB.Command")
Set adoConnection = CreateObject("ADODB.Connection")
adoConnection.Provider = "ADsDSOObject"
adoConnection.Open ...

??

Greets

Byte