Laden...
Avatar #avatar-3121.jpg
lukasS myCSharp.de - Member
Softwareentwickler Herne Dabei seit 14.04.2009 65 Beiträge
Benutzerbeschreibung

Forenbeiträge von lukasS Ingesamt 65 Beiträge

17.07.2017 - 16:00 Uhr

Habe die Antwort selber gefunden:

Field fld = rel.CreateField(sPrimaryTable_Field);

anstatt

fld.Name = sPrimaryTable_Field;
17.07.2017 - 15:51 Uhr

Hallo,

ich habe mit C# eine Access-DB erzeugt und möchte nun Beziehungen zu den einzelnen Tabellen herstellen. Leider kriege ich einen Absturz in der Zeile "rel.Fields.Append(fld);" mit der Meldung "Das Objekt ist ungültig, oder es ist nicht mehr festgelegt". Meine Internetsuche ergab leider keinen Erfolg.
Ist vielleicht die Datenbank (CurrentDB) nicht richtig da/verbunden?

Das ist übrigends der selbe Code, wie ich den auch in VBA habe, dort läuft es, mit C# aber nicht.


            MOIA.ApplicationClass oAccess = new MOIA.ApplicationClass();
            oAccess.OpenCurrentDatabase(_sOutputFilePath, true);
            Database db =  oAccess.CurrentDb();
            for(int i = 0; i <  db.TableDefs.Count; i++)
            {
               TableDef tblDef = db.TableDefs[i];
               string sTableName = tblDef.Name;

               string sPrimaryTableName = "eObj_Object";
               string sForeignTable_Field = "eObj_Object_ID";
               string sPrimaryTable_Field = "ID";


               Relation rel = db.CreateRelation(sPrimaryTableName + sTableName, sPrimaryTableName, sTableName, RelationAttributeEnum.dbRelationDeleteCascade);
               Field fld = new FieldClass();
               fld.Name = sPrimaryTable_Field;
               fld.ForeignName = sForeignTable_Field;
               rel.Fields.Append(fld); //------------> Exception!!! <-------------------

               db.Relations.Append(rel);

               fld = null;
               rel = null;

            }
            db.Close();
            db = null;

Hat vielleicht jemand eine Idee, woran es liegen könnte?

Danke und Gruß

Lukas

30.01.2017 - 13:43 Uhr

Im Zusammenspiel VBA und C# solltest Du Dich auch mit dynamic befassen.
Das ist das Equivalent zu Variant in C# - kurz gesagt ist das ein object, wo erst zur Laufzeit dynamisch geschaut wird, ob es eine Property oder eine Methode für das objekt gibt.
Das kann hilfreich sein, wenn man nicht immer wieder Casten will. Gerade bei VBA findet man die Methoden schneller als die Typen.

Vielen Dank für den Tipp. Ich werde es mir auf jeden Fall anschauen.
Ich bin heute sogar auf das dynamic gestoßen, als ich nachgeschaut habe, ob man ein var als Rückgabewert von einer Funktion nehmen kann.

Falls es jemanden interessiert: Dynamic vs. Var vs. Object

30.01.2017 - 12:24 Uhr

Also ich habe es geschafft. Es war noch ein Fehler in meinem C#-Bereich, den ich immer wieder übersehen habe. Dank des Wortes CType, auch wenn der direkt nichts damit zu tun hat 😃 , habe ich den entdeckt.

Ich arbeite im C#-Teil mit object[,] und gebe das Array einfach als Rückgabewert zurück. Im VBA wird das als Variant genommen, ohne CVar, CDate etc.

Das Variant-Array wird dann direkt in ein Objekt vom Typ "Name" (curRangeName.RefersToRange) übergeben und es stehen alle Werte korrekt drin.

Danke!

Lukas

30.01.2017 - 10:24 Uhr

Wieso nimmst du nicht ein var statt einem object[]?
Ist nicht unbedingt ganz sauber, aber müsste eigentlich gehen.

Kann man überhaupt ein var zurückgeben? Bin zwar kein Freund von var oder object, dennoch würde mich das interessieren.

Meine Notlösund wäre halt erst abzufragen, welcher Typ als nächstes kommt und dann getStringArray, getIntArray etc. aus dem VBA aufzurufen. Dennoch, wie ist das wenn ich nur eine Funktion haben möchte?

30.01.2017 - 10:09 Uhr

Hi,

ich hatte schon öfter Probleme mit 32- und 64-Bit-Versionen. Ich muss einmal als x86 und einmal als 64-Bit kompilieren und dann die DLLs/TLBs dementsprechend registrieren.

32 Bit - Office
C:\Windows\Microsoft.NET\Framework\v2.0.50727\regasm "PFAD\Datei-32.dll“ /tlb:"PFAD/Datei-32.tlb“ /codebase
C:\Windows\Microsoft.NET\Framework\v4.0.30319\regtlibv12.exe "PFAD\Datei-32.tlb"

64 Bit - Office
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\regasm ...
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regtlibv12.exe ...

Wie das jetzt mit AnyCPU aussieht, weiß ich leider nicht.

Ich weiß nicht ob es dir hilft, das sind halt meine Erfahrungen.

Gruß

Lukas

30.01.2017 - 09:49 Uhr

Hallo,

ich greife in VBA auf meine C#-Klasse zu. Bis auf eine Sache, läuft alles wunderbar:
Auf der C#-Seite habe ich einige Daten, die ich als Array an den VBA-Bereich übergebe. Dieses Array wird dann direkt in die Excel-Zellen geschrieben.
Es funktioniert auch, so lange es alles string oder int ist, also einfach Typen.
Nun ist das Problem, dass die Formatierung in Excel nicht richtig ist, wenn ich alle Werte immer als string[] übergebe.
ALso kam ich auf die geniale Idee auf der C#-Seite bei meiner Funktion ein object[] als Datentyp als Rückgabewert zu nehmen, so dass das manchmal ein string oder es manchmal ein int sein kann, je nach dem.
Auf der VBA-Seite habe ich einen Variant. Aber wie es aussieht sind object[] und Variant nicht wirklich kompatibel. Stelle ich auf der C#-Seite wieder alles auf string, werden die Werte übertragen. Bei object[] wird nur ein leeres Array übertragen.

Wie müsste ich es richtig machen, damit die Werte manchmal als int, manchmal als string rüberkommen? Excel weiß ja nicht, welcher Datentyp kommen soll, das weißt nur der C#-Bereich.

Danke schon mal!

Gruß

Lukas

10.12.2015 - 15:24 Uhr

Wird vllt. in den Programmen an der Culture rum getüfftelt?

Diese Frage brachte mich auf die Idee, dass ggf. die resources.dll-Dateien nicht mit kopiert werden und daran liegt es tatsächlich. Danke! Manchmal fehlt wirklich nur ein Stichwort um eine Lösung zu finden.

Gruß

Lukas

10.12.2015 - 14:32 Uhr

Hallo,

ich habe eine Library, die einen Dialog enthält. Dieser Dialog ist mehrsprachig (Resource-Dateien sind vorhanden, sonst würde es in einigen Fällen ja nciht funktioniere).
Problem ist jetzt, starte ich diesen Dialog aus einem bestimmten Programm heraus, ist dieser immer englisch (default-Sprache). Starte ich den aus einem anderen, findet der die richtige Sprache. Egal wie oft ich das versuche, immer das selbe Ergebnis.

Beide Programme können englisch oder deutsch sein, das hat keinen Einfluss auf die Ergebnisse. Allerdings warum ist der Dialog bei dem einen Progamm IMMER englisch, egal was ich mache.

Welchen Einfluss hat den der Parent-Dialog auf die Sprache des aufzurufenden Dialoges? Hat das überhaupt irgendwas damit zu tun?
Ich weiß nicht mehr wo nach ich im Internet suchen soll, vielleicht weiß jemand hier weiter.

Danke schon mal!

Lukas

28.09.2015 - 15:24 Uhr

Hi,

warum verwendest du nicht die TPL? Also das Arbeiten mit Tasks, async und await? Dann kannst du das Scannen in einem Task auslagern und die GUI friert nicht ein. Des weiteren könntest du dich mit den Producer/Consumer-Pattern beschäftigen, also eine Akteur schaufelt sich durch die Platte und bietet die Dateiinhalte an während die anderen diese Daten verarbeiten.

Interessante Idee, danke für den Tipp! Wenn mir bisschen Zeit übrig bleibt, schaue ich es mir mal an.

28.09.2015 - 15:17 Uhr

Ich sehe aber im ELSE-Zweig bisher nur das hier:

frmWait.updateWaitingForm(sTitle, sPath);  

Und das ruft eben genau diese Funktion wieder auf, ohne irgendeinen Status zu aktualisieren. Oder ist der Code den du gepostet hast nicht aktuell?

Ach,das hast du gemeint. Der Code ist nicht komplett. Es ist eine Funktion in dem frmWait, die genauso heißt. Die Sachen hier die sind in einer anderen Klasse.
Ich wollte jetzt nicht alles hier reinstellen, weil das zu viel wäre. Aber stimmt, für eine bessere Verdeutlichung hätte ich das zum Teil umschreiben sollen.

28.09.2015 - 15:04 Uhr

Hallo zusammen und danke schön erstmal!

Nein, dort ist keien Endlos-Schleife, sonst würde es ja nicht funktioniert wenn mehrere Objekte gescannt werden. Das Invoke ruft zwar die selben Funktion auf, diese wandert dann aber nicht mehr in den IF-Zweig, sondern in das ELSE wo dann die Texte gesetzt werden.

Im Moment baue ich das ganze um. FZelle gab mir den link zu einem anderen Thread wo das Stichwort Splash-Screen auftauchte. Das brachte mich auf Yet Another Splash Screen in C# wo allerdings der selbe Fehler vorkommt, den ich auch habe (Dialog wird geschlossen, während der noch nicht aufgebaut wurde). Aber dennoch bringt mich das erstmal weiter.

Lukas

28.09.2015 - 12:36 Uhr

Hallo,

ich habe einen Wartedialog erstellt. Dieser wird aufgerufen, wenn ich z. B. nach bestimmten Dateien in einem Ordner scanne und/oder noch andere Sachen im Hauptdialog beim Startvorgang passieren.

Was ich mache ist, ich scanne Ordner im Haupt-Thread.
Dabei rufe ich eine static-Funktion startWaitingForm.
Diese Funktion erstellt mir einen neuen Thread in dem der Wartedialog laufen soll.


      private static frmWaiting frmWait;
      private static Thread thWait;

      public static void startWaitingForm()
      {
         if (thWait != null)
         {
            if (thWait.IsAlive)
               thWait.Abort();
         }

         thWait = new Thread((ShowWaitDialog));
         thWait.Start();

      }

      private static void ShowWaitDialog()
      {
         frmWait = new frmWaiting();
         frmWait.ShowDialog();
      }

Während des Scan-Vorgangs rufe ich die static-Funktion updateWaitingForm, die einen Wert als Parameter hat, auf. Dieser Wert soll in dem Warte-Dialog angezeigt werden.


      public static bool updateWaitingForm(string sTitle, string sPath)
      {
         if (frmWait == null)
            return true;

         if (frmWaiting.bCancel)
            return false;

         if (frmWait.InvokeRequired)
         {
            updateWaitForm callback = new updateWaitForm(updateWaitingForm);
            frmWait.Invoke(callback, new object[] { sTitle, sPath });
         }
         else
         {
            frmWait.updateWaitingForm(sTitle, sPath);
         }

         return true;
      }

Nach dem Scan-Vorgang rufe ich zum Schluss die closeWaitingForm auf. Diese soll den Dialog und Thread schließen.


      public static void closeWaitingForm()
      {
         if (frmWait == null)
            return;

         if (frmWait.InvokeRequired)
         {
            closeWaitForm callback = new closeWaitForm(closeWaitingForm);
            frmWait.Invoke(callback);
            thWait.Abort();
         }
         else
         {
            frmWait.Close();
         }
      }

Im Normalfall würde man den Scan-Vorgang in einen anderen Thread verlegen, allerdings möchte ich nur den Warte-Dialog in einem anderen Thread habe und nur den Text ändern lassen. Es passieren nämlich noch einige Sachen später in dem Hauptdialog (Bäume werden aufgebaut, Tabellen gefüllt etc.). Dabei soll der Dialog halt offen bleiben.

Der ganze Vorgang funktioniert, allerdings wenn sich keine und sehr wenige Datei in dem Ordner befinden, kommt wohl das Schließen zu schnell oder ähnliches und es kommt zu einem Absturz oder manchmal schließt sich der Warte-Dialog nicht. Wenn ich das langsam im Debugger durchlaufe, läuft alles.
Ich sehe leider den Wald vor lauter Bäumen nicht mehr. Ich habe schon so viel damit herum experimentiert, leider alles ohne ERfolg. Leider konnte ich noch kein Beispiel finden, wo der Wartedialog-Text einfach so geändert wird vom Haupt-Thread.

Ich weiß jetzt nicht ob mein Ansatz so weit richtig ist, deshalb frage ich halt hier 🙂
Gerne tue ich noch die paar Zeilen Code vom Dialog rein, wenn notwendig.

Was genau mache ich falsch ?( 🤔

Danke schon mal!!!

Lukas

04.08.2015 - 10:30 Uhr

Vielen Dank, ihr habt mir sehr geholfen!

Gruß und eine schöne Woche!

Lukas

03.08.2015 - 16:30 Uhr

^ zeigt doch den Anfang des Wertes an.

Ich habe noch ein Beispiel gefunden: ^(Polen.+|(?!Polen).)$
Damit klappt das, allerdings kann ich damit nicht .
machen und so richtig verstehen tute ich das auch nicht.

03.08.2015 - 15:08 Uhr

Hallo,

ich stelle mich irgendwie total blöd an, was die Regular Expression angeht. Ich habe z. B. eine Liste mit Ländern die ich folgendermaßen (siehe unten) durch den Benutzer filtern lassen möchte. Dabei können auch zusammen gesetzte Filter gesetzt werden (Filter ist dick markiert, das Ergebnis, was ich auf erwarte, ist da drunter):

Liste:
Portugal
Polen
Australien
Argentinien
Brasilien
Panama

Filter:
(Brasilien)|(Panama)
Brasilien
Panama

(p.*)
Portugal
Polen
Panama

(*.ien)
Australien
Argentinien
Brasilien

**(po.)|(.in)
Argentinien
Portugal
Polen

Bis hierhin klappt das, so weit ich das getestet habe. Aber ist das trotzdem richtig?

Wie ist es denn bei Ungleich? Ich kriege das nicht wirklcih hin. Ich habe es mit ?! versucht, aber vergeblich. Das Ergebnis soll wie die Liste da unten aussehen.

(.ien)|(Po.)|(?!Polen)
Portugal
Australien
Argentinien
Brasilien

das klappt auch nicht
(?!Polen)
Portugal
Australien
Argentinien
Brasilien
Panama

Über ein paar Tipps wäre ich dankbar!

Gruß

Lukas

30.03.2015 - 10:32 Uhr

Hi,

also ich habe das so gelöst:


      private void Form1_KeyDown(object sender, KeyEventArgs e)
      {
         if (e.KeyValue == 18) // Alt key
         {
            menuStrip1.Visible = !menuStrip1.Visible;

         }
      }

      //Flag, damit das MenuStrip sich nicht immer schließt
      private bool bTSMI_IsOpen = false;
      private void menuStrip1_MouseLeave(object sender, EventArgs e)
      {
         if (!bTSMI_IsOpen)
            menuStrip1.Visible = false;
      }

      private void Form1_MouseMove(object sender, MouseEventArgs e)
      {
         if (e.Y < menuStrip1.Height)
         {
            menuStrip1.Visible = true;
         }
      }

      //Alle Parent-TooStripMenUItems (also die ganz oben, nicht die unteren) erhalten die beiden Events
      private void testToolStripMenuItem_DropDownOpened(object sender, EventArgs e)
      {
         //Dieser Flag verhindet nur, dass beim Verlassen von MenuStrip1, wenn man sich auf einem Untermenu befindet, sich das MenuStrip1 schließt
         bTSMI_IsOpen = true;
      }

      //Flag wieder auf false setzen
      private void testToolStripMenuItem_DropDownClosed(object sender, EventArgs e)
      {
         bTSMI_IsOpen = false;
         menuStrip1.Visible = false;
      }

Wenn der Benutzer in ein andere Steuerlement drück, schließt sich automatisch das Untermenu und MenuStrip1 wird auch auf visible = false gesetzt.

Probiere bisschen rum, vielleicht hilft dir das.

Gruß

Lukas

27.03.2015 - 11:49 Uhr

Hallo,

die DisplayIndex-Eigenschaft und das Event dazu kenne ich, half mir aber nicht weiter.

Ich dachte, vielleicht hat da jemand shcon was gehört, gelesen oder ähnliches.

Danke!

Lukas

27.03.2015 - 11:19 Uhr

Hi,

endlich weiß ich was du meinst 😄 (hoffentlich)
Dein Menustrip soll automatisch verschwinden wenn der Benutzer im Dialog sonst wo hindrückt. Will er das Menü eingeblendet bekommen, muss er ALT drücken oder? Ist das Menu eingeblendet und er drückt noch mal ALT, müsste es verschwinden oder?

Lukas

25.03.2015 - 12:10 Uhr

Hi,

leider verstehe ich nicht so recht was du meinst:

Du drückst ALT, dann wird msGPSvisual ein- oder ausgeblendet. Das Event MenuStrip1_MenuDeactivate, gehört das msGPSvisual oder MenuStrip1?
Warum setzt du das MenuStrip1 direkt auf Visible = false?
Welches andere Element wird ausgewählt?

Gruß

Lukas

25.03.2015 - 11:32 Uhr

Hallo,

ich möchte nur bestimmte Spalten in einem DGV verschieben lassen können.

Bsp:
Wenn ich z. B. ein DGV mit 6 Spalten habe (A, B, C, D, E, F), möchte ich dass nur 4 Spalten (A, B, E, F) vom Benutzer verschoben werden dürfen.
Spalte B dürfte ich dann natürlich nicht zwischen die Spalte C und D packen. Die Spalten die nicht verschoben werden dürfen sind dabei immer zusammen, also wie eine Gruppe.

A-B-[C-D]-E-F

Leider finde ich nichts wirklciches über das Verschieben von bestimmten Spalten. Meine einzige Idee wäre mit Mouse_Down und Mouse_Up so was abzufangen und vielleicht die Spalte wieder zurück zu ordnen. Aber ich weiß nicht ob das der richtige Weg ist, deshalb wollte ich fragen ob vielleicht jemand eine andere Lösung kennt.

Danke schon mal!

Lukas

16.12.2014 - 14:07 Uhr

Hallo,

@ismirschlecht: Über die Dateien habe ich halt die Informationen die man auch sonst erhält, aber keine Verbindung zum geöffneten Prozess.

@herbivore: Danke für den Tipp, das könnte Hilfreich sein. Der Dateipfad steht dort zumindest drin. Wenn ich was finden sollte, schreibe ich es hier rein.

Danke!

Lukas

08.12.2014 - 14:11 Uhr

Hallo zusammen,

wenn ich mein Programm starte, soll eine Liste von z. B. geöffneten Excel-Dateien angezeigt werden. Wählt der Benutzer eine Datei aus, muss ich die Prozess-ID der jeweiligen Instanz kriegen. Dabei kann natürlich vorkommen das mehrere Excel-Instanzen auf dem Rechner laufen.

Über die laufenden Prozesse kriege ich ja die Prozess-ID.
Auf die aktuell geöffneten Dateien komme ich über die GetRunningObjectTable (hier ein schönes Bespiel: Laufende COM-Objekte abfragen).

Aber ich habe keinen Bezug von der Prozess-ID zu dem ausgewählten Objekt. Der IMoniker bietet ja z. B. keine Informationen dazu an.

Gibt es vielleicht eine Funktion, ID oder sonst was, wo ich einen Bezug zwischen dem z. B. IMoniker/ROT-Objekt und einem Prozess kriege, irgendwas was ich vielleicht abgleichen kann?
Oder gibt es noch eine Funktion wie GetRunningObjectTable nur bezogen auf die Prozesse? Die ID muss ich nämlich haben.

Danke schon mal!

Gruß

Lukas

28.10.2013 - 09:29 Uhr

Hallo,

ich möchte eine ComboBox haben, wo ich Gruppen und deren Werte anzeigen möchte:


Gruppe1 | Wert1
        | Wert2
        | Wert3
Gruppe2 | Wert9
        | Wert54 

Das habe ich auch mit der OnDrawItem-Methode hinbekommen. Damit die Gruppen nicht beim jedem Wert zusehen sind, habe ich mri eine Liste mit bereits vorhandenen Gruppen erstellt. Falls eine Gruppe vorhanden ist, soll diese nicht angezeigt werden, nur der Wert.

Problem hier bei ist jetzt, wenn cih die ComboBox öffne und über die Felder gleite, so dass der blaue Selektionsbalken über die Items wandert, verschwinden die Gruppenfelder, da die schon in der Liste drin stehen. Das Feld wird ja immer neu gezeichnet und von der Logik her werden die vorhandenen Gruppen halt nicht gezeichnet.

Leider kenne ich mich in diesem Bereich nicht sonderlich gut aus. Sollte ich dafür lieber eine andere Methode verwenden oder gibt es vielleicht einen bestimmten Zustand wo ich meine Liste leeren könnte?
ÜBer die Sortierung muss mich auch noch Gedanken machen.

Ich wollte hier mit dem Items.Add arbeiten, anstatt mit einem DataSource. Mit dem DS bin ich schon gescheitert, da ich im Programm immer wieder die ComboBox aktualisieren muss (Werte kommen und gehen) und das hat nicht funktioniert, aber das ist eine andere Geschichte.

Würde mich über ein paar Tipps freuen!

Gruß

Lukas


      List<string> lstGroupExist = new List<string>();

      protected override void OnDrawItem(DrawItemEventArgs e)
      {
         base.OnDrawItem(e);

         if (DesignMode)
            return;

         if (e.Index == -1)
            return;

         e.DrawBackground();
         Rectangle rec = e.Bounds;

         using (Pen lnPen = new Pen(SystemColors.GrayText))
         {
            using (SolidBrush brush = new SolidBrush(ForeColor))
            {
               Program.cEntitaet curEnti = Items[e.Index] as Program.cEntitaet;

               if (!DroppedDown)
               {
                  //Nur ein Wert soll nach dem Auswahl angezeigt werden
                  e.Graphics.DrawString(curEnti.Wert, Font, brush, rec);
               }
               else
               {
                  //Prüfen ob Gruppen schon eingetragen ist
                  if (!lstGroupExist.Exists(delegate(string s) { return s == curEnti.Gruppe; }))
                  {
                     e.Graphics.DrawString(curEnti.Gruppe, new Font(Font, FontStyle.Bold), brush, rec);
                     lstGroupExist.Add(curEnti.Gruppe);
                  }
                  //Linie zeichnen
                  e.Graphics.DrawLine(lnPen, rec.Right, rec.Top, rec.Right, rec.Bottom);
                  rec.Width = (int)clWidths[0] + columnPadding;
                  rec.X = rec.Right;
                  //Wert einfügen
                  e.Graphics.DrawString(curEnti.Wert, Font, brush, rec);
               }
            }
         }

         e.DrawFocusRectangle();
      }

14.03.2013 - 17:14 Uhr

Danke für den Tipp!

14.03.2013 - 16:30 Uhr

Hallo chilic,

da wird mir wohl nicht anderes übrig bleiben. Eigenartig dass das nur beim Punkt der Fall ist, finde sonst kein anderes Sonderzeichen was Probleme macht.

Danke!

Lukas

14.03.2013 - 15:34 Uhr

Hallo f_igy,

ja, habe gerade eben. Der selbe Effekt.

14.03.2013 - 15:09 Uhr

Hallo,

ich möchte in einer ComboBox Werte aus einer DataView anzeigen.
Die Tablle tbl wird dabei aus der DataView (dv) mit der Spalte "1 Spalte" gefüllt. Das funktioniert auch.



         DataTable tbl = dv.ToTable(true, new string[] { "1 Spalte" });
         comboBox1.DataSource = tbl;
         comboBox1.DisplayMember = "1 Spalte";

Wenn aber "1 Spalte" ich in "1. Spalte" unbenenne, kriege ich die Werte "System.Data.DataRowView" in der ComboBox zu sehen.
Das Problem habe ich bei jeder Spalte die einen Punkt enthält. Das selbe Resultat habe ich auch, wenn ich dort einen Spaltennamen hinschreibe der nicht existiert.
Muss ich hier bei was bestimmtes beachten, habe ich was übersehen?
Ich weiß leider nicht mehr weiter und hoffe auf ein paar Tipps.

Danke und Gruß

Lukas

04.10.2012 - 14:17 Uhr

Hallo Rainbird,

wenn Portname gleich ist, erhalte ich die selbe Fehlermeldung, so mit müsste ich den Portnamen für jeden Prozess ändern. Den Kanalnamen eindeutig zu machen hilft hier bei leider nicht.
Problem beim Ändern des Portnamens ist, dass eine ganz andere Applikation den Namen nicht kennt.
Werde das wohl weiter mit Try-Catch abfangen müssen.

Trotzdem Danke!

Lukas

02.10.2012 - 11:47 Uhr

Hallo vbprogger,

danke für die Hilfe, den Beitrag kenne ich schon, hilft mir leider nicht wirklich weiter, da ich keine zeitl. Probleme habe, sondern einfach mit einer 2. Instanz.

Lukas

02.10.2012 - 11:23 Uhr

Hallo,

ich erzeuge in einer Applikation einen IPC-Kanal. Sobald aber eine zweite Instanz von dieser Applikation gestartet wird, kriege ich einen Exception-Meldung mir > Fehlermeldung:

"Fehler beim Erstellen eines IPC-Ports: Zugriff verweigert".

Nun wollte ich auch abfragen ob der Kanal bereits existiert. Leider liefert mir "ChannelServices.GetChannel" in der 2. Instanz kein Ergebnis. Ich kriege dort nur die Kanäle aus der eigenen Instanz.
Was mache ich falsch oder habe ich etwas missverstanden? Ich weiß, dass ein Kanal nur einmal vorkommen kann, aber wie kann ich das abfragen?


         IDictionary properties = new Hashtable();
         properties.Add("name", "MyTestChannel");
         properties.Add("portName", "PortXYZ");

         try
         {
            IpcChannel getChannel = (IpcChannel)ChannelServices.GetChannel("MyTestChannel");//liefert in der 2. Instanz immer null
            if (getChannel == null)
            {
               IpcChannel myChannel = new IpcChannel(properties, null, null); //Exception da Kanal schon existiert
               ChannelServices.RegisterChannel(myChannel, false);
            }
         }
         catch (Exception ex)
         {
            Console.WriteLine(ex.Message);
         }

Danke schon mal!

Lukas

24.05.2012 - 10:28 Uhr

Ok,
es liegt wirklich an der DLL. Dieses Problem habe ich nur in Dialogen, in einfachen CS-Dateien kriege ich die richtige Exception-Meldung.

Ich müsste wohl beim Entwickler der Library nach fragen.

Danke allen!

Lukas

24.05.2012 - 09:52 Uhr

Morgen telfa,

im Debug-Modus springt der zwar in den catch, trotzdem läuft der danach in die DLL rein. Drücke ich dann F5 läuft das Programm mit Folgefehlern weiter (in meinem Bsp. ist der Dialog zum Teil ohne Steuerelemente, da ich diese nach dem Fehler per Laufzeit erzeuge). Das Try-Catch hilft zwar hier und dort einen Fehler ggf. schneller zu finden, aber die Lösung ist das nicht, da mein Projekt recht umfangreich ist.

Ich muss wohl weiter suchen.

Trotzdem danke!

Gruß

Lukas

23.05.2012 - 16:58 Uhr

Hallo telfa,

hast Du versucht die QuellCode-Datei der Bibliothek in VS mit anzuzeigen und dann zu debuggen?

Den kompletten Quellcode habe ich ja und kann den debuggen

Hast Du eine Try-Catch-Klammer über diese Bibliothek geöffnet?

Um ehrlich zu sein, ich wüsste nicht wo ich dort die Klammer setzen müsste. Die DLL läuft ja korrekt, ich kann die einfachsten Fehler wie (siehe Bsp) machen und kriege keine Meldung.


MyClass1 c1 = null;
c1.Name = "test"; //Hier müsste ich einen Exception kriegen, dort der wandert in die DLL und dort kann cih weiter debuggen.

Gruß

Lukas

23.05.2012 - 14:56 Uhr

Wenn ich auf einen Fehler stoße erscheint bei mir ein Fenster mit der Überschrift "No Source Available". Im unteren Bereich steht user32.dll!76d...(). Sobald ich dann F5 drücke, läfut das Programm weiter.

Die DLL ist für die Fenstersteuerung alà Visual Studio zuständig, das heißt ich kann wie im Studio Panels im Hauptdialog andocken/verschieben etc. http://sourceforge.net/projects/dockpanelsuite/

Ich kenne mcih mit dem Bereich leider nicht so gut aus und kann nicht einschätzen welchen Einfluss eine DLL auf das Debuggen haben kann.

23.05.2012 - 14:31 Uhr

Hallo dN!3L,

beide sind aktiv, dort habe ich auch nichts seit der Installation geändert.
Hängt das vielleicht an den Bibl.-Funktionen? An dem DLL-Projekt selbst?

Wenn ich ein neues Projekt ohne diese DLL erzeuge, dann funktioniert ja alles. Also ich denke, dass das an der DLL irgendwie liegt, die permanent irgendwelche Messages über das Fensterverhalten meines Dialoges erhält.

Lukas

23.05.2012 - 11:49 Uhr

Hallo herbivore,

was meinst mit logging?
Ich verstehe auch nicht, warum ich keine Meldung wie "Object reference not set to an instance of an object.", sondern der einfach dort abbricht und in einer anderen Bibliothek weiter macht.

Lukas

23.05.2012 - 11:24 Uhr

Danke für den Tipp, gut zu wissen, dass es so was gibt.
Leider springt der in den Disassembly rein, kriege also immer noch keine Exception. Hat also den selben Effekt, als wenn ich die Quellcode-Datei mit den Events umbenennen würde.

Lukas

23.05.2012 - 10:46 Uhr

Hallo dN!3L,

ja, ich habe die komplette Bibliothek als Projekt.
Habe alle pdb-Dateien gelöscht, trotzdem springt der in die Funktion rein. Klappt also immer noch nicht.

Lukas

23.05.2012 - 10:26 Uhr

Visual Studio 2010 (C#)
Windows 7 (64x)

Hallo,

ich habe in meinem Projekt mehrere DLLs eingebunden. Problem ist jetzt, wenn ich mich im Debug-Modus befinde und es kommt zu einem Exception-Fehler, springt der Debbuger in eine bestimmte Bibliothek in die Funktion CoreHookProc(...), anstatt mir den Fehler auszuspucken.

Wenn ich die Anwendung aus dem Studio raus starte und es kommt zu dem Fehler, dann erhalte ich ebenfalls keinen Exception sondern der macht einfach nicht mehr weiter. Die Anwendung stürzt aber nicht ab.

Starte ich die Anwendung direkt (ohne Studio) kriege ich ganz normal die Exception-Fehler.
Es ist also für mich irgendwie sehr schwierig auf Fehler zu stoßen, wenn ich nur aus dem Studio raus starte.

Meine Frage, kann ich bei dieser einen Bibliothek irgendwie einstellen, dass ich mit dem Debugger dort nicht mehr rein springen kann oder gibt es eine andere Möglichkeit? Raus nehmen kann ich die nicht.
Ich habe die Referenz nicht mehr als Projekt drin, sondern die DLL direkt. Das Projekt ist in der Solution deaktiviert. Leider klappt das nicht, der springt immer noch in die Funktion rein.
Was kann ich sonst noch tun?

Danke schon mal!

Gruß

Lukas

04.11.2011 - 18:57 Uhr

Hi,

ich weiß, hat der Moderator herbivore auch schon gesagt. Ich werde den Quellcode nächste Woche anpassen.

Gruß

Lukas

04.11.2011 - 18:35 Uhr

Hi,

hast schon recht, das Clone brauche ich dort nicht. Wahrscheinlich habe ich das aus Verzweiflung eingebaut und später vergessen.

So, Schluß mit Arbeit, schönes Wochenende!

Lukas

04.11.2011 - 09:08 Uhr

Hi,

hier der komplette Quellcode (noch mit der Hashtable).
Danke auch an den Moderator, ich werde mal wg. der Einstellung im Forum und der Hashtable nach schauen.
Danke auch an die Tipps SirFoldabit, ich gucke da demnächst rein, stehe auf der Arbeit im Moment ziemlich im Zeitdruck.


      #region ICON


      private const uint SHGFI_ICON = 0x100;
      private const uint SHGFI_LARGEICON = 0x0;    // 'Large icon
      private const uint SHGFI_SMALLICON = 0x1;    // 'Small icon
      // This structure will contain information about the file

      private struct SHFILEINFO
      {
         // Handle to the icon representing the file
         public IntPtr hIcon;
         // Index of the icon within the image list
         public int iIcon;
         // Various attributes of the file
         public uint dwAttributes;
         // Path to the file
         [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
         public string szDisplayName;
         //File type
         [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
         public string szTypeName;
      };

      /// ====================================================================
      /// <summary>Kurzbeschreibung</summary>
      /// <remarks>
      /// <para>Ausführliche Beschreibung</para>
      /// <para>Datum.......: 2011-08-15</para>
      /// </remarks>
      private class cDLLImport
      {
         [DllImport("Shell32.dll")]
         private static extern IntPtr SHGetFileInfo(string sPath, UInt32 unFileAttributes, ref SHFILEINFO psfi, Int32 nFileInfo, UInt32 unFlags);

         [DllImport("user32.dll", CharSet = CharSet.Auto)]
         private static extern bool DestroyIcon(IntPtr handle);

         ///--------------------------------------------------------------------
         /// <summary>Holt das Icon und gibt es als Pointer zurück</summary>
         /// <remarks>
         /// <para>Ausführliche Beschreibung</para>
         /// <para>Datum.......: 2011-08-15</para>
         /// </remarks>
         /// <param name="sPath"></param>
         /// <param name="unFileAttributes"></param>
         /// <param name="psfi"></param>
         /// <param name="nFileInfo"></param>
         /// <param name="unFlags"></param>
         /// <returns></returns>
         public static IntPtr GetFileInfo(string sPath, UInt32 unFileAttributes, ref SHFILEINFO psfi, Int32 nFileInfo, UInt32 unFlags)
         {
            IntPtr ptr = SHGetFileInfo(sPath, unFileAttributes, ref psfi, nFileInfo, unFlags);

            return ptr;
         }

         ///--------------------------------------------------------------------
         /// <summary>Zerstört das Icon</summary>
         /// <remarks>
         /// <para>Ausführliche Beschreibung</para>
         /// <para>Datum.......: 2011-08-15</para>
         /// </remarks>
         /// <param name="handle"></param>
         /// <returns></returns>
         public static bool DestroyIconFromPTR(IntPtr handle)
         {
            return DestroyIcon(handle);
         }
      }

      private static Dictionary<string, Icon> _dicIcons = new Dictionary<string, Icon>();

      ///--------------------------------------------------------------------
      /// <summary>Gibt das Icon der Datei zurück</summary>
      /// <remarks>
      /// <para>Ausführliche Beschreibung</para>
      /// <para>Datum.......: 2011-07-11</para>
      /// </remarks>
      /// <param name="sPath"></param>
      /// <returns></returns>
      public static Icon getIcon(string sPath)
      {
         string sExt = Path.GetExtension(sPath);
         Icon icFileIcon = _dicIcons[sExt];

         if (icFileIcon == null)
         {
            // Will store a handle to the small icon
            SHFILEINFO shinfo = new SHFILEINFO();
            // Get a handle to the small icon

            IntPtr hImgSmall = cDLLImport.GetFileInfo(sPath, 0, ref shinfo, Marshal.SizeOf(shinfo), SHGFI_ICON | SHGFI_SMALLICON);
            // Get the small icon from the handle

            icFileIcon = (Icon)Icon.FromHandle(shinfo.hIcon).Clone();
            _dicIcons.Add(sExt, icFileIcon);

            //destroy or crash
            cDLLImport.DestroyIconFromPTR(shinfo.hIcon);
         }

         return icFileIcon;

      }

      #endregion

Gruß und schönen Freitag!

Lukas

03.11.2011 - 22:51 Uhr

Hi SirFoldabit,

sorry dass ich jetzt erst antworte, ich bin kein Forum- bzw. Internet-Mensch und schaue eher nie in meinen alten Beiträge hin ein.
Also, zu meiner Lösung, ich lade mir nur 1 Icon pro Datei-Extension in dne Speicher. Das heißt, wenn ich 300 doc-, 400 html- und 10000 pdf-Dateien habe, lade ich nur 3 Icons in den Speicher.

Ich habe daszu eine Hashtable und als Key benutze ich die Extension. So bald ein Icon benötigt wird, schaue ich erst in der Hashtable nach, falls vorhanden, gebe ich das Icon zurück, falls nicht, lade ich es auf die alte Weise.

Den Quelltext habe ich jetzt nicht hier, sondern im Büro, bei Interesse kann ich den hier rein setzen.

Gruß

Lukas

22.09.2011 - 08:35 Uhr

Hi DaMoe,

danke für Deine Antwort.
Die Einträge identifiziere ich anhand einer ID und/oder anhand des Dateipfades, da dieser immer eindeutig und vom Benutzer nicht änderbar ist.
Die Beschreibung kann mehrmals vor kommen, ist also nicht eindeutig.

Vorhin in der Bahn auf dem Weg zur Arbeit kam mir auch die Idee eine Klasse zu erstellen, die für die Datenhaltung verantwortlich ist.
Ich werde mir mal das INotifyPropertyChanged genauer anschauen, gibt ein schönes Beispiel in der MSDN, werde mir dann ein paar Gedanken machen.

Danke!

Gruß

Lukas

21.09.2011 - 16:51 Uhr

Hallo,

hoffentlich bin ich im richtigen Forum.

Schon mal vorweg:
Ich benutze 2 DataGridViews, die mit jeweils einer Bindingsource verknüpft ist. Die Daten hole ich mich aus verschiedenen XML-Dateien und schreibe die in ein DataTable rein.

nun habe ich folgendes Performance-Problem:
Mein Programm hat 2 Tabellen, die ggf. auch mehrere Tausend Zeilen haben können.
Beide Tabellen haben immer 4 gleiche Spalten (Icon, Dateiname, Dateipfad, Beschreibung) und dazu noch einige Spalten, die nur in der jeweiligen Tabelle vorkommen. Aber die ersten vier sind in beiden vorhanden und auch immer gleich.

Das Problem ist jetzt, wenn ich jetzt in der Tabelle1 2000 Zeilen der Spalte Beschreibung editieren will. Die Beschreibung sollte sich dann nämlich ebenfalls in der Tabelle2 ändern.
Dazu benutze ich die Find-Funktion des Bindingsource. Das Problem ist aber, dass das bei dieser großen Datenmengen lange dauern kann, bis alle Beschreibungen in beiden Tabellen drin stehen, die Werte müssen ja einzeln rausgesucht werden.

Das gleich natürlich auch, wenn die Daten in der Tabelle2 geändert werden und die Texte in der Tabelle1 angepasst werden müssen.

Gibt es vielleicht einen anderen Weg die jeweiligen Spalten gleich zu halten?

Danke schon mal!

Gruß

Lukas

19.08.2011 - 13:43 Uhr

Hi,

ab der ersten 0 sind alle darauf folgenden Icons-IntPtr ebenfalls 0. Wenn ich die Icons mit 0 überspringe kriege ich in der Program.cs folgen Fehler:> Fehlermeldung:

Nicht genügend Arbeitsspeicher.

Jetzt weiß ich nciht, ob ich was falsch gemacht habe, aber die Handle-Anzahl steigt einmal rauf auf 355, dann erhöht sie sich nicht mehr.

Danke für die Artikel, jetzt habe ich wieder was zum Lesen. Die Anzahl möchte ich auch nicht unbedingt erhöhen, wollte nur mehr Hintergrundwissen ahben.

Danke!

Lukas

19.08.2011 - 09:12 Uhr

Danke für eure Antworten!

Mit DestoryIcon habe ich auch schon versucht, hilft nichts.

Als Lösung benutze ich ja immer nur 1 Icon anstatt 1000. Mich würde nur interessieren, warum das Problem auftritt? Speicherbereich voll?

Wo kann man diese Handle-Grenze ändern oder ist die fest vom OS festgelegt?

Ich arbeite recht viel mit DLLs aus dem native-Bereich, die ich importiere, deshalb interessiert mich das Thema.

Gruß

Lukas

18.08.2011 - 14:38 Uhr

Ich lese nur die kleinen aus. Daran wird es aber auch nicht liegen, weil warum sollten ab einer bestimmten Anzahl von Dateien keine Icons merh vorhanden sein und in einem anderen Projekt sogar früher.

Als Rückgabe kriege ich immer die 1.
Die Struktur SHFILEINFO beinhaltet ja hIcon (Speicheradresse des Icons) -> siehe Beispiel Icons von Files auslesen.

Lukas

18.08.2011 - 14:18 Uhr

In meinem Beispiel schon. Es sind alles DOC-Dateien. Es sind sogar ein und die selben, nur mit verschiedenen Namen (0001.doc - 5600.doc).
Außerdem hat jede Datei unter Windows ein Icon, auch wenn es das Default-Icon ist.