kraft shdl
1 1 1 1 1 1 1 1 1 1 Rating 0.00 (0 Votes)
Kommentar (0) Aufrufe: 1019
1 1 1 1 1 1 1 1 1 1 Rating 0.00 (0 Votes)

Mich erreicht eine Fehlermeldung vom Kunden. Bei bestimmten Geräten wird die Status-LED in der Initialisierungsphase nicht korrekt geschaltet bzw. sie bleibt aus. Ich lasse mir einen Trace schicken und stelle fest, dass beim Auslesen der Daten aus dem EEPROM etwas schief läuft und für die Revision kein Wert zurückkommt. Ich schaue in den Code und entdecke das folgende Schmuckstück Programmierkunst. Diese Abfrage macht sicher nicht das was sie soll.

if (buffer[1] == 0x00)
{
	//answer seems to be ok
	iFeederRevision = Convert.ToInt32(string.Format("{0:x2}{1:x2}", buffer[3], buffer[2]), 16);
}
else if (buffer[1] == 0x00)
{
	iFeederRevision = 1;
}

Kommentar (0) Aufrufe: 436
1 1 1 1 1 1 1 1 1 1 Rating 0.00 (0 Votes)

Ihr kennt das? Ihr habt schreibt euch ein eigenes Steuerelement und leitet dieses von einem vorhandenen Steuerelement ab. Wenn ihr im Visual Studio auf die entsprechende Datei doppelt klickt öffnet sich das Entwurfsfenster.

Entwurfsansicht

Für manche Steuerelementerweiterungen mag das Sinn machen. Für manche nicht. Wenn ihr die Codeansicht anzeigen wollt, könnt ihr mit F7 dorthin wechseln oder ihr tragt die folgende Anweisung in den Quellcode ein:

[System.ComponentModel.DesignerCategory("Code")]
public class UptimeTablePanel : Panel, IGUIPanel, IGUIDragAndDrop

 

Kommentar (0) Aufrufe: 420
1 1 1 1 1 1 1 1 1 1 Rating 0.00 (0 Votes)

„Egal, was der Bediener eingibt, es steht immer nichts in den manuellen Messwerten drinnen“: so lautet die Fehlerbeschreibung beim Kunden. Und tatsächlich es lässt sich nachvollziehen. Man trägt einen Wert ein, verlässt die Zeile bzw. klickt auf Ok und dann verschwindet der wert wieder. Ein Blick in den Code macht auch schnell deutlich, warum das so ist.

if (oNewValue != null)
{
  clsMesBO.TValue = oNewValue.ToString();
}
{
   clsMesBO.TValue = null;
}

Hier fehlt ein else. So wie es programmiert ist, werden alle Werte mit null überschrieben.

Kommentar (0) Aufrufe: 571
1 1 1 1 1 1 1 1 1 1 Rating 0.00 (0 Votes)

Inzwischen war Zeit, sich die hier bemängelte Verarbeitung näher anzusehen. Es ist noch schlimmer als gedacht und es werden Dateien gelöscht, die sicher nicht gelöscht werden dürfen und zwar unabhängig davon, wo die Software installiert wird. Und der Grund ist, dass in Application.StartupPath nicht der Pfad der Applikation steht, denn gestartet wird bei der Deinstallation der Installer (bei Windows 7 in syswow64).

Beheben lässt sich das in dem man den Applicationpfad aus dem Context ausliest:

string strAssemblyPath = Context.Parameters["assemblypath"].ToString();
strAssemblyPath = Path.GetDirectoryName(strAssemblyPath);

Das löst aber noch nicht das Problem, dass möglicherweise Dateien aus einem Ordner gelöscht werden, die gar nicht zur Software gehören. Das umgehen wir, indem wir eine Datei mit allen installierten Dateien schreiben (dir /b /s > deletefiles.txt). Beim Deinstallieren wird diese Datei eingelesen und es werden nur noch die Dateien gelöscht, die dort aufgeführt sind.

Kommentar (0) Aufrufe: 531
1 1 1 1 1 1 1 1 1 1 Rating 0.00 (0 Votes)

Ein Kunde ruft bei uns an und berichtet von einem Nutzer, bei dem nach der Deinstallation einer Software plötzlich Systemdateien fehlten. Er kündigt am nächsten Tag zu diesem Thema eine Telefonkonferenz an. Ein kurzer Blick in den Code offenbart furchtbares. Wenn jemand die Software nicht in den vorgeschlagenen Ortner installiert, sondern beispielsweise in den Systemordner, werden dort mit der Deinstallation alle Dateien gelöscht.

Es ist zwar noch nicht evaluiert, aber das dürfte das Problem sein. Eine mögliche Lösung: Mit dem ersten Start schreiben wir eine Datei mit den vorhandenen Dateien und Ordnern (also quasi dir /b > installed.txt). bei der Deinstallation lesen wir diese Datei aus und löschen nur die darin gelisteten Dateien einschließlich der Datei selbst. Der Ordner wird nur gelöscht, wenn er leer ist.

So geht es auf jeden Fall nicht:

private void Permission_AfterUninstall(object sender, InstallEventArgs e)
{
	string Path_LabelFiles = Path.Combine(Application.StartupPath, @"Labels");
	if (Directory.Exists(Path_LabelFiles))
	{
		try
		{
			Directory.Delete(Path_LabelFiles, true);
		}
		catch (Exception ex)
		{
			//nope
		}
	}

	try
	{
		Directory.Delete(Application.StartupPath, true);
	}
	catch
	{
	}

}
Kommentar (0) Aufrufe: 619