Gibt es einen Möglichkeit auf eine DLL-Funktion von innerhalb einer Funktion zuzugreifen? Eine andere Chance habe ich nicht.
Das hier lässt sich nicht innerhalb einer Funktion deklarieren.
[DllImport("user32")]
private static extern bool SetForegroundWindow(IntPtr hwnd);
PS: Der Schleier ist so penetrant, dass er sic sogar über externe Anwendungen (Excel) legt. Wenn ich Excel über das Makro öffne, legt sich der Schleier auch darüber....
LG
Sorry erledigt,
die Klammern waren falsch gesetzt!
Mit:
object[] aa=(object []) value;
geht es!!!
Danke!
Hallo,
ich habe es aufmerksam gelesen. Ich bin jetzt aber nicht sicher wie und zu was ich es casten soll (Und wie man ein array castet).
object[] aa = (object)[] value;
ging nicht.
Oder gar
string[] aa = (string)[] value;
Bitte nochmal eine kleine Hilfe.
LG
Hi,
ich benötige noch mal einen Tipp:
In der Rückgabe "memberof" kommt ein Feld zurück, dass ich durchlaufen muss.
also :
object field = oRS.InvokeMember("Fields", bfGetProperty, null, objRS, new Object[] { "memberof" } );
object value = field.GetType().InvokeMember("Value", bfGetProperty, null, field, null);
value ist nun vom Typ System.Object[] !
Ich kann es aber mit
value.Length oder value[0]
(z.B. object ab= value[0]; )
nicht ansprechen, das führt zu einem Fehler...
Wie komme ich an das Feld/Array ?!
LG
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} );
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!!
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
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
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 );
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.