Zum Inhalt springen

Gateway_man

Mitglieder
  • Gesamte Inhalte

    1.162
  • Benutzer seit

  • Letzter Besuch

Alle Inhalte von Gateway_man

  1. Hi leute, ich war gerad am erweitern meines Cpp Frameworks und wollte kurz eine Klasse testen. Ergo fix die ne neue Consolen Anwendung erstellt und die Pfade für die Header und Lib files in den Projekteigenschaften eingetragen. So jetzt habe ich noch die entsprechende Header Datei includiert. (und die entsprechende Lib eingebunden). So weit so gut. Ich konnte auf alle Elemente zugreifen. Das sieht dann wie folgt aus: #pragma comment (lib, "Win32.System.lib") #include "stdafx.h" #include <Win32\System\wThread.h> #include <iostream> using namespace std; void TestFunction(); System::Threading::wThread* thread; int _tmain(int argc, _TCHAR* argv[]) { try { thread = new System::Threading::wThread(TestFunction); if (thread->Start()) { while (thread->IsRunning()) { Sleep(1000); } } } catch(ExceptionBase base) { cout << base.GetMessageW() << endl; } return 0; } void TestFunction() { for (int i = 0; i<=1000; i++) { cout << "Position" << " State ==> " << i << endl; } } Als ich den code aber compilieren wollte hab ich folgende Fehler bekommen: Der Inhalt der wThread.h Datei sieht wie folgt aus: #pragma once #pragma comment (lib, "Kernel32.lib") #pragma comment (lib,"hException.lib") #include<Windows.h> #include <Base\baseDef.h> #include <hException\ExceptionBase.h> #include <WinBase.h> namespace System { namespace Threading { #define INVALID_FUNC_POINTER "The function pointer can't be reffering to 0!" #define WTHREAD_INIT_FAILED "Thread creation failed. Check the error code!" enum _export wThreadState{None = 0x1, Running=0x2, Aborted=0x3, Stopped=0x4, Suspended = 0x5 }; class _export wThread { private: wThreadState state; HANDLE handle; LPSECURITY_ATTRIBUTES sAttr; SIZE_T stackSize; LPVOID lpParameter; DWORD creationFlag; LPDWORD threadID; void (*main) (void*); void (*mainW) (); public: wThread(void (*_main)(void*), void* args); wThread(void (*_mainW)()); wThread(void (*_main)(void*), SIZE_T StackSize, void* args); wThread(void (*_mainW)(), SIZE_T StackSize); wThread(LPSECURITY_ATTRIBUTES SecAttr, void (*_main)(void*), SIZE_T StackSize, void* args); wThread(LPSECURITY_ATTRIBUTES SecAttr, void (*_mainW)(), SIZE_T StackSize); ~wThread(void); wThreadState CurrentState(); HANDLE CurrentThreadHandle(); bool Start(); bool Abort(); bool Suspend(); bool Resume(); bool IsRunning(); }; } } Hinter _export verbirgt sich: #define _export __declspec(dllexport) Die dll mit der Klasse wThread compiliert ohne zu murren. Also vermute ich das ich irgendwelche Fehler beim linken oder sonstiges gemacht habe. Fällt euch was ins Auge? Lg Gateway
  2. Gateway_man

    udp client erstellen

    Es gibt Asynchrone Funktionen die dir das ermöglichen. Die UdpClient Klasse verfügt über die Funktionen BeginReceive und BeginSend. Lg Gateway
  3. Hallo, ich versuche aktuell einen Process zu starten. Zum test versuche ich es noch garnicht mit einem andereren User Account sondern mit dem Account mit dem ich gerade angemeldet bin. Jedoch bekomme ich immer den Fehler 1314 zurück. Ich habe mich jetzt schon durch sehr viele Seiten gewühlt, jedoch stellen fast alle die selbe Frage und das Ende vom Lied ist das sie zu keiner Problemlösung kommen. Ich hatte gelesen die Meldung wird geworfen wenn irgendwelche Privilegien fehlen. Was ich bereits versucht habe: -Das Token mit DuplicateTokenEx zu duplizieren (ich hatte gelesen das die Notwendigen Privilegien dann automatisch gesetzt werden) ==> Resultat: Selbiger Fehler mit dupliziertem Token. -Dem Token das Notwendige recht selbst zuweisen mit AdjustTokenPrivileges. ==> Resultat: Laut Rückgabewert von AdjustTokenPrivileges hat das geklappt aber ich erhalte immernoch den selben Fehler beim erstellen des Prozesses. Hier mal die Funktion: //Die Funktion wird aktuell mit folgenden Parametern aufgerufen. //username:****** //pwd:****** //domain:"." //executeable:@"C:\Windows\System32\cmd.exe" //parameter: string.Empty public static bool RunAs(string username, string pwd, string domain, string executeable, string parameter) { int lastError = 0; if (string.IsNullOrEmpty(executeable) || !System.IO.File.Exists(executeable)) return false; NativeStructures.PROCESS_INFORMATION pi = new NativeStructures.PROCESS_INFORMATION(); NativeStructures.STARTUPINFO si = new NativeStructures.STARTUPINFO(); System.IntPtr hToken; // Initialize structs si.cb = Marshal.SizeOf(si); // Get the user token if (LogonUser(username, (string.IsNullOrEmpty(domain)) ? (".") : (domain),pwd, (int)NativeStructures.LOGON_TYPE.LOGON32_LOGON_BATCH, (int)NativeStructures.LOGON_PROVIDER.LOGON32_PROVIDER_DEFAULT, out hToken)) { // Create structs //IntPtr dublicatedToken = IntPtr.Zero; //NativeStructures.SECURITY_ATTRIBUTES sAttr = new NativeStructures.SECURITY_ATTRIBUTES(); //if (!DuplicateTokenEx(hToken, 0x02000000, ref sAttr, NativeStructures.SECURITY_IMPERSONATION_LEVEL.SecurityAnonymous, NativeStructures.TOKEN_TYPE.TokenPrimary, out dublicatedToken)) //{ // KERNEL32.CloseHandle(hToken); //} NativeStructures.TOKEN_PRIVILEGES tp = new NativeStructures.TOKEN_PRIVILEGES(); tp.PrivilegeCount = 1; tp.Attributes = NativeStructures.SE_PRIVILEGE_ENABLED; bool btemp = false; btemp = AdjustTokenPrivileges(hToken, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero); NativeStructures.SECURITY_ATTRIBUTES saProcessAttributes = new NativeStructures.SECURITY_ATTRIBUTES(); NativeStructures.SECURITY_ATTRIBUTES saThreadAttributes = new NativeStructures.SECURITY_ATTRIBUTES(); // Now create the process as the user if (!CreateProcessAsUser(hToken, executeable, parameter, ref saProcessAttributes, ref saThreadAttributes, false, (int)NativeStructures.dwCreationFlags.NORMAL_PRIORITY_CLASS , IntPtr.Zero, System.IO.Path.GetDirectoryName(executeable), ref si, out pi)) { lastError = KERNEL32.GetLastWin32Error(); KERNEL32.CloseHandle(hToken); throw new Exception("Failed to CreateProcessAsUser"); } KERNEL32.CloseHandle(hToken); } lastError = KERNEL32.GetLastWin32Error(); return true; } Mit dem Fehler scheinen wohl viele schon bekanntschaft gemacht zu haben. Ich finde sehr viele Posts wie meinen, aber keinen Lösungsweg . Lg Gateway
  4. Danke euch. Sehr schade das es nicht anders möglich ist. Ich hatte mir für den worst case schon was überlegt aber das kostet mich mindestens zwei Wochenenden und sehr viel Redbull. Ich werde Named Pipes nutzen und mir eine Bibliothek schreiben in der ich Objekte anhand von TypeID und InstanceID registriere. Jedes dieser Objekte muss von Der Basis Klasse erben und wenn ein Objekt intern ein Event wirft werden die EventArgs sowie der Sender deserialsiert und automatisch über die Named Pipes an Clients geschickt die sich für dieses Event beim Server registriert haben. Das soll dann natürlich nicht nur bei Events funktionieren, sonder auch bei Properties und Funktionen. Gibt es eigentlich eine Möglichkeit beim öffnen eines Named Pipe Server zwischen den verbundenen Clients zu unterscheiden? Seit dem .NET 3.5 gibt es ja eine eigene .NET Implementierung und bei den beispielen die ich gesehen habe ist mir aufgefallen das Nachrichten nie direkt an einen Client sondern immer an alle verbundenen Clients geschickt werden. Lg Gateway
  5. Hm, das ist ja alles total umständlich und ich müsste enorm viel schreiben um das einigermaßen so umzubiegen das es für mich brauchar wäre. Bei dem aktuellen Projekt spielen Events eine entscheidende Rolle. Aber bei keinem der Lösungsvorschläge wäre das möglich, da immer nur der Wert übergeben wird. Wenn also der Prozess A ein Event eines Objektes wirft, merkt Prozess B das nicht, weil beide Objekte jeweils getrennt initialisiert wurden (nur eben mit gleichem Inhalt). Ich dachte schon fast dass das die Lösung ist. Bis ich merkte das auch hier der Prozess B nicht auf die selbe Instanz des Objektes zugreift. Warum nennt man das dann bitte Shared Memory. So ein Unsinn. Unter Shared Memory verstehe ich einen Speicherbereich auf dem beide Prozesse Zugriff haben. Und wenn ich dann ein Objekt in diesem Speicherbereich ablege dann sollen beide Prozesse auch auf die selbe Speicheradresse zugreifen wenn diese auf das Objekt zugreifen. Gibts da eine Möglichkeit? Muss auch nicht .Net sein . Kann auch gerne in den unendlichen tiefen von Windows versteckt sein. Ich sehe es ja ein das es einen Schutz gegen fremden Speicherzugriff geben sollte. Aber wenn ich als Entwickler explizieht möchte das Prozess XY Zugriff auf meinen Speicherbereich hat dann sollte mir auch so eine Möglichkeit geboten werden. Da kann ich genauso gut das Objekt serialisiert auf die Platte ablegen und der Prozess B lässt im Timer auf existenz der Datei prüfen und deserialisiert diese dann. Wow was für ein Shared Memory . Lg Simon
  6. So wie mir das erklärt wurde, werden bei Remoting TcpChannels registriert und deren Kommunikation wird mit Windows Comunication Foundation umgesetzt. Aber gut ich lass mich gerne eines besseren belehren. Vielen Dank für die zusätzlichen Schlüsselbegriffe, ich denke ich werd mich mal über die Named Pipes etwas besser informieren. LG Gateway
  7. Hi, danke für die Bestätigung , hab zwischenzeitlich schon einiges darüber erfahren. Im .NET gibt es wohl nur die Möglichkeit per Remoting (WCF) zwei Prozesse zu Synchronisieren. Das gefällt mir persönlich nicht so gut aber wenn es nicht anders geht . Im Prinzip will ich diverse Schnittstellen übergeben die vom Service initialisiert wurden. Diese Schnittstellen verfügen über events, Properties und Funktionen. Allerdings muss ich das bei der Nutzung von Remoting nochmal umdesignen. So ganz nebenbei hätte ich dazu aber dann doch noch eine Fragen. Wie verhält es sich dann bei folgendem Beispiel: Man hat eine Funktion die man über pInvoke aufruft. Diese Funktion verfügt über einen IntPtr Parameter und dieser zeigt auf eine Structure. Das funktioniert auch. Hat die externe Funktion dann nicht Zugriff auf den Speicherbereich meiner .NET Anwendung? lg Gateway
  8. Hallo, ich verstehe das gerade nicht. Ich habe eine Singleton Klasse die als Schnittstelle zwischen zwei Prozessen fungieren soll. Der eine Initialisiert diese mit gewissen interfaces und der andere Process holt sich die Instanzen. Beim Test greift der Prozess der sich die Instanz holen soll jedoch ständig ins leere. Der bekommt immer Null zurück. So nun meine Frage: Kann es sein das Singleton Klassen nur innerhalb eines Prozesses funktionieren? Wir machen das sehr oft in der Arbeit, jedoch greift immer der selbe Prozess auf die Instanzen zu. An sich wäre es logisch das es nicht funktioniert, da effektiv Prozess A auf den Speicherbereich von Prozess B zugreifen würde. Effektiv geht es um folgendes. Ich habe einen Service und suche jetzt nach Möglichkeiten wie ich es schaffe das das Administrationstool (gui Anwendung) mit dem Service kommunizieren kann. Da schien mir Singleton als sehr geeignet.... Natürlich bin ich auch für alternative Vorschläge zu haben. LG Gateway
  9. Hallo, ich versuche jetzt schon seit geraumer Zeit eine meiner .Net Libraries als Com+ zu registrieren. Ich rufe als Regasm /register "Pfad" auf und dann wird mir bestätigt das die Typen registriert wurden. Wenn ich aber nun ins Visual Studio wechsle und auf die Library referenzieren will taucht diese nicht unter dem Reiter Com auf?! Muss ich da irgendetwas beachten? lg Gateway PS: Er scheint die dll korrekt registriert zu haben. Siehe Bild.
  10. So das Thema hat sich mehr oder weniger erledigt. Also es scheint das die enumeration korrekt übernohmen wurden, jedoch heißt der Wert während der Laufzeit anders. Die Properties sind während der Laufzeit Zugreifbar (lesend sowie schreibend). Was mich allerdings etwas stuzig macht ist das er die Signatur versteckt. Das heißt zur Laufzeit werden die Properties vom Debugger nicht angezeigt. Das ist zwar ein störender Schönheitsfehler, aber die Funktionalität wird nicht beeinträchtigt. Ich habe mir diverse andere Umsetzungen angesehn bei dennen aber auch überall während der Laufzeit die Signaturen der Properties versteckt werden. lg Gateway
  11. Nach sehr lange suche bin ich auf eine Anwedung gestoßen die es zumindest einigermaßen brauchbar umgesetzt hat. Das Tool heißt "Just Trace" und ist von Telerik. Leider ist die Anwendung nicht kostenlos. Aber da ich es eh in der Firma brauche geht das. Für die sind das Pinuts xD. lg Gateway
  12. Diese Meldung wird dann erzeugt wenn die Klasse/Funktion die benutzt wird, mit dem Tag "Obsolet" gekennzeichnet wurde. Dieses Tag hat mehrere Überladungen die es auch möglich machen die Nutzung der Klasse/Funktion als Fehler zu Kennzeichnen. Ich würde sagen solange du es noch compilieren kannst, sollte die Klasse/Funktion auch noch funktionstüchtig sein. Aber Gedanken solltest du dir trotzdem machen, da es sein kann das in neueren Versionen der Dll die Klasse/Funktion nichtmehr vorhanden sein könnte. In der Regel wird aber eine Alternative angeboten. Ich würde mal in der Oracle Dokumentation nachsehn was die dazu sagt. lg Gateway
  13. Hi, schau mal bitte nach welches Zielframework für deine Anwendung eingestellt ist. Sollte es Framework 4 Client Profile sein, dann stell es bitte auf Framework 4 um. lg Gateway
  14. Hallo, ich hab mir eine Funktion geschrieben die mir zur Laufzeit Typen generiert. Diese sollen nur als Feldern und Properties bestehen. Aber aus irgendeinem Grund werden die MethodAttributes nicht richtig gesetzt. Ich lasse diese in einer Switch Verzweigung setzten. Testweise hab ich die MethodAttributes auch fix als Public definiert. Aber zur Laufzeit zeigt er mir immer diese als Family an und ich versteh einfach nicht warum. Das ist das snippet um das es sich handelt: FieldBuilder field = null; if (FieldDict.Keys.Contains(cMember.FieldReference)) field = FieldDict[cMember.FieldReference]; if (field != null) { MethodAttributes mod; switch (cMember.Mod) { case Modifier.Internal : mod = MethodAttributes.Family; break; case Modifier.Private : mod = MethodAttributes.Private; break; case Modifier.Public: mod = MethodAttributes.Public; break; default: mod = MethodAttributes.Public; break; } PropertyBuilder property = typeBuilder.DefineProperty(cMember.Name, PropertyAttributes.None, cMember.Value.GetType(), new Type[] { cMember.Value.GetType() }); MethodBuilder currGetPropMthdBldr = typeBuilder.DefineMethod("get_value", MethodAttributes.Public , cMember.Value.GetType(), Type.EmptyTypes); ILGenerator currGetIL = currGetPropMthdBldr.GetILGenerator(); currGetIL.Emit(OpCodes.Ldarg_0); currGetIL.Emit(OpCodes.Ldfld, field); currGetIL.Emit(OpCodes.Ret); MethodBuilder currSetPropMthdBldr = typeBuilder.DefineMethod("set_value", MethodAttributes.Public, null, new Type[] { cMember.Value.GetType() }); ILGenerator currSetIL = currSetPropMthdBldr.GetILGenerator(); currSetIL.Emit(OpCodes.Ldarg_0); currSetIL.Emit(OpCodes.Ldarg_1); currSetIL.Emit(OpCodes.Stfld, field); currSetIL.Emit(OpCodes.Ret); property.SetGetMethod(currGetPropMthdBldr); property.SetSetMethod(currSetPropMthdBldr); Zur Laufzeit sind currGetPropMthdBldr & currSetPropMthdBldr immer Family. Selbst nachdem ich dem Konstruktor beider variablen fix MethodAttributes.Public übergebe. Es ist für mich ein absolutes mysterium. Hier auch als screenshot. Screenshot lg Gateway
  15. Sagt wer? Wenn man die ganzen zusätzlichen Futures der Liste braucht kann man Sie nutzen, wenn nicht, dann braucht man den ganzen Overhead auch nicht mitzuschleppen.
  16. Wir benutzten Team Foundation Server 2010, ein privater lokaler Build über das tfs wäre natürlich bombe . Ich werd mich dahingehend mal informieren. ich hab es mit msbuild bereits versucht. Was seltsam ist ist, das msbuild bei manchen projekten sagt das der build failed und wenn ich die solution mit visual studio compiliere dann gibt es keine probleme. Deswegen hatte ich mich für visual studio entschieden anstatt msbuild. Eventuell hatte ich auch die falschen parameter mitgegeben...
  17. Danke Klotzkopp. Hat funktioniert . Eventuell hab ich mich falsch ausgedrückt. Ich hab das Tool für mich in der Arbeit geschrieben. Unsere Projekte bestehen aus über 200 Teilprojekten und diese Projekte werden über diverse Tfs Server gemanaged/verwaltet. Jeden Abend werden Nightly Builds von allen Projekte gestartet, sodass am nächsten Tag die neusten versionen für alle bereitstehen und die Testsysteme aktualisiert werden können. Und ich wollte letztendlich ein Tool schreiben das mir die möglichkeit bietet ganze Projekte lokal zu compilieren, sodass ich nicht auf die Nightly Builds warten muss. Daher hol ich mir aus dem Tfs die Builddefinition vom entsprechenden Projekt (XML Datei). Dort stehen die namen (und Pfade) aller Solutions drin. Daraus wird eine Liste generiert und das Tool erstellt jede Solution. Das war die Anforderung. Da unser Buildprozess nicht ganz der Norm entspricht hatte ich wenig Lust mir ein Tool zu suchen das so enorme Anpassungen gestattet, daher hab ich mir schnell selbst ein kleines Tool geschrieben....
  18. Hi leute, ich schreib ein tool das automatisiert solutions compiliert. Das ganze soll mit vs2010 gemacht werden. Das erstellen geht easy und funktioniert auch. Nur wenn ich noch den Parameter /out mitnehme funktioniert es nichtmehr. Hier die msdn beschreibung Hier ein beispiel Argument von mir: Das Argument ist nicht zu lang das hab ich bereits geprüft (240 Zeichen). Jedesmal öffnet sich beim Prozess-Start die Argumentenbeschreibung. Sieht jemand einen Fehler? lg Gateway
  19. Hi, zeig doch mal wie du die Zeile löschst. Benutzt du Databindings? lg Gateway
  20. Hi, ich bin zwischenzeitlich an mehr Informationen gekommen, die mich aber noch mehr verwirrten. Der Exception Inhalt sieht wie folgt aus: Ich könnt hier echt gleich ausflippen . Zur Laufzeit sagt er mir die Funktion existiert nicht, aber warum wird mir dann die Funktion in der InteliSense Liste angezeigt?! Und warum lässt er mich dann überhaupt compilieren?! Das ist alles mehr als verwirrend. lg Gateway EDIT: Rätsel gelöst. Ich weiß nicht warum aber Visual Studio scheint die Utility Library nicht mehr beim starten des Debug Vorgangs ins lokale Verzeichnis zu kopieren. Warum das so ist weiß ich allerdings nicht. Danke für deine Hilfe.
  21. Die Klasse ExplorerEntity befindet sich innerhalb der Dev86UI.dll. Und nein mit der Plattform hat es nichts zu tun und es gibt auch keine Dev64UI.dll (das 86 hat nichts mit der Plattform zu tun). Ich habe in Erfahung gebracht das dieser Fehler häufig auftritt wenn Verweise auf Libraries gesetzt wurden, welche ein niedrigeres Zielframework besitzten. Daraufhin habe ich alle Verweise der jeweiligen Projekte überprüft. Jedoch nutzten alle das Zielframework 4.0. Sitze gerade ziemlich in der Sackgasse. lg Gateway
  22. Es kommt keine Fehlermeldung. Im Output Fenster steht lediglich folgendes: lg Gateway
  23. Hi, ich hab aktuell das Problem das eine Anwendung ständig abschmiert aufgrund einer Funktion die eine Exception auslöst. Das skurile daran ist das ich bis zu dem Aufruf debuggen kann, er aber nicht an dem Breakpoint innerhalb der aufgerufenen Funktion anhält sondern direkt die Exception wirft. Als würde der Aufruf selbst fehlerhaft sein. Ich habe bereits die Signaturen überprüft und diese Stimmen überein. Nichts desto trotz erhalte ich ständig eine "System.TypeLoadException". Hier ist der Code der Klasse: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using System.Drawing; using System.Timers; namespace Dev86UI.FileExplorer.Windows.Components { [Serializable()] public sealed class ExplorerEntity { #region Fields private ExplorerEntityType type = ExplorerEntityType.Undefined; private FileNameVisibility filenameType = FileNameVisibility.Undefined; private EntitySizeMode entitySizeMode = EntitySizeMode.Normal; private ImageSizeEnum sizeMode = ImageSizeEnum.Normal; private string value = string.Empty; private string fullpath = string.Empty; private string preparedValue = string.Empty; private Icon ico; private Size size; private bool isSelected; private Point location; #endregion public ExplorerEntity(ExplorerEntityType EntityType, Icon ico, FileNameVisibility type, string Value, string fullpath,EntitySizeMode entitySizeMode) { this.type = EntityType; this.filenameType = type; this.value = Value; this.fullpath = fullpath; this.entitySizeMode = entitySizeMode; switch (entitySizeMode) { case EntitySizeMode.Large: this.sizeMode = ImageSizeEnum.Large; break; case EntitySizeMode.Normal: this.sizeMode = ImageSizeEnum.Normal; break; case EntitySizeMode.Small: this.sizeMode = ImageSizeEnum.Small; break; } //Bis hierhin kann ich debuggen dann steigt die Anwendung aus. //Die Breakpoints am Anfang von SetNewIcon werden ignoriert und //eine System.TypeLoadException wird geworfen. this.SetNewIcon(entitySizeMode, ico, EntityType); } #region Properties public string FullPath { get { return fullpath; } set { fullpath = value; } } public ExplorerEntityType Type { get { return type; } set { type = value; } } public string Value { get { return value; } set { this.value = value; } } internal Point Location { get { return location; } set { location = value; } } internal Size Size { get { return size; } set { size = value; } } internal string PreparedString { get { return preparedValue; } set { preparedValue = value; } } internal Icon Icon { get { return ico; } set { //ico = value; SetNewIcon(entitySizeMode, value, type); } } #endregion #region Functions //Das ist die besagte Funktion die aufgerufen wird. internal void SetNewIcon(EntitySizeMode entitySizeMode, Icon ico, ExplorerEntityType exType) { if (ico != null) { if (this.ico != null) { this.ico.Dispose(); } this.entitySizeMode = entitySizeMode; this.type = exType; switch (entitySizeMode) { case EntitySizeMode.Large: this.sizeMode = ImageSizeEnum.Large; break; case EntitySizeMode.Normal: this.sizeMode = ImageSizeEnum.Normal; break; case EntitySizeMode.Small: this.sizeMode = ImageSizeEnum.Small; break; } Size sz; if (exType == ExplorerEntityType.Folder) { Icon tempIcon = Dev86UI.Properties.Resources.folder; sz = this.sizeMode.GetSize(); this.ico = Utility.ImageUtil.ImageConverter.ResizeIcon(tempIcon, sz.Width, sz.Height); tempIcon.Dispose(); } else { if (ico != null) { this.ico = ico; } else { this.ico = Dev86UI.Properties.Resources.FileIco; } sz = this.sizeMode.GetSize(); if (!Utility.Util.CompareSizes(sz, this.ico.Size)) { Icon tempIco; tempIco = (Icon)this.ico.Clone(); this.ico.Dispose(); this.ico = Utility.ImageUtil.ImageConverter.ResizeIcon(tempIco, sz.Width, sz.Height); tempIco.Dispose(); } } } } #endregion } } Sieht jemand etwas auffälliges? lg Gateway
  24. Das max bedeutet nur das er bei einer Abweichung darüber hinaus das ganze Bild nehmen soll. Beispiel bei 95 % Abweichung braucht er den Bereich der sich geändert hat nicht extahieren. Dann soll er gleich den ganzen Bereich nehmen... Meinst du Prozentual?! An sich wird das ganze recht einfach gemacht. Die Cpp Funktion hat beide Bilder. Vor beginn des Vergleiches wird die GesamtPixel Anzahl erreichnet. (Width * Heigth) Am Ende der Funktion wenn der Vector alle Pixel beinhaltet die sich geändert haben wird folgendes gemacht: Percentage = (Vector.Size() / GesamtPixel) * 100 Was du jetzt mit der Farbtiefe willst weiß ich zwar nicht aber wie ich es berechne hast du oben schon gesehn. (Nebenbei bemerkt, werden nur ganz bestimmte Bilder in der Vergleichsfunktion unterstützt) Das halte ich für eher unwarscheinlich. Du kannst dich nur an Dinge hängen die auch über ein Handle verfügen und vom OS Messages erhalten. Was machst du also wenn Anwendung xy mit GDI einen Kreis auf HWND 0 zeichnet. Ich wüsste nicht wie ich mich daran hängen sollte. Ich wusste das es ein Fehler war auf den Einsatzzweck näher einzugehen, weil man leicht in Versuchung kommt und sich zu sehr auf die Funktion fixiert welche die Bilder vergleicht. Es geht mir nicht darum eine bereits funktionierende Funktion zu ersetzten. Und auch wenn mir das einige nicht glauben möchten. Der Vergleich sowie das extrahieren der veränderten Daten läuft aktuelle bei einer Auflösung von 1920x1080 innerhalb von 0,03571 Sekunden ab. Damit bin ich mehr als Zufrieden. Ist ja nicht so als würde ich 19201080 mal bmp1.GetPixel(x,y) != bmp2.GetPixel(x,y) performen. Es ging mir einzig allein darum die nicht veränderten Pixel aus dem Rechteck zu bekommen indem ich multiple kleinere Rechecke bilde auf Basis eines Vektors der die Pixeldaten innehält. Und das wenn möglich ohne die momentan akzeptable Dauer des ganzen Prozesses groß zu beeinflussen. Das Problem das aus dem oben genannten Problem resultiert ist folgendes: Wenn sich zwei Bildpunkte ändern, die jedoch weit voneinander entfernt sind, wird ein großes Rechteck gebildet und das ist kontraproduktiv wenn ich versuche den Netzwerktraffic so gering wie möglich zu halten. lg Gateway
  25. Aktuell wird entweder ein ganzes Bild oder nur der partielle Teil der sich geändert hat übertragen (teilweise Redudant bei der partiellen Übertragung). Das Prinzip ist einfach. Solange das Modul aktiv ist wird von der .NET Anwendung eine Funktion einer Cpp Library aufgerufen. Deren Signatur sieht wie folgt aus: bool ExtractChangedRectangleExt(IntPtr hbmp, IntPtr hbmp1, int min, int max, ref ImageCompareResult result); Der min Wert definiert die Prozentual minimal benötigte Abweichung beider Bilder. Erst wenn dieser Wert überschritten ist, wird das Rechteck berechnet das den veränderten Inhalt beinhaltet. Der max Wert definiert die Prozentual maximale Obergrenze. Die .Net Anwendung arbeitet dann mit dem ImageCompareResult objekt weiter. Darin ist der fehlercode definiert (Sofern ein Fehler auftrat), sowie die prozentuale Abweichung beider Bilder und das Rechteck das sich geändert hat. Aktuell wird ein Rechteck dann ermittelt wenn eine Abweichung von mindestens 2 Prozent erreicht wurde. Das Recheckt wird berechnet. Die Bildpunkt-Informationen werden extrahiert und das Ergebnis wird verschlüsselt über einen Socket in der .NET Anwendung gesendet. Ich werde mich dahingehend mal etwas weiter Informieren. Es geht mir nicht um kompatibilität. Das wäre aktuell garnicht möglich da die alternativanwendungen die du aufgezählt hast nichts mit den Daten anfangen könnten (Daten werden über ein nicht properitäres Verfahren verschlüsselt). Dann gibt es noch faktoren wie: - Mögliche Probleme mit Lizenzen von Drittanbietern. - Da die Anforderungen zweifelsohne eine Anpassung der Fremdkomponenten notwendig macht müsste es eine Open-Source Lösung sein die gut Dokumentiert ist. Es geht mir letztendlich darum die bestehende Lösung zu verbessern. Aber wir schweifen vom Thema ab. Es geht hier keineswegs um das gesamte Modul (da dies ja schon funktioniert), sondern lediglich um die sinvolle Gruppierung der geänderten Bildpunkte. (vorzugsweise in Geometrischen Formen). Ich werde testweise die aktuelle Funktion fertig implementieren und mich dann nocheinmal melden um meinen Lösungsweg zu posten. Eventuell fällt dem ein oder anderen noch ein Weg ein das ganze noch etwas flotter zu gestallten. lg Gateway

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...