Laden...
U
Benutzerbeschreibung
Konto auf Wunsch des Benutzers gesperrt

Forenbeiträge von userid12392 Ingesamt 36 Beiträge

29.01.2011 - 17:40 Uhr

Jou, das war's.

Danke für die schnelle Antwort.

Michael Schmitz

29.01.2011 - 17:35 Uhr

Hallo,

neuerdings werden bei mir im Projektmappenexplorer auch bin- und obj-Verzeichnisse angezeigt( siehe Bild als Dateianhang ). Das nervt. Kennt einer von Euch dieses Problem und weiß, wie man das abstellt ?

Entwicklungsumgebung : Visual Studio 2010 Express Edition / C#

Gruß

Michael Schmitz

25.11.2010 - 11:30 Uhr

Hallo,

die nähere Untersuchung hat ergeben :

die "kernel32.dll" unter XP hat nicht alle Funktionen, die das Programm braucht.

Das Programm läuft also nicht unter XP, auch wenn .NET-Framework 3.5 oder 4.0 auf dem Rechner installiert ist !

Gruß

Michael Schmitz

23.11.2010 - 04:02 Uhr

Hallo,

ich programmiere gerade einen Installer, der ein Tool in Visual Studio unter den "External Tools" eintragen soll.

Ich selber benutze "Visual C# 2008 Express Edition" und "Visual C# 2010 Express Edition".

Dort lauten die Registry-Pfade wie folgt :

Visual C# 2008 Express Edition:
HKEY_CURRENT_USER\Software\Microsoft\VCSExpress\9.0\External Tools

Visual C# 2010 Express Edition:
HKEY_CURRENT_USER\Software\Microsoft\VCSExpress\10.0\External Tools

Wie ist das bei den Vollversionen von Visual Studio die Ihr benutzt ?
Wie lauten da die Pfade ?

Mich interessieren die Pfade für die 2008er und 2010er Versionen. Die 2005er oder ältere Versionen interessieren mich nicht.

Gruß

Michael Schmitz

06.09.2010 - 12:19 Uhr

Hallo rpauli,

danke für die Rückmeldung.

Ich selber habe das Tool - wie ich gestehen muß - nicht unter XP getestet. Aber ein anderer User sagte, es würde unter XP SP2, Visual Studio 2008 laufen.

Die nächste Version werde ich dann mal für TargetFramework = 3.5 und 4.0 kompilieren, dann müßte ja eine der beiden Versionen auch bei Dir laufen.

Ich melde mich dann nochmal ( wird wohl Mitte Oktober werden ).

Gruß

Michael Schmitz

13.08.2010 - 15:14 Uhr

Es gibt eine neue Version des Programms.

Änderungen :

  1. Es gibt nun für den Debug- und Release-Build** getrennte** Ausgabeverzeichnisse
  2. Deutsche und Englische Sprache

Die vollständige Programmbeschreibung und den Download gibt es unter vs-postbuild.de.

Gruß

Michael Schmitz

26.10.2009 - 11:02 Uhr

Hallo Midnight Run,

wenn das Problem wirklich die Pfadlänge sein sollte, kannst du zum Kopieren die API-Funktion CopyFile benutzen. Wenn du bei dieser Funktion das Prefix "\?" vor die Pfadangabe setzt, kannst du mit Pfadangaben bis zu einer Länge von 32767 Zeichen arbeiten.

Unter File Management Functions findest du eine Übersicht über alle Dateifunktionen, die die API bietet und die alle mit langen Pfadangaben klarkommen.

Codebeispiel zum Aufruf von Copy File



   [DllImport("kernel32.dll", EntryPoint = "CopyFileW", SetLastError = true, CharSet = CharSet.Unicode)]

    [return: MarshalAs(UnmanagedType.Bool)]
    
    private static extern bool _api_CopyFile(
      [In] [MarshalAs(UnmanagedType.LPWStr)]
        string existingFileName,
      [In] [MarshalAs(UnmanagedType.LPWStr)]
        string newFileName,
      [MarshalAs(UnmanagedType.Bool)]
        bool failIfExists);


Gruß

Michael Schmitz

14.10.2009 - 10:15 Uhr

Hallo sakanoue,

es müßte heißen :


    private static byte BIT1 = 0x01;
    private static byte BIT2 = 0x02;
    private static byte BIT3 = 0x04;
    private static byte BIT4 = 0x08;
    private static byte BIT5 = 0x10;
    private static byte BIT6 = 0x20;
    private static byte BIT7 = 0x40;
    private static byte BIT8 = 0x80;

dann kommts richtig raus.

Bei deinem ursprünglich geposteten Code würde es so gehen :


using System;

namespace ConsoleApplication1
{

  [Flags]
  public enum ReadOptions : uint
  {
    eins = 0x01,
    zwei = 0x02,
    vier = 0x04
  }

  class Program
  {
    
    static void Main(string[] args)
    {

      for (int bit = 0; bit <= 7; bit++)
      {
        int value = (int)Math.Pow(2, bit);

        if (Enum.IsDefined(typeof(ReadOptions), (ReadOptions)value))
        {
          Console.WriteLine("{0} - {1}", bit, ((ReadOptions)value).ToString());
        }
        else
        {
          Console.WriteLine("{0} - not defined", bit);
        }
      }

      Console.ReadKey();

    }
  
  }

}

Gruß

Michael Schmitz

29.09.2009 - 19:59 Uhr

Hallo,

es gibt eine neue Version des Programms.

Das Programm hat ein Dialogfeld bekommen, in dem man die nötigen Eingaben machen kann, um das Zusammenfügen der Assemblies zu steuern.

Die ausführliche Beschreibung und den Download gibts unter vs-postbuild.de (und im ersten Beitrag als Dateianhang).

Gruß

Michael Schmitz

17.09.2009 - 01:03 Uhr

Hallo PC17,

ich habe gerade ein kleines Programm geschrieben, das man im Visual-Studio-Postbuild aufrufen kann, um Exe und Dll zusammenzufügen. Näheres findest du hier.

Gruß

Michael Schmitz

13.09.2009 - 14:14 Uhr

Hallo Community,

ich habe ein kleines Programm (vs-postbuild.exe) erstellt, das mehrere .NET-Assemblies (exe, dll) zu einer Assembly vereinigt.
Das Programm benutzt die Funktionalität von Microsoft's ILMerge.exe.

Es kann im Postbuild von Visual Studio aufgerufen werden.
Die im Projekt referenzierten Assemblies können der Haupt-Assembly hinzugefügt werden.

Laufen tut das Ganze unter :
Windows Vista / Windows 7
Visual Studio 2008 / Visual Studio 2010
mit .NET-Framework 3.5 oder höher

Die Programmbeschreibung und den Download zur aktuellen Version gibt es unter vs-postbuild.de

Gruß

Michael Schmitz

Bisherige Versionen:
postbuild.zip (571 KB, 4 mal heruntergeladen)
postbuild.zip (571,05 KB, 5 mal heruntergeladen)
postbuild.zip (588 KB, 69 mal heruntergeladen)
postbuild.zip (127 KB, 27 mal heruntergeladen)

04.09.2009 - 10:20 Uhr

Hallo ToTTo,

da hast du mich gerade mißverstanden. Ich benutze die Funktion <Bitmap.Save(Stream, ImageFormat)> auch nicht, da die Qualität nicht einstellbar ist.

Meine Frage war : Was für ein Objekt liefert die Funktion <GetEncoderInfo> bei Dir zurück ?

Ich benutze den folgenden Encoder :

ImageCodecInfo.CodecName = "Built-in JPEG"
ImageCodecInfo.Clsid = {557cf401-1a04-11d3-9a73-0000f81ef32e}

Schau dir mal die Liste <ImageCodecInfo[] encoders> an, vielleicht enthält die ja mehrere JPEG-Encoder.

Gruß

Michael Schmitz

04.09.2009 - 09:44 Uhr

Hallo ToTTo,

vielleicht liefert die Funktion GetEncoderInfo einen nachträglich installierten Codec, der nicht funktioniert. Mit dem Build-In-Jpeg-Encoder funktioniert das bei mir einwandfrei.

Gruß

Michael Schmitz

26.08.2009 - 13:44 Uhr

Hallo Casiopaya,

ich habe vor einiger Zeit mal mit Visual C# 2008 für Vista eine Funktion geschrieben, um den Inhalt des Master File Tables zu lesen. Dabei habe ich mit CreateFile (API) ein Handle auf das Volume erstellt und dann mit SetFilePointerEx (API) und ReadFile (API) die Bytes direkt vom Volume gelesen. Das hat einwandfrei funktioniert. Vorraussetung ist allerdings, daß man Administratorrechte hat.

Der Aufruf für CreateFile erfolgte dabei mit den folgenden Parametern :



CreateFile(
  volumeGuidString, 
  enACCESS_RIGHTS.GENERIC_READ,
  enFILE_SHARE.READ_AND_WRITE,
  IntPtr.Zero,
  enCREATION_DISPOSITION.OPEN_EXISTING,
  enFileAttributes.None,
  IntPtr.Zero);


Wenn man erst mal das Handle hat, ist der Zugriff mit ReadFile recht einfach programmiert.

Gruß

Michael Schmitz

13.08.2009 - 15:07 Uhr

Hallo prom,

ich habe festgestellt, daß daß ein try-catch-Block in der main-Funktion eine unbehandelte Exception nicht mehr abfängt, wenn die Funktion Application.Run(MainWindow) erst einmal aufgerufen worden ist.

Um danach auftretende unbehandelte Exceptions abzufangen, solltest Du am Anfang der main einen Eventhandler registrieren.


static void Main()
{

   Application.ThreadException += OnUnhandledAppRunExceptionOccured;

   //...

}

static void OnUnhandledAppRunExceptionOccured(object sender, ThreadExceptionEventArgs args)
{

  // write to logfile or display message

}

Gruß

Michael Schmitz

18.07.2009 - 20:12 Uhr

Hallo syn87,

müßte es nicht heißen :

newValue = Format(oldValue, CharacterCasing.Capitalize); ?

Gruß

Michael Schmitz

08.07.2009 - 11:52 Uhr

Hallo carmani,

das kannst du mit DataGridView.ColumnHeadersDefaultCellStyle.WrapMode steuern.
Wenn Du WrapMode = DataGridViewTriState.False setzt, erfolgt kein Umbruch.
Die Einstellung gilt dann für alle Columns des DataGridViews.

Wenn du das nur für eine bestimmte Column setzen möchtest, setzt du für die entsprechende Column : DataGridViewColumn.DefaultCellStyle.WrapMode.

Gruß

Michael Schmitz

03.07.2009 - 10:48 Uhr

Hallo Waffeln,

ob ein Schlüssel existiert, kannst du wie folgt abfragen :


using Microsoft.Win32;
RegistryKey key = Registry.LocalMachine.OpenSubKey("SOFTWARE\\TEST");
Object value = key.GetValue("XYZ");

Mit diesem Aufruf wird der Schlüssel zum Lesen geöffnet.
Wenn der Schlüssel nicht existiert, erhälst Du für key null zurück.
GetValue liest dann den Wert eines Eintrags, der unter diesem Schlüssel liegt.

Gruß

Michael Schmitz

22.06.2009 - 17:25 Uhr

Hallo frankhammer,

wenn es um die Anzahl der Dateien und Verzeichnisse auf einem Laufwerk geht, helfe ich mir folgendermaßen :

ich lese mit der API-Funktion GetFileSizeEx die Größe des Master-File-Tables ($MFT).

Dann lese ich mit der API-Funktion DeviceIoControl den NTFS_VOLUME_DATA_BUFFER . Dieser enthält die Größe eines MFT-Records (BytesPerFileRecordSegment).

Ich teile dann die Größe des MFT durch die Größe eines Records und tue dann so, als ob jeder Record für eine Datei oder ein Verzeichnis steht. Das funktioniert in der Praxis meist ganz gut.

Wie man die Anzahl der Dateien in einem Verzeichnis ohne Scan herausfindet, weiß ich nicht; und ich glaube Windows weiß es auch nicht, denn wenn Du im Windows-Explorer bei einem Verzeichnis auf Eigenschaften klickst, wird ja ein Scan des Dateisystems durchgeführt, um die Anzahl zu ermitteln.

Gruß

Michael Schmitz

PS:
Der Scan des Dateisystems geht mit den API-Funktionen FindFirstFile und FindNextFile recht flott. Bei einer Systempartition mit 60.000 Dateien und Verzeichnissen geht das bei mir in 15 sec.

15.06.2009 - 10:33 Uhr

Hallo Da_Flo,

du kannst einen Timer erstellen und sagen wir mal alle 500 ms aufrufen.



MyAppMainWindow()
{
  System.Windows.Forms.Timer m_timer = new System.Windows.Forms.Timer();
}

private void InitializeTimer()
{
  m_timer.Tick += new EventHandler(this.OnTimerTick);
  m_timer.Interval = 500;
}

private void OnTimerTick(object sender, EventArgs e)
{
  this.ShowInTaskbar = !this.ShowInTaskbar;
}


Gruß

Michael Schmitz

04.06.2009 - 19:44 Uhr

Hallo koksi,

wenn du die Funktion DataGridView.Rows.Add(); ohne Parameter aufrufst, wir eine leere Zeile hinzugefügt.

Wenn du mehr als eine leere Zeile hinzufügen willst, kannst du die Funktion DataGridView.Rows.AddCopies(int indexSource, int count) benutzen.

EDIT : Der ErfinderDesRades ( siehe unten ) hat natürlich Recht : Wenn das DGV gebunden ist, geht das nicht.

29.05.2009 - 16:38 Uhr

Hallo kleines_eichhoernchen,

bei der Variante mit dem ThreadPool habe ich folgendes Problem :

Ich rufe nur eine Funktion auf, kann also keine while(!m_aborted)-Schleife bauen und bin somit darauf angewiesen, nach dem Timeout den Thread mit Thread.Abort abzubrechen. Beim ThreadPool bekomme ich ja keine Referenz auf den gestarteten Thread; oder gibt es da eine Möglichkeit ?

Gruß

Michael Schmitz

29.05.2009 - 11:45 Uhr

Hallo kleines_eichhoernchen,

ich habe es mit der zweiten von Dir genannten Variante ( mit dem Thread-Objekt und dem Aufruf von Thread.Abort ) gemacht.

Funktioniert wunderbar.

Danke.

Michael Schmitz

28.05.2009 - 11:49 Uhr

Hallo cSharper,

wenn ich die API-Funktion GetVolumeInformation für ein Volume aufrufe das nicht bereit ist ( z.B. CD/DVD oder Floppy) kann es lange dauern, bis die Funktion zurückkehrt.

Wie kann ich da einen Abbruch oder Timeout programmieren ?

Gruß

Michael Schmitz

14.05.2009 - 06:56 Uhr

Hallo kleines_eichhoernchen,

danke für deine Antwort.

Gruß

Michael Schmitz

13.05.2009 - 18:43 Uhr

Hallo cSharper,

ich habe eine GUI und zwei Backgroundworker;
und folgende Verständnisfrage:

Für die Zugriffe von den Backgroundworkern auf die Controls der GUI ist ja Invoke/BeginInvoke notwendig, da die Aufrufe der Funktionen der Controls nur von dem Thread aus erfolgen dürfen, der die Controls erstellt hat.

Aber was ist mit der Kommunikation zwischen den beiden Backroundworker ?

Ist es Nicht-Control-Objekten egal welcher Thread zugreift ?
Reicht es da zu locken oder gibt es noch etwas zu beachten ?

Gruß

Michael Schmitz

25.04.2009 - 01:03 Uhr

Hallo ErfinderDesRades,

DataGridView.EndEdit, das Isses !

Danke

Michael Schmitz

24.04.2009 - 21:37 Uhr

Hallo cSharper,

ich habe ein DataGridView.
Die Rows enthalten in der ersten Spalte eine DataGridViewCheckBoxCell.

Das Problem ist folgendes:

Wenn ich in einer Cell das gesetzte Häckchen entfernen will, indem ich DataGridViewCheckBoxCell.Value = false setze, wird die Anzeige nicht aktualisiert.

Das Objekt ist geändert, aber die Oberfläche wird nicht aktualisiert.

Ich habe es bereits mit DataGridView.Invalidate() und DataGridView.Update() versucht, aber ohne Erfolg.

Das DataGridView sitzt auf einer Registrierkarte. Wenn ich zu einer anderen Registrierkarte wechsle und dann wieder zurückgehe zu der Registrierkarte auf der das DataGridView sitzt, ist die Aktualisierung erfolgt und das Häckchen entfernt.

Was kann man da machen ?

23.02.2009 - 23:11 Uhr

Hallo cSharper,

der Übeltäter ist gefunden :

ich hatte DataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders; gesetzt.

Damit mußten erst alle Zeilen durchgegangen werden, um die endgültige Spaltenbreite zu ermitteln.

Ich habe nun DataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None; gesetzt und es funktioniert.

Gruß

Michael Schmitz

23.02.2009 - 16:48 Uhr

Hallo cSharper,

ich habe ein DataGridView erstellt und VirtualMode = true gesetzt und eine Funktion OnCellValueNeeded gebaut.

Das funktioniert auch, die Zellen werden korrekt gefüllt.

Aber : die Funktion OnCellValueNeeded wird für alle Zellen aufgerufen, bevor das DataGridView zum ersten mal angezeigt wird.

Ich dachte, die Funktion würde nur für die Zellen der ersten 20 sichtbaren Zeilen aufgerufen und erst dann wenn der Benutzer nach unten scrollt die Werte für die folgenden Zellen nachgeladen.

Was mache ich da falsch ?

Gruß

Michael Schmitz

15.02.2009 - 01:47 Uhr

Hallo Section31, SeeQuark, ujr,

Danke für eure Antworten. Ich werde es mal mit Herbivore's SyncQueue<T> angehen.

14.02.2009 - 20:50 Uhr

Hallo CSharper,

ich möchte zwei Backgroundworker benutzen. Der eine soll Strings in eine Liste schreiben und der zweite soll die Strings aus der Liste lesen. Was gibt es dabei zu beachten ?
Müssen die Funktionen der Liste nur mit Lock versehen werden, oder gibt es noch anderes zu beachten ?

Gruß

Michael Schmitz

06.01.2009 - 17:35 Uhr

Hallo trib,

warum es nach dem Umbennennen noch nicht funktioniert verstehe ich nicht ganz.

Wenn der Namespace z.B. Test heißt, die Klasse auch Test, und du die Klasse erfolgreich in TestX umbenannt hast, dann versuch mal einzugeben :

global::Test.TestX

und poste kurz, ob es so funktioniert.

Gruß

Michael

03.01.2009 - 16:41 Uhr

Hallo Froggie,

ich wollte auch mal sehen, was es so für Exceptions gibt und habe dafür den folgenden Code geschrieben.

Du kannst damit für alle in deinen Projekten hinzugefügten Verweise ( System.dll, System.Data.dll etc. ) die definierten Exceptions anzeigen lassen.

Den vollständigen Code kannst du unter
http://www.freeware.msz-computer.de/code/exceptions/exceptions.zip
herunterladen. ( Für .NET-Framework 3.0 / Visual Studio 2008 )

Gruß

Michael Schmitz



using System;
using System.Reflection;
using System.Diagnostics;
using System.Collections.Generic;


namespace Exceptions
{

  class csSearchExceptions
  {

    public static void Run()
    {

      List<Type> exceptionTypeList = new List<Type>();

      GetAssemblyExceptions("mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", exceptionTypeList);
      GetAssemblyExceptions("Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", exceptionTypeList);      
      GetAssemblyExceptions("System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", exceptionTypeList);
      GetAssemblyExceptions("System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", exceptionTypeList);
      GetAssemblyExceptions("System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", exceptionTypeList);
      GetAssemblyExceptions("System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", exceptionTypeList);
      GetAssemblyExceptions("System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", exceptionTypeList);

      AssemblyExceptionsCheck(exceptionTypeList);

    }

    private static void GetAssemblyExceptions(String assemblyFullName, List<Type> exceptionTypeList)
    {

      Assembly assembly = Assembly.Load(assemblyFullName);

      Debug.Assert(assembly != null);

      GetAssemblyExceptions(assembly, exceptionTypeList);

    }

    private static void GetAssemblyExceptions(Assembly assembly, List<Type> exceptionTypeList)
    {

      Type[] assemblyTypes = assembly.GetTypes();

      Debug.Assert(assemblyTypes.Length > 0);

      foreach (Type type in assemblyTypes)
      {
        if ( (type.IsSubclassOf(typeof(Exception))) || (type == typeof(Exception)) )
        {
          exceptionTypeList.Add(type);
        }
      }

    }

    public static void AssemblyExceptionsCheck(List<Type> exceptionTypeList)
    {

      enError errorCode;
      String errorCodeString;
      String exceptionFullNameString;

      foreach (Type type in exceptionTypeList)
      {

        Debug.Assert( (type.IsSubclassOf(typeof(Exception))) || (type == typeof(Exception)) , "No exception", type.FullName);

        errorCode = fcErrorCode.GetErrorCodeFromExceptionType(type);

        Debug.Assert(errorCode != enError.UnknownException, "no error-code assigned to exception-type", type.FullName);

        errorCodeString = Enum.Format(typeof(enError), errorCode, "G");
        errorCodeString = errorCodeString.Replace('_', '.');

        exceptionFullNameString = type.FullName;
        exceptionFullNameString = exceptionFullNameString.Replace("<", "");
        exceptionFullNameString = exceptionFullNameString.Replace(">", "");
        exceptionFullNameString = exceptionFullNameString.Replace("+", ".");

        Debug.Assert(errorCodeString == exceptionFullNameString, errorCodeString, exceptionFullNameString);

      }

    }

  }

}


22.06.2008 - 18:34 Uhr

Hallo winSharp93,

Danke für deine Antwort.

SystemFonts.CaptionFont - das isses. Damit kenne ich nun die für die Titelleiste benutzte Schriftart. Den genannten Artikel "Custom Window Border für Form's" werde ich mir demnächst dann mal in Ruhe ansehen.

Gruß

Michael Schmitz

22.06.2008 - 10:28 Uhr

Hallo mycsharper,

ich habe mit C# im Visual Studio 2008 unter Vista in einem Projekt folgendes Problem:

Ich erzeuge ein Meldungsfenster...



public class wdMessage : Form
{

  .......

  protected override void OnPaint(PaintEventArgs e)
  {

    this.Text = "BlaBla";

    Font titleFont = this.Font;

    SizeF size = e.Graphics.MeasureString(this.Text, this.Font);

  }

  ......

}


Schriftart und Schriftgröße der Titelleiste kann ich nicht setzen. Entsprechender Code wird ignoriert. Angezeigt wird die Titelleiste des Fenster mit den in der Systemsteuerung (Vista) festgelegten Werten.
Bei der Abfrage, welcher Font gesetzt ist ( Font titleFont = this.Font; ) erhalte ich falsche Angaben. Es wird <Microsoft Sans Serif / FontSize 7.76> zurückgegeben, obwohl <Terminator Two / FontSize 20> in der Systemsteuerung gesetzt ist und in der Titelleiste des Fensters auch angezeigt wird.

Da ich die Breite der Überschrift wissen will, rufe ich die Funktion <MeasureString> auf. Die Funktion liefert mir aber ein falsches Ergebnis, da die falsche Angabe zum Font als Parameter übergeben wird.

Wie kann ich die Abfrage der tatsächlich für den Fenstertitel benutzten Schriftart programmieren ? ( Werte aus der Registry lesen ? )

Gruß

Michael Schmitz