Laden...

Forenbeiträge von cadi Ingesamt 308 Beiträge

31.10.2006 - 11:18 Uhr

Hallo schaedld,

Original von schaedld
...würde es mit interessieren, ob schon jemand mit WWF programmiert hat und ob die Umstellung von .NET 2.0 auf .NET 3.0 eher kosmetisch ist oder ob man "wieder" eine "neue" Programmiersprache lernen muss.

ja, ich habe gerade eine eiegene Workflow-Engine komplett auf WWF umgestellt.
Ich bin ziemlich zufrieden. Der designer lässt sich prima in einer eigenen Applikation re-hosten. Eigene Activites schreiben ist recht einfach und die Möglichkeiten über eigene Services Anpassungen vorzunhemen sind recht umfangreich (z.B. eigenes tracking, eigener Thread-Pool "echt parallele" sub-workflows etc...)
Meine eigene Workflow-Engine war zwar etwas performanter, aber alleine der Designer (meiner war grütze dagegen) wiegt das komplett wieder auf.

Was .NET 3.0 und lernen angeht... Nicht verwechseln mit C# 3.0!
.NET 3.0 ist "nur" eine erweiterung des Frameworks und ist auch nicht Sprachspezifisch (VB und managed c++ können die neuen Klassen auch nutzen).

Man muss sich halt etwas in die nicht unerhebliche Menge von neuen Klassen einarbeiten. Und auch die Konzepte sind teilweise etwas gewöhnungsbedürftig.

19.10.2006 - 09:40 Uhr

Original von Stu42
Den Parameter Type t versteh ich aber nicht so ganz, was soll ich dafür einsetzen? Doch irgentwie die Parameterliste oder?

In der .NET Framework Doku steht nur:
"t: Der Typ des zurückzugebenden Delegaten. "

t ist quasi der Funktions-Prototyp.

In .net definiert man die als Delgaten.


delegate void ImportedFunction();

Type t = typeof(ImportedFunction);

18.10.2006 - 22:59 Uhr

Hallo Stu42,

ich glaube, Du solltest versuchen dich von c/c++ und der Windows32 API zu lösen.

Schau dir mal das Framework in ruhe an. Da ist eigentlich alles dabei, was man für eine normale GUI Anwendung braucht. Zumindest die CommonDialogs wirst du nativ im .NET finden.

Wenn du versuchst deinen Win32 Programmierstil in .NET zu übernehmen wird da nix vernünftiges rauskommen. (Ich weiss, das klingt hart, ging mir aber auch am Anfang so...)

18.10.2006 - 16:53 Uhr

Original von Stu42
Und wie gesagt, über [DLLImport] konnt ich diese Funktionen der DLL nicht einbinden, da ich dort einen einsprungsfehler bekommen habe.

Dann musst du mal schauen, ob du den richtigen name als einstieg angegeben hast (c - mangled?) und ob die calling conventions stimmen.

Original von Stu42
Und CRT-Libs kann ich so in C# einbinden, und in CRT libs kann ich halt die Funktion LoadLibrary aufrufen, desswegen der umweg. Naja vieleicht muss ich einfach weiter probieren, bestimmt hab ich beim DLL import was falsch gemacht...

LoadLibrary!? Aus CRT? Also die solltest du nun auf jeden Fall direkt aus der kernel32.dll über DllImport nutzen können!


    [DllImport("kernel32.dll")]
    internal static extern IntPtr LoadLibrary(String dllname);
   
   [DllImport ("kernel32.dll")]
   private exten static bool FreeLibrary(IntPtr lib);

    [DllImport("kernel32.dll")]
    internal static extern IntPtr GetProcAddress(IntPtr hModule, String procname);

18.10.2006 - 16:43 Uhr

Form2 myform = new Form2();
myform.TopLevel = false;
// einfach wie ein Control hinzufügen
parentForm.Controls.Add(myform);

18.10.2006 - 10:52 Uhr

Hallo Stu42,

Wenn ich dich richtig verstehe wilst du ein Form innerhalb eines anderen Forms als Control verwenden?
Dann musst du nur die TopLevel Eigenschaft auf false setzen.

18.10.2006 - 10:50 Uhr

Hallo Hape,

falls du in bestehenden Assemblies und nicht im Source suchem kannst/möchtest solltest Du dir den Reflector von Lutz Röder anschauen. Der kann das und noch viel mehr.

18.10.2006 - 10:47 Uhr

Hallo Stu42,

Original von Stu42
Und dieseCRT .dll binde ich dann in C# ein, indem ich sie als Verweis einbinde.

Wofür musst du denn die CRT.dll einbinden? Das ist doch die C-Runtime Bibliothek von Microsoft. Ich wäre sehr vorsichtig mit dem direkten Aufruf von Funktionen in dieser Bibliothek, da die nicht alle Threadsafe sind und teilweise TLS benutzen (z.B. die Datumsfunktionen).

Welche Funktionen brauchst du denn, die .NET nicht bietet?

15.10.2006 - 23:09 Uhr

Original von Garbage_ColLector
Könntest du da eventuell genauer werden, hab jetz den IFilter runtergeldaen, was soll ich jetz genau machen, denn mitlerweile hab ich den gedanken aufgegeben die Daten direkt aus der PDF datei zu lesen, aber es wird doch irgendie möglich sein den Text in einem halbwechs akzeptabken .txt Format zu konvertieren.

schau dir diesen Link an...

14.10.2006 - 14:40 Uhr

Hallo Garbage_ColLector,

versuch's mal mit dem IFilter von Adobe. Ist nicht ganz trivial, aber ich bekomme damit den reinen Textinhalt von PDFs sauber extrahiert. (leider nur von Dateien und nicht von Streams seufz)
Irgendwo auf der Lucene für .NET Website ist da ein Beispiel. Das ist nicht perfekt, da die Propertysets für die Metadaten nicht implementiert sind und auch ein paar andere dinge nicht ganz sauber sind, aber als Start ist das optimal.

27.09.2006 - 15:31 Uhr

Original von joerguth
Hallo bin mir nicht ganz sicher aber die Anfrage müssen doch durch den Proxy.

Warum? ObjRef.GetRealObject liefert auf dem server auch das original Objekt zurück. Das wird dann nur wieder mit einem Proxy gewrapped.
Kommt man denn aus dem RealProxy irgendwie an das ObjRef Objekt ran?
Get RealObject direkt aufrufen wäre schon Klasse...

Vielleicht hilft Dir dies:

>


>

Leider nein seufz!.
Trotzdem danke!

27.09.2006 - 14:27 Uhr

Hallo,

ich habe folgendes Konstrukt:- Client/Server Assembly mit allen Interfaces und Enums

  • Server Console Application stellt konkrete Implementationen der Interface per Remoting zur Verfügung
  • Client Console Application nutzt die Server-Klassesn über die Interaces

Soweit so gut. Klappt alles ganz prima. Ich habe nur ein Problem:
Der Client erzeugt zwei Objekte auf dem Server: IProzessor und IParameter.
Dann ruft der Client IProcessor.Run(IParameter) auf.

Auf dem Server wird dann auch korrekt run mit dem IPramater aufgerufen.
Da die Implementation von Processor auch auf als internal deklarierte Methoden von Parameter zugreifen soll wird IParamter zu Paramter (konkrete implementation von IParameter auf dem Server) gecastet. Klappt auch noch anstandslos.

Nun kommt das Problem: sowohl iParameter als auch das zu Parameter gecastete Objekt sind weiterhin TransparentProxy-Objekte.
Diese haben für mich zwei Nachteile:1. Es könenn nur Public Methoden der Objekte aufgerufen werden (der RealProxy vor dem TransparentProxy nutzt da wohl Reflection)
2. Jeder Zugriff auf das Objekt wird durch den transparenten Proxie geleitet. Das kostet unnötig Zeit (die mehtode Run hat tausende von solchen Zugriffen!)

Nun die Frage:
Gibt es eine Möglichkeit wieder auf das orignal Objekt zuzugreifen?
Immerhin bin ich ja wieder in der AppDomain, die das Objekt erzeugt hat.

25.09.2006 - 00:07 Uhr

Prinzipiell finde ich deinen ansatz mit dem array ziemlich gut. bei der geringen und bekannten anzahl von elementen macht das schon sinn.

Herbivore hat schon recht, dass das problem mittels synhronisierung in den griff zu bekommen sein sollte.

so lief es bei mir:

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace ConsoleApplication1
{
    public class CacheItem
    {
    }

    public class Cache
    {
        public CacheItem[] speicher;
        // Wie groß wird der Cache
        int size = 0;
        // aktuelle Zelle im Array
        int last = 0;

        public Cache(int size)
        {
            this.size = size;
            speicher = new CacheItem[size];
            last = 0;
        }

        public void addItem(CacheItem item)
        {
            lock(this)
            {
                // Überlauf?
                if (size == last)
                {
                    last = 0;
                }
                System.Console.Out.WriteLine(String.Concat("Position: ", last.ToString()));
                speicher[last] = item;
                last++;
            }
        }
    } 

    class Program
    {
        static Cache g_Cache = new Cache(30);
        static void doTest()
        {
            while(true)
                g_Cache.addItem(new CacheItem());
        }
        static void Main(string[] args)
        {
            for (int i = 0; i < 10; i++)
            {
                Thread testRunner = new Thread(new ThreadStart(doTest));
                testRunner.Start();
            }
            Thread.Sleep(10000);
        }
    }
}

(bitte nicht meckern, das die threads nicht sauber beendet werden... ging nur ums prinzip...)

Was mir (und vor allem dem compiler) noch aufgefallen ist die zuweisung
size = size im constructor.
wenn du ein feld hast, das genauso heisst wie ein paramater in einer funktion musst du ein this. for den feldnamen setzen.
Allerdings verstehe ich deine ausgabe dann auch nicht so ganz, da dein size feld immer null war (auch wenn das array die größe von size hatte) und somit eigentlich immer ein überlauf hätte statfinden müssen....

23.09.2006 - 13:26 Uhr

Hallo,

ich stecke in einer Sackgasse und bin relativ entnervt.
Folgendes Problem:
Meine applikation nutzt eine Assembly, die FullTrust erfordert

[assembly:PermissionSetAttribute(SecurityAction.RequestMinimum, Name = "FullTrust")]

Des weiteren braucht meine Applikation auch die **AspNetHostingPermission **(hat einen eingebauten WebServer).

Und hier beisst sich die Katze in den Schwanz. Wenn ich im Security Tab "This is a full trust Application" auswähle fehlt die AspNetHostingPermission, wenn ich custom nehme ist zwar die AspNetHostingPermission da, aber die Assembly, die "FullTrust" haben will lädt nicht mehr. (weil es ja nun "Custom" ist und nicht mehr "FullTrust".)

Leider kommt es nicht in betracht auf den Zielcomputern die **AspNetHostingPermission **zum "FullTrust" hinzuzufügen (das richtet sich an user... nicht admins, sonst könte ich auch sagen, man solle den IIS sauber aufsetzen und bräuchte kein clickonce...)

Das nervt! Irgendwer eine Idee?

22.09.2006 - 10:32 Uhr

Muss ich mir mal anschauen...
Scheint da ein Zugriffs-/Rechteproblem zu geben... (Wahrscheinlich ist die DLL exkluisv geöffnet oder so was)
Was ich wundert ist, das die exception nicht abgefangen wird (ist eigentlich alles in einem Try-Catch Block um genau sowas zu verhindern (bei 16bit executables kommt z.B. auch eine exception. Die wird aber sauber abgefangen und es geht bei der nächsten datei weiter...)

blöd blöd....

18.09.2006 - 08:24 Uhr

die neue version extrahiert nun auch Icons.

für jedes 16x16 icon wird auch ein Button extrahiert (falls eine icon-resource mehrere 16x16 icons enthält wird das mit den meisten farben genommen)

Extraktionsergebnis bei mir:
2.864 Icons
7.270 Bitmaps (16x16 transparent)

Ich überlege nun einen neuen ImageEditor für das VS2005 zu entwickeln. der bilder nach ähnlichkeit suchen kann. bei 7.270 Bildern wird das suchen sonst was ätzend...
Besteht da interesse dran? (z.b. alles, was folder-ähnlich ist?)
Das ganze würde nach Farb- und Texturähnlichkeit suchen (kombiniert oder getrennt).

Ich dachte daran, das dieser editor die bilder auch gleich im zielkontext (TreeView, ListView und ToolStrip) anzeigt, damit man sich ein besseres bild vom endergebnis machen kann...

14.09.2006 - 15:25 Uhr

Ich habe mir mal angeschaut, wie TreeView.BeginUpdate und TreeNode.set_Text implementiert sind.
Beide senden eigentlich nur eine Message an das native Windows TreeView Control.

D.h. die Performance ist eigentlich nur von der MessagePump abhängig.

Hast du irgendwelche Delegates o.ä. die die MessagePump blockieren könnten?

Mal versucht mit BeginInvoke asynchron den Text zu ändern?

Und was ganz anderes: Testest du ein Release oder Debug build mit oder ohne VisualStudio? Das kann zu extremen Verzögerungen alleine durch das VisualStudio kommen!

Evtl. man ein Release Build mit STRG+F5 starten und sehen, was passiert!

14.09.2006 - 14:48 Uhr

Hallo wdb.lizardking,

evtl. liegt es ja am neu-zeichnen des nodes?
(Tag -> keine Verschlechterung da kein neuzeichnen,
Text-> böse, da neu zeichen?)

Hast du mal versuch mehrere Updates in ein BeginUpdate und ein EndUpdate zu klammern?

09.09.2006 - 10:10 Uhr

Hallo,

ich würde dir LockBits empfehlen. Das hat mir eine funktione, die eine Transparenz maske berechnen sollte von 10 Sekunden Laufzeit auf weniger als eine Skunde gedrückt!

das problem mit LockBits ist, das du direkt auf den Speicher zugreifen musst.
Das ist unsafe. Damit das funktioniert musst du als erstes in den Projekt Pptionen unsichere Methoden erlauben.

Dann geht das in etwa so:

int height = bitmap.Height;
int width = bitmap.Width;

// hier wird von PixelFormat.Format24bppRgb ausgegangen... 
// bei 256 farbe muss der faktor 3 rausgenommen werden,
// da jedes byte einen pixel beschreibt
BitmapData bmData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int stride = bmData.Stride; 
System.IntPtr Scan0 = bmData.Scan0; 
try
{
	unsafe // wichtig, da direkter zufgriff auf den speichjer
	{
	    int nOffset = stride - width*3;
	    byte red, green, blue;
	    // zeilen durchlaufen
	    for (int j = 0; j < height; j++)
	    {
	    	// die einzelnen pixel in einer zeile durchlafuen
	        for (int i = 0; i < width; i++)
	        {
	            // zeiger auf den aktuellen pixel holen....
	            byte* p = (byte*)(void*)Scan0+(i*3)+(j*width*3)+nOffset;
	            // und einen farbwert dafür bestimmen
	            Color col = Color.FromArgb(p[0],p[1],p[2]);
	        }
	    }
	}
}
finally 
{
	bitmap.UnlockBits(bmData);
}
08.09.2006 - 14:54 Uhr

Original von svenson
params sind keine optionalen sondern variable Parameter. Bei optionalen Parametern sind Default-Werte vorgesehen, die der Compiler bei Weglassen eines aktuellen Parameters ersetzt.

Optionale Parameter können zu bösen, versteckten Fehlern in lose gekoppelten Systemen führen (Stichwort: Versionierungsproblem). Daher hat man in C# darauf verzichtet.

warum müssen optionale parameter default Werte haben? in c++?
wier reden doch von .NET und c#, oder?

Wenn ich mich entschliesse einem mit params definierten parameter zu übergeben oder auch nicht ist das für mich optional = wahlweise.. (man kann den ja auch leer lassen)

letzlich auch egal, denn ich denke was kde05 sucht sind dann keine optionalen, sondern variable paramter 😉

08.09.2006 - 14:33 Uhr

So nutz microsoft das:

NativeMethods.SCROLLINFO :


[StructLayout(LayoutKind.Sequential)]
public class SCROLLINFO
{
      public int cbSize;
      public int fMask;
      public int nMin;
      public int nMax;
      public int nPage;
      public int nPos;
      public int nTrackPos;
      public SCROLLINFO();
      public SCROLLINFO(int mask, int min, int max, int page, int pos);
}

Die "safe" Variante:


[DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
public static extern bool GetScrollInfo(HandleRef hWnd, int fnBar, [In, Out] NativeMethods.SCROLLINFO si);

und nochmal "unsafe":


[DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
public static extern bool GetScrollInfo(HandleRef hWnd, int fnBar, NativeMethods.SCROLLINFO si);

08.09.2006 - 14:26 Uhr

Doch, es geht:
params

(wie sollte sonst auch String.Format funktioneieren? da gibt es ja nicht 1000 overloads 😉

public void Add(params string[] werte ){}
07.09.2006 - 17:33 Uhr

passender artikel bei codeproject (englisch)

06.09.2006 - 09:12 Uhr

Hi Khalid,

die icons werden (momentan) nicht exportiert. Das sind alles Bitmaps, JPGS, PNG oder Gifs.

Icons sind immer etwas nervig, vor allem wenn nicht alle formate in einem Icon Dictionary liegen. Dann hat man nacher häufig 12 Dataien und mehr für ein Icon...

Aber ich schaue mal, was sich mit icon machen lässt...

(btw.wieviele pngs sind denn bei dir aus c:\ gekommen?
Ich habe es auf 3.851 Bilder gebracht...

05.09.2006 - 20:53 Uhr

Moin moin,

ich heute hatte ich - mal wieder - das Problem, das ich kein passendes Bild für einen Button finden konnte.
Ich wusste aber, das irgendwo auf meiner Platte ein Programm rumliegt, das ein passendes Bild in seinem Toolbar hatte...

(ja, ich weiss das man solche Bilder meistens nicht klau... er... meinte leihen darf. aber das ignorieren wir mal schön...)

-----8<--- snipp------- ignore copy right issues from here -----

Da die meisten Resource-Grabber ein paar Probleme hatten (erst registrieren um zu speichern, keine .NET assemblies oder keine win32 images) musste ich da was eigenes schreiben...

Features:* Durchsucht ein Verzeichnis (auch rekursiv) nach *.dll, *.exe und *.ocx
* extrahiert alle 16x16 bilder als transparentes PNG (transparente farbe wird "erraten")
* liest win32 und clr dateien
* splittet Win32 Imagelists in einzelne images (wer noch win32 toolbars gebastelt hat weis, was ich meine)
* sucht nach doubletten (inhaltlich, nicht nach dem namen)
* ist sowas von frei und umsonst

Der Source Code ist ein grauenhaftes Zusammengestückel von Fundstücken aus dem Netz und eigenem Kram (der aber nicht wirklich schön ist)...
(daher ist der Source Code auch nicht im Archiv enthalten... nur auf Anfrage.. evtl 😉 )

Aber es funktioniert, und nur darum ging es mir.
Da ich das Problem eigentlich bei jeder UI Entwicklung hatte, dacht ich, es geht dem einen oder anderen hier ähnlich ...

05.09.2006 - 10:59 Uhr

Hallo sharp.new,

in deiner Schleife fügst du auch ein, sobald ein Vergleich fehlschlägt.
Du solltest aber erst die alle exisitierenden Einträge in der Zielliste durchlaufen und schauen, ob da einer identisch ist und danach entscheiden.


//Vergleich zwischen vorhandenen Items und selektierten Items
bool alreadyInList = false;
foreach (ListViewItem alTemp in ucList2.Items)
{
    if (alTemp.Text ==  item2.Text)
    {
        alreadyInList = true;
        break;
    }
}
if (!alreadyInList)
{
    ucList2.Items.Add(item2);
    al_Matzu_o.Add(item2);
}

ausserdem vergleichst du die ListViewItem per toString().
die funktion ist als

return ("ListViewItem: {" + this.Text + "}");

definiert.

  1. direkt auf das Text-Property der Items zu gehen sollte schneller und vor allem verständlicher sein (toString() liefert ja sonst meistens den Type-Name)

  2. Für den Fall, dass der Text von zwei Items identisch sein kann, aber sie sich durch ihre SubItems unterscheiden musst du auch noch schauen ob die identisch sind.

04.09.2006 - 11:33 Uhr

Original von felix_schmidt
naja das xml file wird zurkonfiguration hergenommen. und manche funktionen soll nicht jeder kunde haben. müssen aber trotzdem im xml file stehen. deswegen möchte ich gerne das file verschlüsseln.

Wie liest du denn selber die Datei ein? ist das eine standard app.exe.config?
Dann wird das mit dem kompletten Verschlüsseln etwas schwierig, da die standard Zugriffsklassen nur mit plain XML etwas anfangen können.

Wenn es aber "nur" darum geht Features freizushalten, dann brauchst du ja nur eine einziges feld, in dem die optionen verschlüsselt stehen. (z.B. eine einfache bitmaske + SecretString und das dann verschlüsseln).

Falls aber auch die konfigurations deteils geheim sein sollen kannst du auch eigene SectionHandler schreiben, die dann verschlüsselte Konfigurationsinformation aus einem BASE64 CDATA Element lesen und daraus
alles nur ideen 😉

03.09.2006 - 12:45 Uhr

Ich könnte jetzt lang und breit ausholen, was für eine elende geschichte mein Laptop hinter sich hat... war mal ein Dell Latitude C820, nach diversen defekten hat Dell mir da ein Inspiron Mainboard reingepackt. Nun kann ich die Treiber für meine nVidia 440go nicht mehr updaten.... Ist also ein recht oller (WInXP default) Treiber.

Liegt wahrscheinlich an meinem völlig zersemmelten Rechner.
Da ich eigentlich "nur" auf der Kiste entwickle habe ich mich nie wirklich um openGL gekümmert... keine Ahnung, ob was anderes läuft...

03.09.2006 - 12:21 Uhr

Original von nop
Die nVidia-Treiber sind nicht Windows-XP-kompatibel.

Sprich: Läuft nicht mit nVidia unter XP?
das ist zumindest bei mir der Fall: (siehe Attachment)

30.08.2006 - 12:39 Uhr

evtl. sendet der server ja keine ganze Zeile?
versuch doch mal einzelnle zeichen zu lesesn und schau, was der server da schickt? (oder geh mit telnet faramir direkt auf den server)
evtl. muss du auch erstmal ein CRLF schicken, bevor der server irgendetwas macht.

hängt alles extrem von dem ab, was der server da so macht...

27.08.2006 - 16:53 Uhr

Un noch besser wäre es dann evtl. die constante InvariantCulture zu nehmen 😉 dafür ist die ja da...

25.08.2006 - 17:53 Uhr

Du brauchst zwei funktionen um aus dieser Zeile ein array von zahlen zu machen.
String.Split() und xxx.Parse() von Float, Double, Int32, Int64 etc...

damit und der MSDN Hilfe solltest du dein Problem gelöst bekommen

24.08.2006 - 16:22 Uhr

Ich habe ja auch nicht gesagt, dass das was besonderes sei...
Sonst würde da auch nicht täglich was neues auftauchen.

Aber es passt halt in die Kategorie "holy wtf!?"

Und ein Web-Server, der eine Falsches-Passwort-Meldung wegklickt ist schon ein WTF!

24.08.2006 - 14:13 Uhr

Ich denke dein Projekt gehört nach hier...

24.08.2006 - 11:51 Uhr

Daher ja das Angebot meinen c++ win32 krams als basis zu nehmen 😉
Ist win32 nativ mit windows hook...

Das einzige was noch fehlt ist den button dann zu klicken 😉

24.08.2006 - 11:20 Uhr

Du kannst über einen Windows-Hook auch direkt auf das erstellen (oder das ändern des titels) eines fensters reagieren... damit gibt es keine Zeitverzögerung...

24.08.2006 - 10:43 Uhr

Ich habe mal (im rahmen eines anderen... noch schlimmeren) projektes einen WindowWatcher schreiben dürfen.

Der wartet auf ein bestimmtest fenster und kann dann ein kommando auführen (oder auf eine bestimmte URL im IE).

Allerdings ist halt (noch) nichts zum klicken von buttons drinnen... (das hat eineTCL-Script Sprache auufgerufen um dann mit den Fenstern was anzustellen)

aber als Basis könnte das reichen (aber bitte nicht weitergeben....)
Zur not einfach hardcoden, das wenn ein fenster gefunden wird ein WM_COMMAND an das fenster geschickt wird.

24.08.2006 - 10:38 Uhr

Könnt ihr mit C++ was anfangen?

24.08.2006 - 09:42 Uhr

Original von tomaten

Original von cadi
Aber im ernst: In einer Server-Anwendung hat ein Control, welches eine DialogBox öffnet NIX zu suchen.

Das ist nicht sonderlich hilfreich. Offensichtlich hast Du noch nie mit APIs gearbeitet, die Dir der Hersteller wissend Deiner Anwendung zur Verfügung stellt, aber diesen Blödsinn nicht abschaltbar macht, bzw. eine andere Klasse hat die ohne Dialog ist aber dafür undokumentiert. Ich kann mich auch weinend in die Ecke setzen!

Och, ich mache das schon ein paar jährchen und ich habe die wüstesten Dinge erlebt.
Nur habe ich im laufe der Jahre gelernt, das gewisse Workarounds Systeme extrem schnell instabil und sehr schwer wartbar machen.
Ich gebe ja zu, das es zu extrem kranken Situationen komen kann, wo man beginnt absolute Schweinereien zu programmieren, aber ich habe auch gelernt das es sich lohnt solche Situationen frühzeitig zu eskalieren um die Folgen zu vermeiden...

Evlt. wäre es ja möglich, das du oder dein Kunde bei dem Hersteller der API mal was Druck macht?
Manchmal hilft das (im Zweifel eher den anbieter einer api wechseln, als ein Projekt vor die Wand setzen...).

Aber so wie das bei dir klingt befürchte ich ja schlimmstes für dich...
Kunde: Hei! Die Api von XY ist toll! Günstig und macht alles was wir brauchen.
Du: ähm, die macht aber Probleme. Die API von ACME ist nicht viel teurer aber stabiler...
Kunde: Das bekommst du schon hin...
(dabei frisst der mehraufwand die DialogBox zu umgehen wahrscheinlich locker die differenz...)

XY: No one ever requested the dialog box to be not show. Hey, users want to know if the entered password is incorrect?
DU: er... mein User ist ein Server!?
XY: Your problem, this is not the intended usage of our component.
(or worse🙂 XY: Hey, in this case you need our Enterprise Version. It only costs ten times as much.
DU: aber da gibt es doch noch die undokumentierte API? wie wäre es mit einer dokumentation?
XY: Hey! this Documentation has been left blank intentionally. Sorry... But in the Enterprise Version....

(oder sind die gar der einzige Anbieter einer solchen API für was auch immer? dann hast du echt die A**schkarte...)

23.08.2006 - 21:12 Uhr

Ich will ja nicht wissen, was die Dialogbox so von sich gibt (bitte lizensieren sie produkt x?).

Aber im ernst: In einer Server-Anwendung hat ein Control, welches eine DialogBox öffnet NIX zu suchen.

Killen wird nicht gehen, das das Control ja im Context des Server-Prozesses läuft...
Es mag da fiese low-level-api tricks geben, aber die sollte man, wenn man nicht gerade hacker werden will für eine ernsthafte anwendung ausschliessen...

Falls es doch nicht anders geht, solltest du über eine art watchdog nachdenken, der den OK-Click simmuliert... Aber bei dem Gedanken läuft mir ein Schauer den rücken runter!

22.08.2006 - 20:21 Uhr

der ist aber (unter schmerzen) leicht geändert, damit er auch funktioniert...

22.08.2006 - 18:21 Uhr

@cadi
Genau aus deinem Code stammte die Zeile. Ich werde es gleich mit dem neuen Code versuchen.

Wenn du wirklich den code von den LumiSoft.net controls nutzen solltest: Sei vorsichtig! Das dingen ist ein wandelnder Bug... 100 sachen krumm, komisch oder gar falsch!

Als Ausgangsbasis alles ganz toll... aber ansonsten...

22.08.2006 - 11:52 Uhr

Hallo Absolom,

Ich denke, du suchst etwas zum decoden von E-Mail headern:


/// <summary>
/// Canonical decoding. Decodes all canonical encoding occurences in specified text.
/// Usually mime message header unicode/8bit values are encoded as Canonical.
/// Format: =?charSet?type[Q or B]?encoded string?= .
/// </summary>
/// <param name="text">Text to decode.</param>
/// <returns>Returns decoded text.</returns>
private static Regex decodingRegex = new Regex(@"\=\?(?<charSet>[\w\-]*)\?(?<type>[qQbB])\?(?<text>[\w\W]*?)\?\=");
public static string CanonicalDecode(string text)
{
	// =?charSet?type[Q or B]?encoded string?=
	MatchCollection m = decodingRegex.Matches(text);
	foreach(Match match in m)
	{
		try
		{
			string charset = match.Groups["charSet"].Value;
			if (charset.ToLower() == "cp1252")
				charset = "windows-1252";
			System.Text.Encoding enc = System.Text.Encoding.GetEncoding(charset);
			// QDecode
			if(match.Groups["type"].Value.ToLower() == "q")
			{
				text = text.Replace(match.Value,Core.QDecode(enc,match.Groups["text"].Value));
			}
				// Base64
			else
			{
				text = text.Replace(match.Value,enc.GetString(Convert.FromBase64String(match.Groups["text"].Value)));
			}
		}
		catch
		{
			// If parsing fails, just leave this string as is
		}
	}
	
	return text;
}

/// <summary>
/// "Q" decoder. This is same as quoted-printable, except '_' is converted to ' '.
/// </summary>
/// <param name="encoding">Input string encoding.</param>
/// <param name="data">String which to encode.</param>
/// <returns>Returns decoded string.</returns>		
public static string QDecode(System.Text.Encoding encoding,string data)
{
	return QuotedPrintableDecode(encoding,System.Text.Encoding.ASCII.GetBytes(data)).Replace("_"," ");
}

/// <summary>
/// quoted-printable decoder.
/// </summary>
/// <param name="encoding">Input string encoding.</param>
/// <param name="data">Data which to encode.</param>
/// <returns>Returns decoded data with specified encoding.</returns>
public static string QuotedPrintableDecode(System.Text.Encoding encoding,byte[] data)
{
	MemoryStream strm = new MemoryStream(data);			
	MemoryStream dStrm = new MemoryStream();

	int b = strm.ReadByte();
	while(b > -1)
	{
		
		// Hex eg. =E4
		if(b == '=')
		{
			byte[] buf = new byte[2];
			strm.Read(buf,0,2);

			// <CRLF> followed by =, it's splitted line
			

				if ( (buf[0] != '\r' && buf[0] != '\n' && buf[1] != '\n' && buf[0] != '\n' ) && 
				( ( ( (buf[0] >='0') && (buf[0] <='9') ) ||
				( (buf[0] >='a') && (buf[0] <='f') ) ||
				( (buf[0] >='A') && (buf[0] <='F') ) ) &&
				( ( (buf[1] >='0') && (buf[1] <='9') ) ||
				( (buf[1] >='a') && (buf[1] <='f') ) ||
				( (buf[1] >='A') && (buf[1] <='F') ) ) 
				) 
				)
			{
				try
				{
					int val = int.Parse(System.Text.Encoding.ASCII.GetString(buf),System.Globalization.NumberStyles.HexNumber);
					dStrm.WriteByte((byte)val);
				}
				catch
				{ // If worng hex value, just skip this chars							
				}
			} 
			else
			{
				// encoding follows as first in new line..?
				if ( buf[0] == '=' )  
				{
					buf[0] = buf[1];
					strm.Read(buf,1,1);

					if ( 
						( ( ( (buf[0] >='0') && (buf[0] <='9') ) ||
						( (buf[0] >='a') && (buf[0] <='f') ) ||
						( (buf[0] >='A') && (buf[0] <='F') ) ) &&
						( ( (buf[1] >='0') && (buf[1] <='9') ) ||
						( (buf[1] >='a') && (buf[1] <='f') ) ||
						( (buf[1] >='A') && (buf[1] <='F') ) ) 
						) 
						)
					{
						try
						{
							int val = int.Parse(System.Text.Encoding.ASCII.GetString(buf),System.Globalization.NumberStyles.HexNumber);
							dStrm.WriteByte((byte)val);
						}
						catch
						{ // If worng hex value, just skip this chars							
						}
					} 
					else
					{
						dStrm.WriteByte((byte)'=');
						dStrm.WriteByte((byte)buf[0]);
						dStrm.WriteByte((byte)buf[1]);
					}
				}
				else
				{
					if (buf[1] != '\r' && buf[1] != '\n')
						dStrm.WriteByte((byte)buf[1]);

				}
			}
			
		}
		else
		{
			// System.Console.Out.Write(System.Text.Encoding.ASCII.GetChars(b));
			dStrm.WriteByte((byte)b);
		}

		b = strm.ReadByte();
	}

	return encoding.GetString(dStrm.ToArray());
}

20.08.2006 - 10:17 Uhr

Hallo f1x,

wenn ich das richtig gelesen habe bekommst du irgendwo eine "Enumeration changed" exception. Das kommt, wenn eine Collection durch einen anderen thread geändert wird während ein foreach ausgeführt wird.

Meine Anahme:
Im GUI Thread

foreach(object item in itemList) 
{
   // ...
}

Im Connection-Thread:


{
   //... read data
   item.List.Add(result);
}

Du musst den Zugriff auf die liste Synchronisieren. z.B. mit lock oder Monitor etc...

Im GUI Thread


lock(itemList.SyncRoot)
{
   foreach(object item in itemList) 
   {
      // ...
   }
}

Im Connection-Thread:


//... read data
lock(itemList.SyncRoot)
{
   item.List.Add(result);
}
}

Dann sollte dieser Fehler ausbleiben....

19.08.2006 - 15:58 Uhr

Als byte[4] und dann per << eine int zusammen shiften.
ähnlich für double (weiss da nicht genau, wie die im speicher leigen)

19.08.2006 - 12:43 Uhr

@gespannter_Bogen:

Ja, das geht!

Aber dein Einwand ist volkommen korrekt. Man darf natürlich nicht wahlos die gesamte Assoziationskette durchlafuen. Die wird schnell unendlich.

Die Kette
Hamburg --in Deutschland--> Deutschland --ist--> Land --object of type--> Liste Der Länder
enthält Deutschland und schon habe ich eine endlos Schleife...

Auch Gödel hatte schon recht. Aber ich will ja keine universelle Datenbank, sondern schon eine spezifische (die architektur ist zwar generisch, aber der inhalt eben schon irgendwie well-formed).

Ziel meiner anwendung ist es, Texte zu Annotieren. Und dann anhand der Annotierten Objekte gezielt erweiterte Informationen zu bekommen.

Ein willenloses komplett expandieren bringt da nix. Man braucht Regeln für bestimmte Objekte...

Beispiel Satz:
Mein name ist Carsten, ich lebe in Hamburg.

Daraus würde mann dann extrahieren, das Carsten ein Vorname ist und das dieser für Männer gebräuchlich ist. Ausserdem, das Hamburg in Deutschland liegt udn evtl. noch, das Hamburg eine Großstadt ist.

Die hohe Kunst der KI wäre natürlich, dass das Programm solche Regeln implizit erkennt... aber davon bin ich noch weit entfernt.......

Letztlich wird so eine Datenbank eh irgendwann beliebig komplex und fehlerhaft.
Aber auch das menschliche Hirn ist ja nicht frei von fehlerhaften Interpretationen und Assoziationen. Die Kunst ist einen Begriff in den richtigen Kontext (Wissens Domäne) einzurodnen. (Paris-> Frauenname oder Stadt? Müller-> Nachname? Firma? Beruf?)

18.08.2006 - 14:59 Uhr

@svenson: Dito; XP mit SP2 und .NET v2.0.50727.
und auf einem Win2003 Server: das selbe Ergebnis (keine Meldung).

Ich hatte das Problem mal bei einem Kunden... Extrem gemein!
Kein Log-Eintrag, keine Meldung... NIX!
Und es war keine endos rekursion... Hat mich eine Stunde gekostet um den Fehler zu finden....

18.08.2006 - 14:34 Uhr

Original von svenson

Original von cadi
@svenson:
Auch ohne Debugger in einer reienen Windows Anwendung?
bei mir (auch 2.0) kommt da keien Meldung.

Natürlich nicht die normale Exception-Dialogbox, aber diese "...hat ein Problem festgestellt"-Box.

Bei mir komm nicht mal diese Meldung! Evtl. ist mein DrWatson ja defekt 😉

18.08.2006 - 13:52 Uhr

Original von svenson
Sang- und klanglosen Absturz kann ich allerdings durch StackOverflows unter 2.0 nicht erzeugen. Kommt immer ne entsprechende Meldung. Egal ob GUI oder CMD.

@svenson:
Auch ohne Debugger in einer reienen Windows Anwendung?
bei mir (auch 2.0) kommt da keien Meldung.

Original von svenson
Aber zurück zum Thema: In 99% aller Fälle entsteht ein solches "unerwartetes Beenden" durch fehlerhaften Code, sprich unsauberes Exceptionhandling.

Stack-Overflow lässt sich nicht per Catch abfangen!
Da kann man an der stelle nix richtig oder falsch machen. Die dürfen erst garnicht auftreten!

18.08.2006 - 13:37 Uhr

@herbivore:
Ntfs bietet mit seinem Streams ja schon die möglichkeit beliebige meta-informationen an eine datei zu verknüpfen.

Ich glaube das problem liegt in dem Zitat, das du anführst:

Eines der herausragenden Merkmale des Nachfolgers von Windows XP, Codename "Longhorn", soll eine stark vereinfachte Suche nach Informationen sein. Ein SQL-basiertes Datenbanksystem namens WinFS, welches auf dem Dateisystem NTFS aufsetzt, soll die Suche nach beliebigen Daten oder Metadaten erlauben, unabhängig davon, ob die Informationen beispielsweise in einer Mail, in einem Bild oder einem Adressbucheintrag zu finden ist.

Und genau das ist nur ein aspekt (aber der, denn redakteure verstehen) von WinFS. Das suchen nach informationen. Das geht aber mit Streams und IFilter plugins für die Desktop-Suche auch ganz gut.

Was das eigentlich neue ist, sind die Verknüpfungen. Man kann eine Mail dann mit einer Person verknüpfen. Diese Person ist mit einer Gruppe oder einem Projekt verknüpft und somit die email auch. Das projekt könnte mit Dokumenten verknüpft sein etc...

Mann kann also emails, die mit einem Projekt oder einer Person verknüpft sind suchen. und gleich noch passende dokumente mit anzeigen. Das geht mit der desktop-suche nicht. die sucht "nur" nach stichworten.