Laden...

Forenbeiträge von Scavanger Ingesamt 309 Beiträge

08.02.2013 - 23:43 Uhr

ich bin grad an einer eigenen Implementation von WMI, da die .Net-Implementation ein Memory Leak hat.

Und deshalb implementierst du das komplett neu?

Der Bug ist bekannt und such schon gefixt:
The "Win32_Service" WMI class leaks memory in Windows Server 2008 R2 and in Windows 7

02.02.2013 - 15:23 Uhr

Mit einem Profiler (Programmierung).

Da siehst du ganz genau wo welche Methode wieviel Zeit vertrödelt.

01.02.2013 - 13:15 Uhr

Servus,

das mit dem Wrapper stimmt zwar, aber wenn es sich um echte C++ Klassen handelt ist zuerst ein Wrapper in C++/CLI (früher Managed C++) nötig.
Nur C++/CLI ist in der Lage sowohl mit nativen/unmanged Objekten als auch mit managed Objekten umzugehen.
In der C++/CLI Klasse sollte man das Klassendesign auch auf C# "wrappen", z.B. GetFoo() in eine Eigenschaft wandeln oder den ganzen C++ Stringzirkus in System.String usw..

31.01.2013 - 22:46 Uhr

Das casten ist nicht dein Problem, sondern daran das der Appfabric zugrunde liegende Serialisierungsmechanismus, die Eigenschaften und/oder Instanzmember (Mit "Attributen" meinst du wohl (hoffentlich) Eigenschaften, anders als in Java sind Attribute in C# etwas anderes) zumindest wie du ihn verwendest nicht serlialisiert.

23.01.2013 - 20:14 Uhr

Wie kommst du den da drauf?

Im Eventhandler bekommst du doch alle Ausgaben des Prozesses geliefert. Was willst du mehr?

Villeicht fehlt es oben in deinem Code, aber nach process.Start() muss noch process.BeginOutputReadLine() aufgerufen werden, damit auch events gefeuert werden.

23.01.2013 - 19:57 Uhr

Oder geht das letzendlich nur über die 'DataReceivedEventHandler'? ?(

JA!

Steht doch so in der Doku.

Was hast du gegen das Event?

21.01.2013 - 11:08 Uhr

Servus,

XBASE++ kann doch sicherlich mit COM Objekten umgehen?
Evtl. musst du eine Wrapper-DLL schreiben die die benötigten Objekte für COM-Sichtbar macht. Stichworte: COM-Interop, ComVisible Attibute.
Das wäre sicherlich die einfachste Variante, vor allen da so die Objektorientierung erhalten bleibt, im Gegensatz zu dem Umweg über C.

18.01.2013 - 23:07 Uhr

Ein Buchstabe ist ein einzelnes (Buchstaben-)Zeichen, ein Wort besteht einer Folge von einem oder mehreren Buchstaben. Bei Ziffer und Zahl ist das analog.

Gibt es im Deutschen Wörter mit nur einem Buchstaben? 🤔 Mir fällt jetzt spontan keins ein.
Im Englischen ja, da aber auch nur "A" ein. (A Dollar a Day).

So wird es den meisten Menschen gehen, daraus folgt: Bei einem Buchstaben oder Wort wird sofort erkannt, ohne den Zusammenhang zu kennen, ob es sich um einen Buchstabe oder Wort handelt, bei Zahlen oder Ziffern aber nicht immer:
Beispiel: Ein einzelnes 'G' ist einfach nur der Buchstabe (Großes G). Eine einzelne '5' kann die Ziffer 5 sein oder die Zahl Fünf sein.

18.01.2013 - 18:25 Uhr

Ist es wirklich C++ (also mit Klassen, Namespace, usw) oder nur "verkapptes" C (nur Funktionen, " extern "C" ") und kein COM?

C und COM ist kein Problem. (Stichworte: DllIMport, COM-Interop)

Echte C++ Klassen sind komplizierter, dann hilft nur der Umweg über einen Wrapper in Managed C++.
Hier mal ein Link: Consuming Unmanaged C++ Class Libraries from .NET Clients

15.01.2013 - 01:16 Uhr

Hab mein Posting gerade konkretisiert. 😉

Und was wenn der User es doch manuell nach Program Files kopiert? Oder einen anderen Order der nur mit Adminrechten erreichbar ist.

Ich halte einen Installer (und der dazugehörigr Uninstaller) immer für guten Stil, außer für wirkliche Mikro-Programme die keine Konfig-Daten speichern.

Und Tools für den USB-Stick, wie oben geschrieben.

15.01.2013 - 01:01 Uhr

Wäre es da nicht besser, die Einstellungen im selben Ordner wie die Anwendung abzuspeichern?

Klares Nein wenn die Anwendung im "Program Files"-Ordner liegt, da seit Windows Vista nur mit Adminrechten zugriff auf den Programmorder möglich ist.
Wenn ein Programm trotzdem auf den Programmordner zugreift werden die Zugriffe in den "Virtual Store" (c:\users\benutzername\appdata\local\virtualstore\program files.. ) umgeleitet.
Und damit hast du wieder das gleiche "Problem";

Wenn das Programm allerdings z.B. vom USB-Stick laufen soll und die Daten nicht Rechnerspeziefisch sind, dann macht es allerdings Sinn.

15.01.2013 - 00:57 Uhr

string s = Convert.ToString(7, 2); // Zahl, Basis

Ergibt: "111"

Danach halt noch in deine gewünschte Darstellung konvertrieren.

08.01.2013 - 20:24 Uhr

Um mal den Thread aus der Versenkung zu holen:

Ich möchte Code um die Größe von einer sequentiellen Struktur in Bytes abzurufen:

Beispiel:


[StructLayout(LayoutKind.Sequential)]
struct Foo
{
    public int baz;
    public ushort bar;
    public long foobar;
}

Ohne dabei Marshal.SizeOf() oder sizeof() zu benutzen.
Die Angabe muss aber mit Marshal.SizeOf() identisch sein (Stichwort: Byte Alignment).

Ist locker mit weniger als 10 Zeilen zu schaffen. 😉

06.01.2013 - 15:08 Uhr

Leg mal das Arbeitsverzeichnis fest. (ProcessStartInfo.WorkingDirectory) Standardmäßig wird Windows/System32 festgelegt.

05.01.2013 - 20:31 Uhr

hast du erfahrungen damit, speziell was die wiederherstellung der später gelöschten datein angeht?

Komm ich jetzt nicht mit was du meinst? Meinst du das Wiederherstellen von Daten auf einem Datenträger oder auf dem Virtuellen Laufwerk?

05.01.2013 - 15:17 Uhr

Schau mal hier:

Virtual Drive SDK

Gibts für nicht kommerzielle Anwendungen umsonst.

C#-Demo:
C# File/RAM disk (COM interface)

04.01.2013 - 23:40 Uhr

Was du vorhast funktioniert nicht.

Wenn eine Datei von einem Programm geöffnet werden soll muss sie im Dateisystem sichtbar sein, diese kann natürlich auch im Arbeitsspeicher sein (Stichwort RAM-Disk, virtuelles Laufwerk), ist natürlich dann ganz normal zugreifbar.
Selbst wenn das funktionieren würde: Was willst du dagegen machen wenn jemand die Datei einfach im Programm neu speichert?

04.01.2013 - 12:45 Uhr

Die VB-PowerPacks sind doch schon in Visual Studio integriert?!?
Die hättest du nicht nochmal runterladen brauchen.

Du musst nur den Verweis auf "Microsoft.VisualBasic.PowerPacks.Vs" hinzufügen.

29.12.2012 - 21:10 Uhr

Wo ist das Problem?

Definiere das Datenbankobjekt entweder, wie von chillic vorgeschlagen, als offentliches Property/Feld oder benutze das Formular nur dazu die Daten abzufragen und überlass die Kommunikation mit der DB dem Hauptprogramm.
In beiden Fällen brauchst du die Verbindung nur einmal herzustellen und kannst sie bis zum Programmende geöffnet lassen.

29.12.2012 - 19:09 Uhr

Hmm..

warum, muss das Login Formular das komplette Datenbankobjekt kennen?
Es reicht doch wenn Username, Passwort und evtl. Server abgefragt werden und zurückgegeben werden.

27.12.2012 - 07:07 Uhr

VncSharp: A .NET VNC Client Library

VncSharp is a VNC Client Library and custom Windows Forms Control. VncSharp is also free software, released under the GPL.

eine LGPL o. ä. lizenzierte Library ist mir auch nicht bekannt. Aber es kann ja nicht schaden, die Autoren bzgl. einer Lizenzänderung von GPL auf LGPL mal anzuschreiben. Wäre nicht das erste mal, dass ein Autor nachträglich die Lizenz geändert hat. Fragen kostet nix....

Licensing

VncSharp is licensed for use in open source applications. If you have an idea for another use and require a different license, let me know.

21.12.2012 - 17:48 Uhr

Servus,

prinzipiell, ist die Vorgehensweise IMHO i.O.

Ein Vorschlag wäre noch die Childobjekte in einer SortedList<T>, sortiert nach der geringsten Differenz, zu halten.
So musst die ganzen Childobjekte nur einmal beim Erstellen der Liste "durchrattern" (oder noch eleganter: Gleich an der richtigen Position beim erstellen der Objekte einsetzen) und kannst dann ganz einfach aus das oberste/unterste Object in der Liste zugreifen. Natürlich vorausgesetzt die Objekte bzw. die "Differenz" bleibt über die Laufzeit gleich.

Edit:
100 Objekte sind nicht wirklich viel, daher der alte Spruch von Donald Knuth: "Premature optimization is the root of all evil"

04.12.2012 - 16:48 Uhr

Servus,

Aber bleibt dann nicht immernoch die Frage wie man von einer ASM die Frameworkversion abruft? 🤔

Gar nicht. 😉

Die Frameworkversion selber wird in der Assembly nirgends gespeichert (nur die Version der CLR), die höchste Dateiversion der referenzierten Framework Assemblys entspricht aber der Frameworkversion.

Wenn ich mich nicht irre, ahst du mir geschrieben ich soll von jeder referenzierten Assembly die Frameworkversion abrufen und schauen welche die höchste ist.
Das geht aber nicht solange ich diese nicht habe^^

Doch, die hast du, da die Framework-Assemblys sich im GAC (Global Assembly Cache) befinden.

04.12.2012 - 15:00 Uhr

Servus,

die einzige Wasserdichte Version die Frameworkversion zu bestimmen ist die betreffende Assembly zu laden und alle(!) referenzierten Framework Assemblys nach der höchsten Versionsnummer zu durchsuchen.

Version der Framework Assembly = .net Framework Version, manche Assembly haben sich aber mit einer neuen Version nicht geändert, beim 3.5 Framework kamen nur Assembly hinzu. Die meisten haben aber noch Version 2.0.
Daher müssen alle referenzierten .netFx-Assemblys duchsucht werden.


public static Version GetNetFXVersion(Assembly assembly)
        {
            if (assembly == null)
                throw new ArgumentNullException("assembly");

            Version version = new Version(1, 0);
            foreach (AssemblyName assemblyName in assembly.GetReferencedAssemblies())
            {
                Assembly refAssembly = null;
                try
                {
                    refAssembly = Assembly.Load(assemblyName);
                }
                catch
                {
                    continue;
                }

                if (refAssembly != null)
                {
                    AssemblyProductAttribute[] productAttr = (AssemblyProductAttribute[])refAssembly.GetCustomAttributes(typeof(AssemblyProductAttribute), false);
                    if (productAttr.Length == 1)
                    {
                        if (productAttr[0].Product == "Microsoft® .NET Framework" &&
                            assemblyName.Version > version)
                            version = assemblyName.Version;
                    }


                }
            }

            return version;
        }

22.11.2012 - 16:24 Uhr

Ich muss noch schnell eine Perle aus dem Samplecode der o.g. API loswerden:

class MySortedDictionary :
   System.Collections.Generic.SortedDictionary<long, Object>
{
   public Object Get(long key)
   {
      try { return this[key]; }
      catch (System.Collections.Generic.KeyNotFoundException) { }
      return null;
   }

   public void Set(long key, Object val)
   {
      this[key] = val;
   }
};

8o 8o 8o

21.11.2012 - 17:47 Uhr

Ich hab hier gerade eine .NET-API, die scheinbar eine 1:1 Umsetzung einer C-API ist, sprich die ganzen Features von .NET wird komplett gepfiffen.

Los gehts das die ganze API komplett auf Objektorientierung verzichtet, alle Interfaces sind als Structs definiert sind (es gibt in der gesamten API keine einzige Klasse !!!), statt Exceptions gibts wie im guten alten C Errorcodes als Returnwerte in Methoden (Der Knüller ist ja das intern Exceptions fliegen, die aber alle gefangen werden und als Errorcode zurück gegeben werden), Generika und Namespaces sind wohl Teufelswerk.

Allein der Samplecode ist schon gruslig.

Sinngemäß:


int error = 0;
Bar bar;
int  i;

error = foo(out bar, out i);

// Wie in guten alten Zeiten ....
if (error != 0)
{
     // Selbst Api.ErrorCodes ist ein struct!
     if (error == Api.ErrorCodes.Fatal)
     {
          Console.WriteLine("Panik");
          return;
     }
}

Die API ist in C++/CLI geschrieben, was meinen Verdacht das das ein "Wir brauchen unbedingt und ganz schnell eine .net API" Schnellschuss ist. Offiziell sind es aber "Performancegründe". 8o

So verwende ich lieber gleich eine native Dll, der Code der dabei herauskommt sieht fast genauso aus und da weiß ich wenigstens warum! :evil:

Wenn ich mehr Zeit hätte würde ich am liebsten die ganze API neu implementieren!

04.11.2012 - 19:09 Uhr

Ich habe deine Signatur als Vorschlag zum Auslesen angesehen und 5 Minuten lang nichts kapiert, hehehe. Hat diese überhaupt einen Sinn?

Hatt ich auch noch nicht... 🤔 😉

Ist ein vollständiges und lauffähiges C# Programm, probiers mal aus. 😉

Signatur-Programme

04.11.2012 - 18:53 Uhr

Servus,

wenn du Glück hast speichert deine Kamera/Handy in den Exif-Daten die Ausrichtung, das Ei-Phone z.B. speichert sie.

03.11.2012 - 14:03 Uhr

Und warum nimmst du nicht das Control das dafür gedacht ist?

NumericUpDown-Klasse

Hab das Gefühl du erfindest das Rad nochmal neu.

02.11.2012 - 18:57 Uhr

Servus, 😉

Leider gibt es keine Möglichkeit Methoden unabhängig von ihrem Typ(Projekt, Unterprojekt,Arbeitspaket) auszuführen, genau das möchte ich aber 🙂

doch die gibt es. Nennt sich Vererbung (C#-Programmierhandbuch)

und gehört zu den absoluten Grundlagen, deshalb sei hier mal auf [Hinweis] Wie poste ich richtig? Punkt 1.1/1.1.1 hingewiesen.

Nur kurz:
Dein Beispiel ist quasi ein Paradebeispiel für Vererbung. Deine Methoden implementierst du in deiner Basis Klasse (Projekt) und deine Unterklassen (Unterprojekte) erben davon, und schon hast du die Methoden überall in den Klassen von dieser Basisklasse erben.

31.10.2012 - 20:30 Uhr

Ergänzend zu chilic:

RSA ist ca. um den Faktor 1000 (kein Tippfehler) langsamer als symmetrische Verfahren wie z.B. TrippleDES oder AES.
RSA eignet sich im Grunde nur dazu kurze kurze Daten zu verschlüsseln. Deswegen wird die eigentliche Verschlüsselung in der Praxis symmetrisch durchgeführt und dann nur der symmetrische Schlüssel per RSA verschlüsselt übertragen.

30.10.2012 - 15:02 Uhr

Klar sicher... 😉

ich hab die Datei aber inzwischen mit einer wilden "Querbeet"-Suche gefunden.

Sie befindet sich sogar im "Anwendungsdaten"-Ordern, aber unter "Microsoft_Corporation\DefaultDomain_Path_(...)\6.00(...)&quot;

Trotzdem danke. 😁

30.10.2012 - 14:57 Uhr

Servus,

bitte, bitte. 😁

Aber das Problem ist trotzdem das du einen BSTR zurückbekommst.
Die Steuerzeichen ist der Längenpräfix, der Zeiger zeigt trotzdem auf das erste Zeichen und nicht auf den Längenpräfix, deshalb zeigt der Debugger den String richtig an.

Verwende das MarshalAsAttibute mit UnmanagedType.BSTR, dann kannst du dir das "gemurkse" mit den entfernen sparen.

30.10.2012 - 14:42 Uhr

Servus,

danke,
aber das funktioniert leider nicht da es sich um eine Namespace-Extension des Windows-Explorers handelt, also kann ich in der Anwendung selber nicht nachschauen.

30.10.2012 - 14:27 Uhr

Servus,

ich bin schreibe gerade eine Dll (wird für COM Interop registriert, befindet sich also im GAC) die das .net Konfigurationsmodell verwendet. Es funktioniert alles wunderbar, Einstellungen werden gespeichert und auch wieder gelesen.

Nur finde ich die .config Datei zu meiner DLL nicht? Unter (Lokale)Anwedungsdaten/<CompanyName> ist jedenfalls nichts zu finden.

29.10.2012 - 17:03 Uhr

Servus,

du willst also die Meta-Daten einer Bilddatei auslesen?
Die liefert dir GetDetailsOf auch nicht.

Was du suchst ist die PropertyItem-Klasse
oder auch BitmapMetadata-Klasse

28.10.2012 - 21:48 Uhr

Servus,

warum verwendest du umständlich eine native Funktion aus der Shell32 und nicht gleich die FileInfo-Klasse?

Zum eigentlichen Problem:
Ich denke das es ein PInvoke Problem ist, das der Rückgabestring als flascher Typ gemarschalt wird.
Wie sieht denn die DLL-Import Deklaration aus? Der Rückgabe wert der Funktion ist ein BSRT*, bist du sicher das das MarshalAs Attribut richtg angegeben ist?

24.10.2012 - 16:28 Uhr

Strimmt schon,

aber nicht C und C++ verwechslen. 😉

Das gilt für C Funktionen (Prozedual) , hier geht es aber um C++ Klassen (Objektorientiert), i.d.R wird dafür, wie herbivore geschrieben hat, ein CLI-Wrapper verwendet, was etwas aufwendiger ist als reines PInvoke.

18.10.2012 - 00:12 Uhr

Sicher das du auch die gleichen Zahlen hast (VB und C#)?

Beide Ergebnisse sind nämlich falsch!
Korrekt wäre 5987520.

Und C# spuckt bei mir auch die korrekte Zahle aus. C (ohne #) auch. VB hab ich nicht da.

07.10.2012 - 21:53 Uhr

Habs gerade selber gelöst bekommen:

Das SAFEARRAY muss vom Typ IUnknown sein:


SAFEARRAY *types = SafeArrayCreateVector(VT_UNKNOWN, 0, 0);

Dann klappts auch mit dem Nachbarn. 😉

07.10.2012 - 20:44 Uhr

Servus,

ich spiele gerade damit herum die .net-CLR in einer nativen C++ Anwendung zu hosten, genauer gesagt .net Assemblys zur Runtime in einer nativen Anwednung zu starten.

Dafür muss ich erst diverse .net Klassen/Methoden über die native API von .net ansprechen, sprich ich muss managed Code aus unmanged Code aufrufen.
Leider ist diese API von MS praktisch kaum dokumentiert. 🙁

Zum eigentlichen Problem:
Ich will die Methode Type.GetMethod-Methode (String, Type[]) aufrufen. Die Methode hat in C++ folgende Signatur:


HRESULT __stdcall mscorlib::GetMethod_5(BSTR name, SAFEARRAY *types, mscorlib::_MethodInfo **pRetVal)

Mein Problem ist der Parameter SAFEARRAY *types. Ich brauche also ein Safearray vom Typ mscorlib::_Type ( = System.Type).
Leider funktioniert ein CComSafeArray<_Type> nicht, CComSafeArray funktioniert nur für primitive Typen. 🙁
Ein "normales" SAFEARRAY z.B. mit BSTR funktioniert auch nicht.

Hier ist dann mein Wissen von .net/OLE/ATL/C++ zu Ende und MSDN und Google schweigen auch zu dem Thema.

Also, wie kann ich ein SAFEARRAY von einem .net-Typ erstellen?

06.10.2012 - 21:07 Uhr

Servus,

das mit dem Interface muss nicht sein, das Stichwort heiße aber in jedem Fall Reflection.System.Reflection-Namespace

Kleines Beispiel:


Assembly myDll = Assembly.LoadFile(path);
Type typeClass1 = myDll.GetType("Class1");
object class1obj = Activator.CreateInstance(typeClass1);

object[] myParams = new object[] {"Hallo", "Welt2"};
typeClass1.InvokeMember("Run", BindingFlags.InvokeMethod, null, class1obj, myParams);

Die Methode muss natürlich "public" sein.

17.09.2012 - 16:23 Uhr

Kurze Frage:

Für beliebig große Schachbretter oder genügt das klassische 8x8 Brett?

15.09.2012 - 17:47 Uhr

Servus,

die Calling Convention stimmt nicht. WINAPI ist (i.d.R) als Stdcall definiert, nicht Cdecl bentutz StdCall oder besser Winapi, dann bist du auf der sicheren Seite.

Du kannst die Angabe der Calling Convention im DLLImport-Attribut auch weglassen, wenn nichts angegeben ist wird Stdcall verwendet.

Edit:
Kleiner Hinweis:
Der Unsafe Block mach so überhaupt keinen Sinn.

10.09.2012 - 19:29 Uhr

Servus,

hoppla, sorry. X(

Das Dokument das dort verlinkt sein sollte findest du hier:

[MS-SHLLINK]: Shell Link (.LNK) Binary File Format

Im forensic Wiki heißt es ja auch:

Custdest files reportedly follow a structure of sequential MS-SHLLINK binary format segments.

Mit den Infos zum binären Format zu MS-SHLLINK solltest du problemlos einen eigenen Reader schreiben können, einen fertigen Reader/API gibt es glaube ich nicht.

10.09.2012 - 16:57 Uhr

Es geht um die Jump Lists, richtig?

Schau mal hier und insbesondere das verlinke PDF an:

Forensics Wik: Jump Lists

09.09.2012 - 23:48 Uhr

Servus,

die äußere while Schleife halte ich für suboptimal, versuche stattdessen einen eigenen Event zu definieren der eintritt wenn eine neue Nachricht eingetroffen ist.

Zum abarbeiten:
Ich hab sowas mal in C gemacht, mit ("Eigenbau") Stack und Funktionspointern, hier mal in eine grobe C#-Version:



private delegate void OperationDelegate(string message);
private Stack<OperationDelegate> queue;

public Foo()
{
    // Stack init
    queue = new Stack<OperationDelegate>();
    queue.Push(new OperationDelegate(this.Step3));
    queue.Push(new OperationDelegate(this.Step2));
    queue.Push(new OperationDelegate(this.Step1));
}

// Event, mit passender EventArgs, nur Beispiel!
void MessageRecieved(object sender, EventArgs e)
{
    string message = e.Message; 
    foreach (OperationDelegate currentStep in queue)
    {
        if (skipCurrentStep)
            continue;

        currentStep(message);
    }
}

private void Step1(string message)
{
    // ...
}

// Step2 und Step3 analog

08.09.2012 - 21:54 Uhr

Hallo,

was der TS meint ist wohl so etwas wie die Obfuskation in JavaScript oder Perl, in C# gibt es kein eval(), deshalb geht das so nicht.

Warum lagerst du den Code der nicht zu Weitergabe gedacht ist in eine Dll aus und obfuskiertst die ganz normal?

... oder du machst dir die Mühe und schreibst den Code so wie in meiner Signatur. 😁

31.08.2012 - 23:24 Uhr

oder gibts da einen eleganteren weg? (wenn moeglich ohne .net, soll naemlich spaeter auf einem c99 kompatiblen controller laufen)

Und warum erstellst du dann den Prototypen in C#?

C und C# sind zwei grundverschiedene Sprachen, die außer gewissen syntaktischen Ähnlichkeiten wenig miteinander zu tun haben.

In C würde dein Code im übrigen funktionieren.