Laden...

Forenbeiträge von GMLOD Ingesamt 1.200 Beiträge

07.01.2009 - 13:33 Uhr

Hier 39,00€.

Werden in Moskau hergestellt. g

07.01.2009 - 13:20 Uhr

Es ist echt saukalt zur Zeit.

Deswegen bestelle ich mir jetzt so ein paar sibirische Filzstiefel.

http://www.walenki.de/produkt.html

Die halten angeblich auch noch bei -50 Grad die Füße warm.

Werde dann über meine Erfahrungen damit berichten.

07.01.2009 - 12:59 Uhr

Letztendlich arbeitest du sowieso nur mit Ranges in Excel.

Probier mal:

foreach(Range row in sheet.Rows)

Musst aber wahrscheinlich mit Laufvariablen arbeiten.

07.01.2009 - 12:36 Uhr

Das dürfte auch mit allen MediaPlayer Plugins funktionieren, die den Codec kennen.

Es ist ja mittlerweile ein Quasistandard, dass man die Video-Dateien in das Flash-Videoformat konvertiert und dann über den Flashplayer streamed. Diesen Weg würde auch ich gehen. Allerdings muss dafür jedes Video in das Flash Format konvertiert werden.

Es gibt ja auch den Flash Media Server. Der kostet allerdings.

Zur Not kann man immer noch auch QuickTime ausweichen, mit diesem Format hatte ich noch unter keinem System Probleme.

07.01.2009 - 12:28 Uhr

Das Problem ist die Wildcard '%'. Die darf nicht in der Parameterbezeichnung stehen.

Falsch:

"WHERE bezeichnung LIKE '?p1%'";

Richtig:

"WHERE bezeichnung LIKE ?";
cmdSelect.Parameters.Add("?p1", MySqlDbType.VarChar).Value = edPlatineSelect.Text + "%";

oder

"WHERE bezeichnung LIKE CONCAT(?, '%')";
cmdSelect.Parameters.Add("?p1", MySqlDbType.VarChar).Value = edPlatineSelect.Text;
07.01.2009 - 12:07 Uhr

Ich hab Standard XP mit diesem Fallout Wallpaper.

07.01.2009 - 11:58 Uhr

Musst du zwangsläufig so machen.

Du kannst allerdings über einen Handler feststellen, was mit der Konsole (Shell) gerade geschieht. Allerdings kannst du das nicht so einfach verhindern.

http://www.pinvoke.net/default.aspx/kernel32/SetConsoleCtrlHandler.html

[DllImport("kernel32.dll")]
static extern bool SetConsoleCtrlHandler(ConsoleCtrlDelegate HandlerRoutine,
   bool Add);
User-Defined Types:

// Delegate type to be used as the Handler Routine for SCCH

delegate Boolean ConsoleCtrlDelegate(CtrlTypes CtrlType);

// Enumerated type for the control messages sent to the handler routine

enum CtrlTypes : uint {

   CTRL_C_EVENT = 0,
   CTRL_BREAK_EVENT,
   CTRL_CLOSE_EVENT,  
   CTRL_LOGOFF_EVENT = 5,
   CTRL_SHUTDOWN_EVENT
}

private static bool ConsoleCtrlCheck(CtrlTypes ctrlType)
{
     if(ctrlType == CtrlTypes.CTRL_CLOSE_EVENT) //Konsole schliesst

    /* ... snip ... */

    return true;
}


/* ... snip ... */

SetConsoleCtrlHandler(new HandlerRoutine(ConsoleCtrlCheck), true);
07.01.2009 - 10:28 Uhr

In dem Fall ist doch ganz klar was man macht:

Das Ribbon bekommt im Konstruktor eine Referenz auf das AddIn mit.

new Microsoft.Office.Tools.Ribbon.RibbonManager(new RibbonDDT(this));

Ich glaube ausserdem, dass das Ribbon sowieso schon irgendwo so eine Referenz hält! Suche doch mal nach Properties wie Parent, AddIn, Container oder Manager.

07.01.2009 - 10:22 Uhr

Wieso aber geht dann das:

alleDaten.VersionSet.Where(vs => vs.ProjektName == "PEKA")

Tippe weiterhin auf Nullbytes.

07.01.2009 - 10:13 Uhr

Das denke ich nicht, denn der == Operator ist für den Reference-Type string überladen und vergleicht die Inhalte.

Ich vermute eher 0 Bytes oder verschiedene Encodings.

07.01.2009 - 10:09 Uhr

Um dieses Problem zu lösen und die Nachteile von globalen Variablen zu vermeiden benutzt man in der OOP oft das Singleton Pattern.

Hier eine generische Variante:

public static class Singleton<T> where T : new()
{
    static Mutex mutex = new Mutex();
    static T instance;
    public static T Instance
    {
        get
        {
            mutex.WaitOne();
            if(instance == null)
            {
                instance = new T();
            }
            mutex.ReleaseMutex();
            return instance;
        }
    }
}

Nutzung:

Singleton<YourType>.Instance.DoSomething();

Quelle: http://sanity-free.org/132/generic_singleton_pattern_in_csharp.html

07.01.2009 - 09:21 Uhr

Bei so vielen Datensätzen solltest du unbedingt mit der VirtualMode der DataGridView arbeiten!

Ansonsten ganz easy mit dem BackgroundWorker: Siehe MSDN, da ist ein langes Beispiel mit dabei.

Ich möchte dir auch folgendes Snippet von ErfinderDesRades ans Herz legen: [ExtensionMethods]CrossThread-Calls

Allerdings brauchst du dafür .NET 3.5

06.01.2009 - 20:12 Uhr

Wenn es sich wirklich um eine Eigenschaft handelt, die alle Personen haben, die aber unterschiedliche Ausprägungen haben kann, sollte man hier vielleicht wirklich mit einer abstrakten Basisklasse oder einem Interface arbeiten. Und zwar für den Typ der Eigenschaft, schließlich handelt es sich wohl um eine "Each person has a" relationship.

Wenn die Eigenschaft einfach nur durch einen String oder ein Enum-Wert repräsentiert werden kann, ist FemaRef's Lösungsvorschlag völlig ausreichend.

06.01.2009 - 19:59 Uhr

Man updated den DataAdapter nicht in jeder Iteration!

Das macht man einmal am Ende.

foreach (DataRow row in archivDatas.Rows)
            {
                    archiv.ImportRow(row);
            }

archivAdapter.ContinueUpdateOnError = true;
archivAdapter.Update(archiv);

06.01.2009 - 19:54 Uhr

Ich würde lieber einen Predicate<T> übergeben und die FindAll Methode von List<T> benutzen. Damit ist man was das Filtern betrifft äusserst flexibel. Bzw. Ich würde gar nicht damit anfangen, so eine Methode zu bauen, sondern gleich die FindAll Methode benutzen.

05.01.2009 - 16:39 Uhr

ch bin auch nur auf die Annahme gekommen, dass es eine Art Service gibt, die Google neue Domains mitteilt.

Muss ja nicht zwangsläufig ein Service sein. Die betreiben doch sicher ihre eigenen DNS und wenn die vom Master eine neue Domain oder ein neues Mapping bekommen, wird halt ganz einfach mal nachgeschaut, was da so ist.

05.01.2009 - 14:54 Uhr

Architektur kann vieles bedeuten. Bei Linux/UNIX lädt man z.B. seine Version oft für die Prozessorarchitektur, die man hat (z.B. i386 für eine Intel 386 Version). Manchmal funktionieren bestimmte Pakete auf bestimmten Architekturen z.B. nicht.

Ich denke, das Wort "plattformunabhängig" trifft es schon ziemlich gut, denn es geht hier wohl darum, dass mein kein maschinenabhängiges Kompilat mehr erstellen muss, sofern man eine Runtime hat.

Edit: Ist vielleicht auch ganz gut zu wissen, dass manche Distributionen statt dem Begriff "Architecture" "Platform" verwenden.

05.01.2009 - 14:37 Uhr

Im DNS als neuen Eintrag gefunden und einfach mal ausgecheckt?

Auf blöd scant google auch IP-Ranges, denen trau ich alles zu. Schließlich wollen Sie ja bester Spürhund sein.

05.01.2009 - 14:27 Uhr

Ist ja deine Sache, wie du die Form aussehen lassen willst.

05.01.2009 - 14:08 Uhr

Probiers auch mal auf nem anderen System. AutoSize kann ich mir eigentlich nicht als Übeltäter vorstellen.

05.01.2009 - 14:01 Uhr

Du willst uns nicht im Ernst auf Klammernsuche schicken, oder?

[Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen)

Geh doch einen Quelltext mal durch, irgendwo stimmts halt nicht. Muss ja nicht zwangsläufig in der Nähe der geposteten Methode sein.

05.01.2009 - 13:55 Uhr

Zeig mal die komplette Initialisierung der DataGridView aus der InitializeComponent Methode. Oder am besten gleich die ganze InitializeComponent Methode.

Dauert evtl. nur der Fill so lange und es hängt an anderer Stelle? Bist du dir 100% sicher, dass das die Stelle ist?

04.01.2009 - 04:15 Uhr

Am besten du setzt dafür auf einen O/R Mapper, der eh schon alle gewünschten DBs unterstützt. Diese bauen den Datenzugriff dann zumeist per Dependency Injection auf und du benötigst hoffentlich nirgends mehr blankes SQL, denn es hält sich eh kein Anbieter an die Standards dabei.

Selber bauen würde da relativ viel Zeit kosten.

04.01.2009 - 03:11 Uhr

Die Heisenberg'sche Unschärferelation tut das nicht, aber es gibt andere Sachen, die das tun, Determinismus ausschließen. Aber Experimente am Doppelspalt sagen eigentlich chon deutlich aus, dass die Welt nicht deterministisch sein kann, jedenfalls nicht in den Dimensionen, die wir wahrnehmen. Weil wenn du dir jetzt theoretisch eine Instanz denkst, die die Elektronen in diesem Doppelspaltexperiment steuert und davon ausgehst, dass diese Instanz auch wieder deterministisch ist, dann wäre kompletter Determinismus wieder möglich.

yadda yadda yadda, quack quack quack, kein Wort verstanden, bin kein Physiker.

Ich persönlich gehe übrigens wirklich davon aus, dass es so eine Instanz gibt (die allerdings nicht deterministisch agiert), nenne sie Gott und bin deshalb spirituell.

03.01.2009 - 16:31 Uhr

Der Zufall spielt in der Softwareentwicklung IMHO eine sehr geringe Rolle (Höchstens vielleicht bei Fehlern, die ein Programmierer "zufällig" übersieht und zu einem anderen Zeitpunkt "zufällig" entdeckt).

Ein zufälliger Code kann seine Aufgabe nicht erfüllen, da nur vom Zufall abhängig ist, was er eigentlich macht.

Der Meinung bin ich auch. Allerdings stellen Quantencomputer das ein wenig auf den Kopf. Hier wird kontrolliert "echter" Zufall ausgenutzt. Sogar das Ergebnis ist zufällig. Das spielt aber für manche Berechnungen keine Rolle oder man wiederholt sie so oft, bis man mit einer gewissen Wahrscheinlichkeit, die gut genug für den Programmierer ist, sagen kann, dass das Ergebnis "richtig" ist.

Genau das ist halt das tolle an den Quantencomputern. Ändert sich der Status eines Registers, ändern sich alle potentiell möglichen Status gleich mit. Der Wert, den man aus dem Quantenregister holt, ist zufällig.

Ich finde zwar gerade keinen guten Artikel darüber, aber die Welt ist nun einmal zufällig und unvorhersehbar. Die erste Erkenntnis war die Unschärferelation.

Man könnte auch argumentieren, dass man bisher kein Modell gefunden hat, dass die Quantenwelt so beschreiben kann. Die Heisenbergsche Unschärferelation schliesst Determinismus nicht aus. In meinem Verständnis geht es da eher um "unprüfbares".

03.01.2009 - 13:53 Uhr

Für mich gilt: selbst definiert = willkürlich festgelegt = zufällig
Diese Einstellung musst du jedoch nicht unbedingt mit mir teilen.

Dann muss ja gerade die Mathematik hochgradig willkürlich für dich sein. Du tust ja gerade so, als ginge es in der Mathematik um unumstößliche Gesetze. Das stimmt doch aber gar nicht. In der Mathematik legen wir diese Gesetze fest.

Das eben die Informatik am Anfang irgendwie definiert wurde, also indem ein Computer mit Stromstössen gebaut wurde.
Hätte man damals mit einem Quantencomputer angefangen, wäre das programmieren sicher anders.

Das hat doch aber nichts mit Zufall zu tun (ausser die Funktionsweise des Quantencomputers).

Noch mehr "selbst definiert" ist die Programmiersprache. Das ist aber insofern ok, da man irgend eine Verständigung der Stromstösse und dem Programmierer benötigt. Das ist aber in der Mathematik das einzig selbst definierte.

Was ist in der Mathematik das einzig selbst definierte? Die Mathematik startet ähnlich der Philosophie aus dem Nichts heraus. Du musst erstmal einige fundamentale Dinge vorraussetzen (definieren)!

Ich behaupte, dass jemand, der keine Ahnung von Mathematik hat (ausser vielleicht den Grundrechenarten) ein gutes Programm schreiben kann.

Das Programm möchte ich mal sehen. Jemand, der keine Ahnung von "konreter/angewandter" Mathematik hat (z.B. jemand, der nicht weiss, was eine Zahl ist), wird sich vermutlich sehr schwer tun.

03.01.2009 - 00:36 Uhr

Mathematik ist doch gerade eben im Gegensatz zur Informatik nicht zufällig!
Die Schreibweise vielleicht, aber der Hintergrund, um den es geht, der ist aufgebaut auf einem komplett logischen Fundament.

Ich weiss zwar nicht, wie du jetzt auf Zufall kommst, aber eines ist relativ sicher: Wie die Logik unseres Systems funktioniert, definieren wir selbst.

Im übrigen kann ich nicht nachvollziehen, wie du in diesem Kontext das Wort "zufällig" gebrauchst. Was ist denn an der Informatik "zufällig"?

Die Informatik selbst baut zwar schon auf Mathematik auf, aber mit den Programmiersprachen kommt man (leider) auch um die Mathematik herum.

Was meinst du damit genau?

02.01.2009 - 21:29 Uhr

Ich denke, Programmieren wie auch das Betreiben der Mathematik erfordert einen hohen Grad an Abstraktion, daher kommt vermutlich auch das Gerücht, dass Programmierer gut in Mathe seien. Früher war Quellcode noch wesentlich kryptischer als heute und genauso wie komplizierte mathematische Formeln für viele Leute Hieroglyphen sind, waren es "Computercodes".

Ausserdem, das darf nicht vergessen, Computer sind Rechenmaschinen und wurden vor allem in ihren Anfängen in erster Linie dafür gebraucht, komplexe Berechnungen durchzuführen.

Ausserdem:
Was ist denn die Mathematik letztendlich anderes, als eine universelle Sprache, die bestimmten Regeln und Gesetzen folgt (die wir selbst definieren). Mit den Programmiersprachen verhält es sich ähnlich. Wir definieren diese Sprachen um Abläufe zu steuern oder Gegebenheiten zu beschreiben. Nichts anderes tut die Mathematik, wenn auch ungleich universeller und mächtiger.

Es gibt kein Ding auf dieser Erde, das man nicht mathematisch sehen könnte.

02.01.2009 - 09:30 Uhr

Die Schlüsselwörter minus oder not exists oder union sollten dir weiterhelfen.

Ungefähr so:

create or replace view comparison_view as
select * from table1 a 
where not exists (select 1 from table2 b where a.id=b.id)
and     not exists (select 1 from table3 c where a.id=c.id)
and     not exists (select 1 from table4 d where a.id=d.id)
union all
select * from table2 a 
where not exists (select 1 from table1 b where a.id=b.id)
and     not exists (select 1 from table3 c where a.id=c.id)
and     not exists (select 1 from table4 d where a.id=d.id)

-- usw.

Natürlich musst du die where clauses in den queries entsprechend aufbohren, wenn du mehrere Werte vergleichen willst. Notfalls noch eine Origin Column mit in die View packen.

Weg 2:


create or replace view comparison_view as
select * from table1 minus select * from table2 minus ...
select * from table2 minus select * from table1 minus ...

01.01.2009 - 13:46 Uhr

Posted eure Lieblingscocktails samt Rezept (nicht das offizielle Rezept, sondern euer eigenes).

Top Drink: Touchdown

   * Maracujasaft 6cl
    * Wodka 6cl
    * Apricot Brandy 3cl
    * OrangensaftAlc. 2cl
    * ZitronensaftAlc. 2cl
    * GrenadineAlc. 1cl

Das ganze mit wenig Eis shaken.

Der Cocktail ist sehr bekömmlich und man merkt rein gar nicht, wie viel Alkohol man sich reinschüttet. Gleichzeitig enthält er genug Vitamine und sonstiges gesundes Zeug um den Kater am nächsten Tag erträglicher zu machen.

01.01.2009 - 13:31 Uhr

Ich werde sicher keine PM schreiben um eine "Wie stark ist euer Kater" Umfrage erstellen zu lassen.

Ich fordere: Umfragen für alle im Offtopic-Bereich!

31.12.2008 - 17:28 Uhr

Jarrrr, guten Rutsch!

http://www.youtube.com/watch?v=KMU0tzLwhbE

Auch im neuen Jahr gilt: Immer schön developen!

31.12.2008 - 14:56 Uhr

@Smou

Ach ja, und beizeiten solltest du auch mal diesen Part

private int Main()
{
   string programmingSkills = getMySkills("programming")
   return = 1;
}

deiner Signatur korrigieren. Das kompiliert nämlich nicht. Über die "Sinnhaftigkeit" dieses Snippets aus Programmierersicht lässt sich auch streiten, selbst wenn es nur als Signatur dienen soll.

31.12.2008 - 14:38 Uhr

Das bringt ihm nur nichts, damit kann er zwar ein paar Dinge überwachen, aber nichts modifizieren/verhindern/umleiten.

Hier noch ein weiterer interessanter Artikel:

http://www.windowsitlibrary.com/Content/356/06/2.html

The easiest way to put a hook into the system services is to locate the System Service Dispatch Table used by the operating system and change the function pointers to point to some other function inserted by the developer. **:::

31.12.2008 - 14:28 Uhr

Um das so zu tun, wie es dir vorschwebt, muss der Prozess, der überwacht werden soll, schon vollständig in einer Sandbox gestartet werden, sprich, alle Systemcalls müssen verbogen sein.

Dafür gibt es mehrere Wege, z.B. eine ProxyDLL zu erstellen. Du musst ja fast bis auf Kernel Level runter, hier ein Artikel dazu, der als Beispiel die Registry überwacht: http://www.ddj.com/184410109

Warum willst du das eigentlich tun?

31.12.2008 - 13:52 Uhr

Digittrade war ein guter Kauf. Auch mit der kleinen Antenne bekommt man im Münchner Norden ein qualitativ hochwertiges Bild und 21 Sender, die zusätzliche Aktiv-Antenne hätte man gar nicht kaufen müssen.

Die Software ist ok, die Installation verlief schnell und ohne Probleme. Hat allerdings eine Weile gedauert, bis wir rausfanden, dass nach der Installation ein Neustart notwendig ist um die Fernbedienung in Betrieb zu nehmen.

Ist ein gutes Produkt.

31.12.2008 - 12:03 Uhr

Eine Matrix multipliziert mit ihrem Inversen ergibt die Identitätsmatrix, also quasi das neutrale Element. Ein neutrales Element ist bei der Multiplikation z.B. die 1, denn 15 ist 5, 110 ist 10 usw.

Wenn die Matrix von Objekt A=Matrix von Objekt B wäre, würde bei A*B^-1 die Identitätsmatrix rauskommen und damit lägen die beiden Objekte genau übereinander. Ist dem nicht so, erhälst du eine andere Matrix (ungleich der Identitätsmatrix). Diese kannst du verwenden um rauszufinden, welcher Punkt in Objekt A mit welchem Punkt in Objekt B korrespondiert um so die Stelle der Kollision festzustellen.

30.12.2008 - 09:32 Uhr

Habe jetzt folgendes erworben:

Digittrade DVB-T Stick USB 2.0 & 1.1 TV-Karte extern (für Windows, Linux und Mac)

und zusätzlich eine etwas stärkere Antenne:

Clixxun vube alpha aktive DVB-T Antenne LRR DVBT schwarz

Werde über die Ware berichten, sobald ich sie getestet habe.

28.12.2008 - 23:17 Uhr

Er hat einen Pointer und will wissen, was das ist, auf das der Pointer draufzeigt.

Er möchte z.B. wissen, auf was für einen Datentyp bzw. Klasse sein Pointer zeigt und wie er dann an deren Member rankommt. Ihm schwebt wohl so eine Art Reflector für nativen Code vor.

Das ist leider nicht so ohne weiteres möglich.

28.12.2008 - 18:54 Uhr

Hört sich für mich nach einem Fall für die Strategy Pattern an.

edit: zu wenig gelesen. Im Prinzip nutzt du ja schon eine Art Strategy Pattern. Persönlich würde ich zu Version 2 tendieren und den Typen mit angeben, diesen dann instanziieren.

Natürlich könntest du auch einfach eine Factory zur Verfügung stellen, die die verschiedenen Patterns je Typ bereit stellt und da drin die Creational Logic für IHandle kapselt. Dann müsste aber ein Drittbenutzer unter Umständen auch seine eigene Factory zur Verfügung stellen und einmal übergeben.

27.12.2008 - 23:10 Uhr

Wenn der Cursor per DirectX gerendert wird kommt man da mit .NET oder WinAPI nicht weit.

Da muss man eher den Speicherbereich überwachen, in dem der Cursor oder dessen Referenz liegt und bei Änderung reagieren. Oder die Schnittstelle replizieren und eine Proxy DLL zwischenschalten.

Wird nicht leicht.

26.12.2008 - 18:17 Uhr

Muss sagen, dass ich Inukis Ansatz für weit sauberer halte. Desweiteren sollte man auch Karte und Deck in eigene Klassen packen, damit das ordentlich gekapselt ist.

Das Pokerspiel an sich sollte ebenfalls eine eigene Klasse sein.

26.12.2008 - 17:48 Uhr

Ich kenne mich mit der Problemstellung nur rudimentär aus, hab so etwas noch nie gemacht.

Aber meines Wissens brauchst du eine Bridge zwischen Java und .NET. Es gibt etliche, vielleicht findest du auch irgendwas, das Open Source ist.

Du wirst aber vermutlich nicht darum herumkommen, die Runtime von Java (zumindest als DLL) und die benötigten Java-Libs mitzuliefern.

26.12.2008 - 16:30 Uhr

Schreib doch das Schlüsselpaar einfach in eine Datei raus und erstelle es nur neu, wenn die Datei noch nicht existiert.

25.12.2008 - 23:00 Uhr

Das Wort Ausnahme ist sicherlich nicht unsinnig. Es beschreibt lediglich eine Abweichung vom Regelfall.
Naa. Ausnahmen können nur Menschen machen.
Das hat was mit Großzügigkeit und Macht zu tun. Nämlich von menschengemachten Regeln kann man Ausnahmen machen. Das mein ich mit willkürlich - hat mit chaotisch nix zu tun. Aber eben erst recht nix mit Computern.
Im Computer gehtes aber um mathematische und naturgesetzliche Regeln.
Und Ausnahmen von Naturgesetzen werden gemeinhin eher als "Wunder" bezeichnet 😉.

Ich finde, du betrachtest das vom falschen Standpunkt. Es geht hier doch nicht um Wunder. In der Regel trifft beim Gewitter sicherlich kein Blitz dein Haus, aber wenn doch, dann hast du besser ExceptionHandling in Form eines Blitzableiters, sonst krachts nämlich.

Ob und wann der Blitz einschlägt, kann man natürlich nicht wissen. Selbst wenn man die Gesetze vollständig kennen würde, wären unsere Computer wohl nicht in der Lage es zu berechnen. Deswegen trifft man eine generelle Vorkehrung um diesen Fall zu behandeln. Ebensowenig liegt es in der Hand deines Computers oder deines Programmes zu wissen, wann bspw. ein benötigter und normalerweise vorhandener Web Service ausfällt oder gar fehlschlägt. Oder wann deine Internetverbindung ausfällt, der Wackelkontakt am Router zuschlägt. In einem deterministischem Weltbild, wie du es scheinbar hast, könnte man so etwas natürlich wissen.

Aber:
Es geht hier nicht um Wunder oder Unkenntnis der Gesetze, es geht doch ausschliesslich um Informationsmangel, der, bei dem Weltbild, dass ich dir unterstelle, ausgeglichen werden muss. Das hat doch rein gar nichts mit Willkür zu tun. Viel mehr geht es darum, dass die oben beschrieben Szenarios eine Abweichung vom Regelfall darstellen und unter Umständen gesondert behandelt werden müssen.

25.12.2008 - 22:26 Uhr

Ich möchte auch keinen Namen oder sonst was, sondern nur die Adresse. Mit dieser kann ich mittels ->* bzw. .* arbeiten.

Nein, kannst du nicht, es sei denn es handelt sich um ganz simple Typen wie Integers oder Signaturen von C-Funktionen die du genau kennst. Wie soll das gehen Es gibt keine symbolischen Namen mehr in der Binary.

Du kannst also nicht einfach

aPtr->aMethod()

schreiben.

Und selbst wenn, müsste das nochmal neu kompiliert werden. Allerhöchstens kannst du von der Pointer Position ab anfangen Daten als OpCodes zu interpretieren. Hier müsstest du dann anfangen Calling Conventions (und und und) zu beachten. Keine leichte Aufgabe, ich würde die Finger davon lassen, das macht nicht glücklich.

Danke für den Tipp. Irgendwo in der dll, lib bzw. so sind Informationen hinterlegt, mit denen man die Adressen entschlüsseln kann 😃 Hat jemand eine Ahnung, wo ich derartige Informationen bekomme? In der MSDN werde ich wohl nicht fündig werden.

OllyDbg Downloaden, da gibts glaub ich Export Dll oder sowas. Google doch einfach auch mal nach Dll Inspector oder sowas. Wird sicher massig Tools dafür geben.

25.12.2008 - 21:14 Uhr

Hmm, das wird jetzt 'ne Wortklauberei (meinerseits), weil ich denk, wir sind uns inhaltlich einig, nur, ich nehme die Begriffe (zu?) genau.

Ich denke, das Gegenteil ist der Fall. Aber frei nach Wittgenstein: "Philosophie ist nur der Versuch, die Unzulänglichkeiten der Sprache auszugleichen".

"Ausnahme" - schon das Wort ist eigentlich noch unsinniger als die Vorstellung "unvorhergesehenes berücksichtigen zu können".
Ein Computer macht keine Ausnahmen, weil Ausnahmen Willkürlichkeiten sind, also eines Willens bedürfen.

  1. Das Wort Ausnahme ist sicherlich nicht unsinnig. Es beschreibt lediglich eine Abweichung vom Regelfall.
  2. Eine Hochsprache wie C# kennt Ausnahmen. Diese sind natürlich nicht willkürlich, wobei du wohl eher das Wort chaotisch oder undeterminiert meintest, sondern wohl bekannt. Wenn ich versuche in eine Datei zu schreiben, weiss ich von vornherein, dass theoretisch der Speicherplatz ausgehen kann. Dies sollte im Regelfall nicht auftreten, man muss aber mit der Möglichkeit rechnen und diese unter Umständen entsprechend behandeln.

Und streng genommen ist doch jedes ExceptionHandling ein Eingriff in den "Control Flow", schließlich ändert sich ja das Verhalten des Programms.
Von daher sehe ich keinen Unterschied zw. "Ausnahme-behandlung" und Exception Based Programming.

Das stimmt, Exception Handling ist natürlich eine Art von Flow Control. Allerdings sollte man Exception Handling zur Ausnahmenbehandlung einsetzen, und nicht, wie in unserem Beispiel oben, den grundlegenden Flow zu steuern. Eine Schleife ohne Abbruchbedingung zu formulieren und den Abbruch über eine Exception, die ja sowieso auftreten muss, so wie es programmiert wurde, herbeizuführen, ist Exception Based Programming. Denn hier geht es nicht um Ausnahmenbehandlung, wie auch der leere Catch Block zeigt, sondern um Flow Control. Das ist nunmal eine Antipattern.

Wie gesagt: schon der Begriff "Ausnahme" ist Unfug - es geht um Fehler.
Aber dieses Wort hat offensichtlich irgendwelche maßgeblichen Koryphäen peinlich berührt, und da meinten sie, ein "besseres" Wort ausdenken zu müssen.

Nein. Eine Ausnahme führt nicht zwangsläufig zum Programmabbruch, dafür gibt es ja besagte Sprachkonstrukte. Ein Fehler in aller Regel schon, bzw. nach einem "wahren" Fehler (z.B. Memory Corruption), ist oft nicht mehr gewährleistet, dass das Programm einwandfrei und zuverlässig läuft.

Korrekt beschrieben wäre:
Exceptions sind Fehlermeldungs-Objekte, die "geworfen" und "gefangen" werden können, und zwar gefangen auf allen Ebenen des Function-Stacks einer Anwendung.
Ein nicht gefangenes Fehlermeldungs-Objekt wird auf oberster Ebene gefangen, das Prog wird abgebrochen und die Meldung ausgegeben.
Die bei weiten informativste Ausgabe der Meldung erfolgt, wenn die IDE das Fehlermeldungs-Objekt fängt und ausgibt (Codestop, Debugging aller Variablen).

Das kann man durchaus so sehen. Das trägt aber nicht wirklich zum Thema bei. Exceptions sind außerdem weit mehr. Siehe http://en.wikipedia.org/wiki/Exception_handling.

Was üblicherweise "Fehler behandeln" oder gar "Ausnahme behandeln" genannt wird ist nichts anderes, als das Fehlermeldungs-Objekt zu fangen, zu analysieren, die Ausgabe zu unterdrücken (oder durch eine benutzerdefinierte zu ersetzen), und den Kontrollfluß umzuändern.

Das ist so korrekt, darauf wolte ich aber nicht hinaus. Ich will einfach nur zum Ausdruck bringen, dass es mit Sicherheit extrem schlechter Stil ist, absichtlich Exceptions zu generieren um dadurch das Programm zu steuern. Dafür sind andere Konstrukte weit besser geeignet.

Und dieses "Kontrollfluß umändern" ist hochriskant, weil damit entschieden wird, wie's nach einem Fehler weitergehen soll.
Eine solche Entscheidung kann aber (wie gesagt) in wiederverwendbaren Code-Bereichen kaum jemals getroffen werden.

Das ist sehr stark situationsabhängig.

Zumindest während der Entwicklung ist doch eigentlich der unveränderte Kontrollfluß immer der sinnvollste: nämlich es geht _nicht _weiter, und der Programmierer muß sich das nochmal angucken.
Selbst nach Auslieferung eines Produktes ist dieser Ansatz immer noch nicht ganz blöd, oder?

Also erst verteidigst du Exception Based Programming und jetzt schwenkst du um und willst es gänzlich loswerden? Ich vertrete die Ansicht, dass ein Produkt so robust wie möglich sein muss. Einen Totalabbruch beim Kunden würde ich um jeden Preis verhindern wollen.

Zum Beispiel "UnauthorsizedException": Da würde ich die Kopfnuss gerne weiterreichen an die Gestalter des Namespaces System.IO.
Weiler mich zu "Exception based programming" zwingt, indem keine Möglichkeit bereitgestellt ist, festzustellen, ob ein Directory zugreifbar ist, als eben die, es auszuprobieren und die Exception zu fangen.

Naja, eigentlich sollte man wissen, wo man hinschreiben darf. Wenn du eine Liste aller Directories erstellen willst, auf die du keinen Zugriff hast, ist das natürlich blöd. Aber bedenke auch: Gerade was Permissions betrifft hast du keine andere Chance. Zum einen sollte unter Umständen nicht jeder die Rechte auf den Pfad lesen können, zum anderen können sich solche Rechte auch in der Zwischenzeit ändern, dann steht man trotz Check schlecht da.

25.12.2008 - 20:17 Uhr

Gar nicht. Was denkst du eigentlich, warum es so schwer ist, nativen Code zu dekompilieren. Ausserdem sind da vermutlich überhaupt keine symbolischen Namen mehr drin. Allerdings steht mit Sicherheit irgendwo in der Binary, ob es sich bei einem bestimmten Offset um einen Einstiegspunkt handelt. OllyDbg kann z.B. so eine Liste exportieren.

25.12.2008 - 18:05 Uhr

Exceptions sind nicht dafür da, um Fehler zu vermeiden, sie sollen auch keine Fehler abfangen. Exceptions sind dafür da, AUSNAHMEN zu behandeln, die ihren Ursprung in Bereichen haben, die der Programmierer nicht kontrollieren kann.

ExceptionHandling für den Control Flow einzusetzen ist sowas von einer Antipattern, dafür sollte man eigentlich ne Kopfnuss bekommen.

Und für die "UnauthorsizedException" beim Datei-Zugriff - da habich bisher noch kein Mittel gefunden, das vorherzusehen, als eben, hineinzurennen.

Hier ist eine AUSNAHMENbehandlung dann aber durchaus angebracht.

Im Grunde sind also alle meine TryCatchens "Exception based Programming": machich nämlich immer genau dann, wenn ich absolut kein anderes Mittel mehr weiß, einen bestimmten Fehler zu vermeiden.

Das ist Symptombekämpfung und sollte vermieden werden.

Ich wiederhole nochmal: Exception Based Programming bedeutet, dass man ExceptionHandling einsetzt um den Control Flow zu steuern, wie hier eindeutig bei der Schleife ohne Abbruchbedingung demonstriert. Und das sollte man um jeden Preis vermeiden.