Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Spook
Thema: Wie kann ich eine string Variable aus Siemens S7-1500 mit S7.Net Biblitohek lesen?
Am im Forum: Rund um die Programmierung

Hallo Goofigoofi,

wenn ich das richtig sehe, hast du einen String mit als Längen-Information.
Das erste Byte stellt die maximale Länge des Strings in Bytes dar.
Das zweite Byte die tatsächliche Länge des Strings in Bytes.
Danach folgen die N Bytes des Strings (nicht verwendete Bytes sollten mit 0x00 gefüllt sein).

Du solltest schauen, was in DBB11 steht.

(Alternativ scheint es dafür schon eine Hilfsmethode in der von dir verwendeten Lib zu geben: StringEx.FromByteArray. Hier müsstest du alle Bytes, inklusive Header, in ein Byte-Array kopieren und dann die Methode aufrufen.)

Grüße spooky

Thema: Wie aus einem unmanaged Bereich eines Array of Structs in Array in managed Bereich kopieren?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Das Problem ist, dass der Code hier vermutlich extrem ausgedünnt und dabei noch diverse Fehler enthält:


IntPtr pAeusere;
getData(pAeusere);

Alleine das kann schon nicht kompilieren.


Aeusere aeusere = (Aeusere) Marshal.PtrToStructure(pAeusere, typeof(emxArray));

Das wird zur Laufzeit krachen, außer Aeusere ist ein Alias für emxArray.

Was du machen möchtest ist relativ simpel zu lösen. Aber bitte zeige uns den richtigen Code und nicht etwas völlig verfälschtes.

Thema: Wie aus einem unmanaged Bereich eines Array of Structs in Array in managed Bereich kopieren?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo mifi261,

die Definitionen der structs im C# entspricht nicht denen aus dem C++ Code.

Zitat
IntPtr pElement = new IntPtr(aeusere.data.ToInt32() + Marshal.SizeOf(typeof(Innere)) * i);
Einen Pointer nach Int32 umzuwandeln ist keine gute Idee. Sollte dein Programm unter 64Bit laufen wirst du eine Exception bekommen. Verwende stattdessen besser den + Operator von IntPtr.
Zitat
Aeusere aeusere = (Aeusere) Marshal.PtrToStructure(pAeusere, typeof(emxArray));

Wo ist emxArray definiert? Mir scheint hier, dass dies a) nicht kompiliert und b) zusammengewürfelte Teile sind.

Wenn du ein Array of structs übertragen willst, kannst du dies sehr viel einfacher machen indem du im C# direkt ein Array deiner Struct als Parameter angibst. Im C++ kopierst du dann einfach die Daten via memcpy in das Array.
Da du das Array natürlich im C# vorallokieren musst, und in C++ keine Länge da ist würde ich einen weiteren in/out Parameter für die Array-Länge anlegen:


        struct Innere
        {
            int iValue1;
            int iValue2;
            double dValue;
        };

        [DllImport(DLLPfad, CallingConvention = CallingConvention.Cdecl)]
        private static extern void GetData(Innere[] data, ref int size);

                int size = 0;
                Innere[] data = null;
                GetData(data, ref size); // Länge abrufen
                data = new Innere[size]; // Array allokieren
                GetData(data, ref size); // Werte direkt ins Array schreiben
C++

        DLL_EXPORT void GetData(Innere* array, int& size)
        {
            if (array == nullptr)
            {
                size = ...;//
            }
            else
            {
                memcpy(array, ..., sizeof(Innere) * size);
            }
        }

Damit kannst du dir die äußere Struct sparen und die Daten werden direkt kopiert also auch kein Marshalling nötig.


Grüße
spooky

Thema: Wie kann ich einen Text in Brailleschrift darstellen?
Am im Forum: Rund um die Programmierung

Zitat von chilic
Komplexer machen es nur die Kombinationen aus mehreren Buchstaben.
Täusche ich mich?

Wenn ich beim Überfliegen der Texte richtig verstanden habe, können/müssten Buchstabenkombinationen wie 'sch' oder 'ch' und Zahlen, da A-J auch 1-0 sind, separat behandelt werden. Also wird einfaches Ersetzen eines chars mit einem anderen nicht klappen.

Mit diesen zwei Spezialfällen sollte trotzdem eine recht übersichtliche Lösung zu finden sein:
- Kommt eine Zahl => 'Zahl folgt' + alle Zeichen der Zahl (hier ist die Frage wie z.B. 1,23 umgesetzt werden - ich vermute dass kein zweites 'Zahl folgt' verwendet wird)
- Kommen Zeichen, die in einer Kombination zusammengefasst sind => Kombinations-char
- Ansonsten einzelnes Zeichen mappen

Grüße

Thema: Wie kann ich Codeblöcke in eine Methode übergeben?
Am im Forum: Grundlagen von C#

Hallo Sebrahi,

du kannst den Code der an einer anderen Stelle ausgeführt werden soll in eine Methode schreiben und diese dann über die Verwendung von Delegates an einer anderen Stelle ausführen:

	public static void vier_mal_wiederholen()
	{
		for(int i=1;i≤4;i++)
		{
			// hier soll der Code rein der viermal wiederholt werden soll
		}
	}
	
	public static void drei_mal_wiederholen()
	{
		for(int i=1;i≤3;i++)
		{
			// hier soll der Code rein der dreimal wiederholt werden soll
		}
	}
	
	public static void Test(Action action)
	{
		action();
		MessageBox.Show("hi");
	}
	
	public static void Main()
	{
		Action action = vier_mal_wiederholen;
		Test(action);
		
		Test(drei_mal_wiederholen);
	}

Grüße
spooy

Thema: Wieso hat FormWindowState.Maximized mehr Pixel als mein Monitor?
Am im Forum: GUI: Windows-Forms

Hallo,

ich habe die Vermutung, dass der Schatten des Fensters bei der Berechnung der Größe mitgezählt wird, da dieser bei FormBorderStyles.None nicht gerendert wird und hier das Fenster die erwartete Größe hat.

Grüße

Thema: Wie erstellt Windows Forms / WPF ein Fenster?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Über die Windows API:
Creating a Window

Hier die Verwendung in Windows Forms:
NativeWindow

Die anderen Aufrufe sind über die Suche leicht zu finden.


Grüße

Thema: .exe startet nicht auf zweitem Rechner (nur nach einmaliger VS installation)
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Zitat
... steht etwas von KernelBase.Dll, was aber völlig unverständlich ist.

Wieso postest du die Meldung denn nicht einfach? Vielleicht kann hier jemand damit etwas anfangen.

Thema: Eigene Applikation im Vordergrund, aber Fokus auf der unterliegenden Applikation behalten
Am im Forum: Grundlagen von C#

Zitat von Abt
Ich meine, dass ich genau dieses Wunschverhalten schon viele viele Male gelesen habe, das in der Form aufgrund des Fernsterverhaltens des Betriebssystem jedoch leider gar nicht möglich ist; weil eben das Window Management hier den Fokus wechselt und Du dies nicht aktiv beeinflussen kannst.

Diese stehen in der Remarks Section von SetForgroundWindow.

Grüße

Thema: Mit Mausklick an dieser Stelle der Form eine Combo Box erstellen und aufklappen lassen?
Am im Forum: Grundlagen von C#

Versuch diese Änderung:

        public Form1()
        {
            InitializeComponent();
            GetData();
        }

Grüße

Thema: Session / Cookies Handling des Forums meldet mich alle paar Stunden ab
Am im Forum: Smalltalk

Das Löschen des Cookie Caches scheint das Problem bei mir gelöst zu haben. Bin seit gestern Nachmittag immer noch eingeloggt und bleibe es anscheinend auch nach mehreren Pausen und Reboot des Rechners.

Thema: Session / Cookies Handling des Forums meldet mich alle paar Stunden ab
Am im Forum: Smalltalk

Hallo,

mir ist dies heute auch zum ersten Mal aufgefallen.
Nach einem Neustart des Browsers ist der Login auch direkt weg.

Ich habe testhalber Cookies explizit für die Webseite erlaubt und das Löschen beim Beenden ist in den Einstellungen deaktiviert.

Habe ebenfalls FF 69.0.1 (64-Bit).

@Th69
Ja nach einiger Zeit, oder Neustart des Browsers

Edit:

In Edge geht es ohne Probleme.

Das Löschen aller Cookies im FF über STRG+SHIFT+DEL scheint das Problem, zumindest beim Browser Neustart, gelöst zu haben.

Thema: Threadsafe Liste, bei der ein Tasks den exklusiven Zugriff erhalten kann
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Also geht es dir primär nicht um das Synchronisieren eines konkreten Zugriffs auf eine Instanz von List<T> (oder ähnlich) sondern du möchtest eher zwei getrennte Zugriffsebenen?

Du könntest mehrere ReaderWriterLocks oder Sync-Objekte verwenden. Die "normalen" Tasks locken immer nur Ebene 1. Wenn ein Task exklusiven Zugriff möchte lockt er ebenfalls Ebene 1 und die Threads dieses Tasks locken nur Ebene 2 um sich intern zu synchronisieren.

Thema: Threadsafe Liste, bei der ein Tasks den exklusiven Zugriff erhalten kann
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Palladin,

für mich klingt das nach ReaderWriterLock Class.
Mit dieser konnen mehrere Threads parallel aus der Liste lesen, aber immer nur ein Thread die Liste verändern.

Grüße
spooky

Thema: Für alle möglichen Kombinationen Datei und MD5 Hash erzeugen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo flo87,

ich würde einen Integer-Datentyp (mit passender Größe) und eine einfache for-Schleife verwenden:

		int requiredBits = 20;
		uint maxValue = 1u << requiredBits;
		for (uint register = 0; register < maxValue; register++)
		{
			bool bit1 = (register & 1) != 0;
			bool bit2 = (register & 2) != 0;
			bool bit3 = (register & 4) != 0;
			bool bit4 = (register & 8) != 0;
			// ...
		}

Mit dieser wird jede mögliche Kombination exakt einmal durchlaufen. Du musst lediglich die einzelnen Bits an deinen weiteren Algorithmus anbinden.

Grüße
spooky

Thema: Fenster skalieren nur für die Höhe erlauben
Am im Forum: GUI: WPF und XAML

Hallo Urza,

dies entspricht nicht dem was ich beim Debuggen einer leeren Anwendung (.NET 4.8) erhalte. Vielleicht ist die Dokumentation hier nicht korrekt oder auf dem neusten Stand.


Grüße

Thema: Fenster skalieren nur für die Höhe erlauben
Am im Forum: GUI: WPF und XAML

Hallo,

Zitat
da das Loaded Event wahrscheinlich leider vor SizeToContent ausgelöst wird

Dies sollte eigentlich nicht der Fall sein.
Du könntest allerdings versuchen mit Hilfe des Dispatchers die Fixierung der Breite so zu verzögern, dass diese nach deinem Layoutprozess passiert.

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            this.Dispatcher.BeginInvoke(new Action(() =>
            {
                this.MinWidth = this.MaxWidth = this.ActualWidth;
            }), DispatcherPriority.Background);
        }

Dabei musst du ggf. mit dem DispatcherPriority-Wert spielen, wobei 'Loaded' dem Loaded-Event des Fensters entpricht.

PS: Die Reihenfolge der Window-Events ist:
  1. Initialized
  2. Loaded
  3. Activated


Vielleicht reicht es auch den Code im Activated-Event auszuführen.
(Activated wird allerdings jedes Mal aufgrufen, wenn das Window aktiv wird! Daher wäre es sinnvoll hier das Event wieder zu deregistrieren.)

Grüße

Thema: Fenster skalieren nur für die Höhe erlauben
Am im Forum: GUI: WPF und XAML

Hallo,

dies könnte ein Lösungsweg sein:
WPF Window - Only allow horizontal resize

Grüße

Thema: WPF Datagrid Zellen nach Inhalt von einem Excel Dokument färben.
Am im Forum: GUI: WPF und XAML

Wenn das Bindungsziel vom Typ Brush ist kann der Converter auch einen Namen (string) aus der statischen Brushes Klasse zurückgeben. Diese wird automatisch in den passenden Brush konvertiert so wie als wäre dieser im XAML direkt gestanden.

Grüße

Thema: DPI Scaling Multi Resolutions and DPI Settings
Am im Forum: GUI: Windows-Forms

Hallo Chevy77,

ich habe mich damals an dieses Dokument gehalten.
Beim Überfliegen dieses finde ich diesen Abschnitt:

Zitat
We recommended that you specify the default process DPI awareness via a manifest setting.

Ich kann nur sagen, dass es mit diesen Werten funktioniert (unter Windows 10 1809).

Grüße

Thema: DPI Scaling Multi Resolutions and DPI Settings
Am im Forum: GUI: Windows-Forms

Bei mir sieht der Eintrag wie folgt aus:

  <application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings>
      <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitor</dpiAwareness>
      <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
    </windowsSettings>
  </application>

Versuche es mal damit.

Thema: DPI Scaling Multi Resolutions and DPI Settings
Am im Forum: GUI: Windows-Forms

Hallo Chevy77,

dies sollte mit Hilfe folgender Einstellungen funktionieren:

Setting the default DPI awareness for a process

Unsere Anwendung wechselt automatisch die Skalierung je nach Monitor, auch im laufenden Betrieb, wenn man sie zwischen den Monitoren verschiebt, sobald du

<dpiAwareness>PerMonitor</dpiAwareness>
festlegst.


Grüße
spooky

Thema: DLL Architektur feststellen (32bit/64bit/AnyCPU)
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Hallo Ramokthan,

leider konnte ich auf die schnelle auch keine Dokumentation zu der genauen Bedeutung von ILONLY finden. Nachdem ich einige DLLs von uns mit corflags.exe angeschaut habe, gehe ich davon aus, dass das Flag bedeutet, dass kein unmanaged code vorhanden ist und nichts mit 32/64/AnyCPU an sich zu tun hat.
Bei einer unserer Mix-Mode DLLs ist ILONLY 0 und ILSpy gibt folgende Info aus:
"This assembly contains unmanaged code."

Ansonsten würde ich auf die Tabelle in folgendem Post verweisen (diese scheint mir korrekt zu sein):
How to interpret the CorFlags flags?

Grüße
spooky

edit:Typo

Thema: DLL mit mehreren UserControls anlegen, die ich über die Toolbox anlegen kann
Am im Forum: Grundlagen von C#

Dann würde ich bei beiden Controls gegen das gleiche VM binden. Musst du doch eh machen, wenn diese auf die gleichen Daten zugreifen sollen.

Thema: DLL mit mehreren UserControls anlegen, die ich über die Toolbox anlegen kann
Am im Forum: Grundlagen von C#

Hallo Gimmick.

Wieso erstellst du nicht ein neues UserControl das die Text- und ListBox enthält und dieses Control auf die "Datenbasis" zugreift? Damit kannst du die Daten an dieses Control binden und dann auch mehrfach verwenden.

Grüße

Thema: Dynamisch ein Object von Type erstellen
Am im Forum: Grundlagen von C#

Hallo HexEdit,

mit Activator.CreateInstance

Grüße
spooky

Thema: OLEdBDataReader bringt den Speicher an seine Grenzen
Am im Forum: Datentechnologien

Zitat von ThomasE.
Der RAM läuft nicht voll
Hmm, mag sein. Trotzden klingt 3,8GB bei einem 32bit Prozess erstmal nicht so gut. Vielleicht ist die Fehlermeldung nicht korrekt ... wäre nicht das erste Mal.
Dies würde zumindest erklären warum es mit 64bit funktioniert ... natürlich kann dies auch andere Gründe haben. Trotzdem könnte man es prüfen.

Grüße

Thema: OLEdBDataReader bringt den Speicher an seine Grenzen
Am im Forum: Datentechnologien

Hallo Soier,

hast du es mal mit einer kleineren Pagesize versucht und geschaut ob der RAM immernoch voll läuft?
Mir fällt noch auf, dass du bei dem Aufruf von fill(..) immer 'pagesize' viele Zeilen liest? Funktioniert das wirklich - auch wenn 'zeilenanzahl' kein Vielfaches von 'pagesize' ist?

Grüße
spooky

Thema: Geht der folgende Code auch effizienter?
Am im Forum: Code-Reviews

Zitat von mchrd
Was würde man noch prüfen, bevor man mit dem File.ReadAllLines auf die Datei zugreift?

Hallo mchrd,

eine vorangestellt Prüfung macht keinen Sinn, da selbst wenn deine Prüfung positiv ist, kann die Datei zwischen deiner Prüfung und deinem Zugriff gelöscht oder gelockt werden. In diesem Fall bekommst du wieder eine Exception ... bist also genau so weit wie vorher. Daher einfach versuchen die Datei zu öffnen, so wie du es bereits jetzt machst.

Kleiner Verbesserungsvorschlag:
Anstatt File.ReadAllLines könntest du File.ReadLines verwenden, so dass nicht erst die komplette Datei geladen werden muss.


Grüße
spooky

Thema: Schnittstellenänderung in dll mit alter exe wirft Fehler trotz optionalem Parameter
Am im Forum: Rund um die Programmierung

Hallo Turmoil,

ja das passiert weil die optionalen Parameter(werte), wenn du sie weglässt, beim aufrufenden Code (zwangsweise) mit einkompiliert werden - so als würdest du die Methode mit allen Parametern aufrufen.
Daher ist was du vorhast nicht möglich.
Auch wenn du zwei Versionen mit gleicher Signatur und sich ändernen Standardwerten hättest, würde die alte (exe) Version immernoch die alten Standardwerte vom damaligen Kompilieren verwenden.

Grüße
spooky