<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Andreas Awenius' blog</title>
	<atom:link href="http://www.awenius.de/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.awenius.de/blog</link>
	<description>Infos zu .NET und Modellierung</description>
	<lastBuildDate>Mon, 30 Nov 2009 21:59:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>DoDragDrop und SelectedNode in WinForms TreeViews</title>
		<link>http://www.awenius.de/blog/2009/11/30/dodragdrop-und-selectednode-in-winforms-treeviews/</link>
		<comments>http://www.awenius.de/blog/2009/11/30/dodragdrop-und-selectednode-in-winforms-treeviews/#comments</comments>
		<pubDate>Mon, 30 Nov 2009 21:59:41 +0000</pubDate>
		<dc:creator>Andreas</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Softwareentwicklung]]></category>

		<guid isPermaLink="false">http://www.awenius.de/blog/?p=67</guid>
		<description><![CDATA[Hallo,
kürzlich fiel mir ein überraschender Effekt im Zusammenhang mit WinForms TreeViews und drag and drop auf. Fall man im MouseDown-Event eine DragDrop-Operation mit der Methode DoDragDrop() startet, wird der selektierte Knoten nicht auf den angeklickten Knoten gesetzt.
In folgendem Beispiel wurde der Knoten &#8220;BasicActivities&#8221; angeklickt und damit zum selected node. Anschließend wurde der Knoten ActivityFinalNode angeklickt. [...]]]></description>
			<content:encoded><![CDATA[<p>Hallo,</p>
<p>kürzlich fiel mir ein überraschender Effekt im Zusammenhang mit WinForms TreeViews und drag and drop auf. Fall man im MouseDown-Event eine DragDrop-Operation mit der Methode DoDragDrop() startet, wird der selektierte Knoten nicht auf den angeklickten Knoten gesetzt.</p>
<p>In folgendem Beispiel wurde der Knoten &#8220;BasicActivities&#8221; angeklickt und damit zum selected node. Anschließend wurde der Knoten ActivityFinalNode angeklickt. Der Focus-ähnliche Rahmen um den Knoten &#8220;BasicActivities&#8221; blieb aber erhalten:</p>
<p><img src="http://www.awenius.de/blog/wp-content/uploads/2009/11/SelektierterKnotenFalsch.png" alt="SelektierterKnotenFalsch" title="SelektierterKnotenFalsch" width="314" height="208" class="aligncenter size-full wp-image-68" /></p>
<p>Das hat zur Konsequenz, dass der zuvor selektierte Knoten &#8220;BasicActivities&#8221; nach einer anschließenden Mousebewegung <strong>ohne click</strong> wieder selektiert wird. </p>
<p>Dieses Verhalten tritt nicht auf, wenn der Aufruf der Methode DoDragDrop() unterbleibt.</p>
<p>Wenn man den Knoten im MouseDown-Event explizit selektiert (wie <a href="http://www.syncfusion.com/FAQ/windowsforms/faq_c91c.aspx#q807q">hier</a> beschrieben), tritt dieser Effekt nicht auf und das TreeView verhält sich wie gewohnt.</p>
<pre lang="C#" line="1">
theTreeView.SelectedNode = nodeAt;
DoDragDrop(nodeAt.TheClass, DragDropEffects.Copy);
</pre>
<p>Viele Grüße,<br />
Andreas<br /><p>Technorati Tags: <a href="http://technorati.com/tag/WinForms" rel="tag">WinForms</a>, <a href="http://technorati.com/tag/Drag+and+Drop" rel="tag">Drag and Drop</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.awenius.de/blog/2009/11/30/dodragdrop-und-selectednode-in-winforms-treeviews/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wie kann man native Methoden in managed C++ Klassen nutzen?</title>
		<link>http://www.awenius.de/blog/2009/10/04/wie-kann-man-native-methoden-in-managed-c-klassen-nutzen/</link>
		<comments>http://www.awenius.de/blog/2009/10/04/wie-kann-man-native-methoden-in-managed-c-klassen-nutzen/#comments</comments>
		<pubDate>Sun, 04 Oct 2009 19:17:04 +0000</pubDate>
		<dc:creator>Andreas</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.awenius.de/blog/?p=66</guid>
		<description><![CDATA[Hallo,
Microsoft hat mit der Einführung des .NET-Frameworks auch C++-Erweiterungen (C++/CLI) definiert, mit denen vorhandener C++ source code für .NET-Anwendungen verfügbar gemacht werden kann.
Die Intention dabei war die Steigerung der Akzeptanz des .NET-Frameworks, da es relativ einfach gemacht wird, bereits vorhandenen C++ code in .NET-Anwendungen zu integrieren. Meiner persönlichen Erfahrung nach geht das sehr gut, d.h. [...]]]></description>
			<content:encoded><![CDATA[<p>Hallo,</p>
<p>Microsoft hat mit der Einführung des <a href="http://de.wikipedia.org/wiki/.NET">.NET</a>-Frameworks auch C++-Erweiterungen (<a href="http://de.wikipedia.org/wiki/C%2B%2B/CLI">C++/CLI</a>) definiert, mit denen vorhandener C++ source code für .NET-Anwendungen verfügbar gemacht werden kann.</p>
<p>Die Intention dabei war die Steigerung der Akzeptanz des .NET-Frameworks, da es relativ einfach gemacht wird, bereits vorhandenen C++ code in .NET-Anwendungen zu integrieren. Meiner persönlichen Erfahrung nach geht das sehr gut, d.h. es ist ziemlich einfach vorhanden C++ code mit C++/CLI .NET-tauglich zu machen und die entstandenen <a href="http://de.wikipedia.org/wiki/.NET#Assemblys">Assemblys</a> haben keine nennenswerten Einschränkungen (abgesehen davon, dass sie nur für die Plattform geeignet sind, für die der native code kompiliert wurde).</p>
<p>Der übliche Weg besteht darin eine neue Assembly zu erstellen, die C++/CLI Klassen (und ggf. native Klassen) enthält. Diese Klassen rufen dann den eigentlichen legacy code, typischerweise in bereits vorhandenen Libraries/DLLs.</p>
<p>Folgende Frage stellt sich bei der Erstellung eines Managed C++ Wrappers um vorhanden C++ code schnell:</p>
<p>Wie kann ich innerhalb des .NET-Wrappers native Datenstrukturen zwischen managed Klassen austauschen?</p>
<p>Dies ist grundsätzlich nicht ohne weiteres möglich, da in der öffentlichen Schnittstelle nur CLR-kompatible Datentypen verwendet werden dürfen (ansonsten könnten nicht alle Elemente der Schnittstelle von anderen .NET kompatiblen Komponenten konsumiert werden).</p>
<p>Es ist allerdings möglich, private Methoden zu definieren, die nicht CLR-konforme Datentypen konsumieren oder zurückgeben dürfen. Damit solche Methoden von anderen Klassen in der C++/CLI Wrapper-Assembly gerufen werden dürfen, müsste man alle diese Klassen als <code>friend</code> definieren, was eine etwas unbefriedigende Lösung ist.</p>
<p>Diese Überlegung führt aber zur optimalen Lösung: die Deklaration der entsprechenden Methoden als <code>public private</code>.<code> public private</code> ist in C++/CLI die Entsprechung zu <code>internal</code> in C# und bedeutet &#8220;sichtbar innerhalb der Assembly&#8221;.<br />
Da die entsprechenden Methoden nur von den C++-Klassen innerhalb der Wrapper-Assembly gerufen werden, gibt es keinen Grund sie zu verbieten (was der Compiler dann auch nicht macht).</p>
<p>Viele Grüße,<br />
Andreas</p>
<p>Technorati Tags: <a href="http://technorati.com/tag/.NET" rel="tag">.NET</a>, <a href="http://technorati.com/tag/Managed+C%2B%2B" rel="tag">Managed C++</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.awenius.de/blog/2009/10/04/wie-kann-man-native-methoden-in-managed-c-klassen-nutzen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Diplom-Informatiker(FH) verdienen mehr als Informatiker von der Universität?</title>
		<link>http://www.awenius.de/blog/2009/08/03/diplom-informatikerfh-verdienen-mehr-als-informatiker-von-der-universitat/</link>
		<comments>http://www.awenius.de/blog/2009/08/03/diplom-informatikerfh-verdienen-mehr-als-informatiker-von-der-universitat/#comments</comments>
		<pubDate>Mon, 03 Aug 2009 07:41:33 +0000</pubDate>
		<dc:creator>Andreas</dc:creator>
				<category><![CDATA[Sonstiges]]></category>

		<guid isPermaLink="false">http://www.awenius.de/blog/?p=65</guid>
		<description><![CDATA[Hallo,
die  &#8220;Beruf und Karriere&#8221;-Beilage der Süddeutschen Zeitung vom 1./2.08.09 enthielt einen interssanten Artikel mit dem Titel &#8220;Uni-Abgänger verdienen mehr als FH-Absolventen&#8221;.
Darin wurden die Ergebnisse einer Befragung von mehr 5000 Absolventen des Jahrgangs 1997 veröffentlicht. Im Durchschnitt verdienten Uni-Abgänger 10 Jahre nach Ende ihres Studiums 64.300,00 EUR während FH-Absolventen 59.400,00 EUR verdienten.
Soweit entspricht das etwa dem [...]]]></description>
			<content:encoded><![CDATA[<p>Hallo,</p>
<p>die  &#8220;Beruf und Karriere&#8221;-Beilage der <a href="http://www.sueddeutsche.de/">Süddeutschen Zeitung</a> vom 1./2.08.09 enthielt einen interssanten Artikel mit dem Titel &#8220;Uni-Abgänger verdienen mehr als FH-Absolventen&#8221;.</p>
<p>Darin wurden die Ergebnisse einer Befragung von mehr 5000 Absolventen des Jahrgangs 1997 veröffentlicht. Im Durchschnitt verdienten Uni-Abgänger 10 Jahre nach Ende ihres Studiums 64.300,00 EUR während FH-Absolventen 59.400,00 EUR verdienten.</p>
<p>Soweit entspricht das etwa dem was man erwarten würde.</p>
<p>Überraschenderweise scheint das für die Informatik nicht zu gelten, hier verdienten Uni-Abgänger im Schnitt 70.800,00 EUR und FH-Abgänger 77.300,00 EUR. Das sind rund 10% mehr!</p>
<p>Ich selbst habe ebenfalls trotz allgemeiner Hochschulreife an der FH studiert und war mit dieser Entscheidung sehr zufrieden. Ich habe in den beiden Praktikumsemestern in zwei verschiedenen Unternehmen gearbeitet und auch die Diplomarbeit in einem (dritten) Unternehmen geschrieben. Dabei habe ich sehr viel gelernt, wertvolle Kontakte geknüpft und auch meine erste Stelle nach dem Studium gefunden.</p>
<p>Interessehalber noch die Ergebnisse für die anderen Fächer (erstgenannt die Gehälter der Uni-Absolventen):</p>
<p>Bauingenieur: 56.100,00 gegenüber 49.700,00<br />
Elektrotechnik: 70.900,00 gegenüber 64.200,00<br />
Maschinenbau: 76.200,00 gegenüber 62.900,00</p>
<p>Auffällig ist auch der große Abstand bei den Maschinenbauern.</p>
<p>Viele Grüße,<br />
Andreas</p>
<p>Technorati Tags: <a href="http://technorati.com/tag/Gehalt" rel="tag">Gehalt</a>, <a href="http://technorati.com/tag/Uni" rel="tag">Uni</a>, <a href="http://technorati.com/tag/FH" rel="tag">FH</a>, <a href="http://technorati.com/tag/Informatik" rel="tag">Informatik</a>, <a href="http://technorati.com/tag/Elektrotechnik" rel="tag">Elektrotechnik</a>, <a href="http://technorati.com/tag/Maschinenbau" rel="tag">Maschinenbau</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.awenius.de/blog/2009/08/03/diplom-informatikerfh-verdienen-mehr-als-informatiker-von-der-universitat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Entwicklung von C++ COM-Komponenten mit Visual Studio als eingeschränkter Benutzer</title>
		<link>http://www.awenius.de/blog/2009/07/20/entwicklung-von-c-com-komponenten-mit-visual-studio-als-eingeschrankter-benutzer/</link>
		<comments>http://www.awenius.de/blog/2009/07/20/entwicklung-von-c-com-komponenten-mit-visual-studio-als-eingeschrankter-benutzer/#comments</comments>
		<pubDate>Mon, 20 Jul 2009 06:51:55 +0000</pubDate>
		<dc:creator>Andreas</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.awenius.de/blog/?p=64</guid>
		<description><![CDATA[Hallo,
es gibt eine klare Empfehlung für die tägliche Arbeit auf einem Computer mit Windows XP ein Konto mit eingeschränkten Rechten zu verwenden. Der Hauptgrund ist die damit stark reduzierte Wahrscheinlichkeit einem Virus oder anderer Malware zum Opfer zu fallen.
Für Entwickler gibt es noch einen weiteren, wesentlichen Grund für die Verwendung eines Kontos mit eingeschränkten Rechten: [...]]]></description>
			<content:encoded><![CDATA[<p>Hallo,</p>
<p>es gibt eine klare Empfehlung für die tägliche Arbeit auf einem Computer mit Windows XP ein Konto mit eingeschränkten Rechten zu verwenden. Der Hauptgrund ist die damit stark reduzierte Wahrscheinlichkeit einem Virus oder anderer <a href="http://de.wikipedia.org/wiki/Malware">Malware</a> zum Opfer zu fallen.</p>
<p>Für Entwickler gibt es noch einen weiteren, wesentlichen Grund für die Verwendung eines Kontos mit eingeschränkten Rechten: sie testen damit automatisch, ob die entwickelte Software auch mit eingeschränkten Rechten funktioniert &#8211; was gut geschriebene Software machen sollte.</p>
<p>Dummerweise bekommt man bei diesem vorbildlichen Vorgehen ein Problem, wenn man eine ATL COM Komponente erzeugt. Für diesen Projekttyp aktiviert Visual Studio die <a href="http://msdn.microsoft.com/de-de/library/024awkd1.aspx">Linker Option &#8220;Ausgabe registrieren&#8221;</a>.<br />
Damit wird nach erfolgreichem Linken der Komponente regsvr32 /s aufgerufen, um die frisch erstellte Library zu registrieren. Dieser Aufruf scheitert bei Verwendung eines Kontos mit eingeschränkten Rechten da die Registrierung von COM-Komponenten Administrator-Rechte erfordert:</p>
<p><code><br />
Project : error PRJ0050: Fehler beim Registrieren der Ausgabe. Vergewissern Sie sich, dass Sie über die entsprechenden Berechtigungen zum Ändern der Registrierung verfügen.<br />
</code></p>
<p>Für solche Fälle ist die Verwendung des Kommandos <a href="http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/runas.mspx?mfr=true">runas</a> eine naheliegende Option aber leider hat man auf die von Visual Studio erzeugte Programmzeile für den Aufruf von regsvr32 keinen Einfluss, diese ist nämlich Teil der <a href="http://msdn.microsoft.com/de-de/library/microsoft.visualstudio.vcprojectengine.vclinkertool.registeroutput.aspx">Visual Studio Programmierschnittstelle</a> und damit nicht direkt zugänglich.</p>
<p>Eine einfache Lösung besteht darin, die oben genannte Linker-Option &#8220;Ausgabe registrieren&#8221; zu deaktivieren und ein eigenes &#8220;Postbuildereigenis&#8221; für das Projekt zu definieren. Dieses könnte z.B. so aussehen:</p>
<p><code><br />
runas /user:administrator /savecred "regsvr32 /s $(TargetPath)"<br />
</code></p>
<p>Damit das funktioniert muss man einmal den Befehl in einem Kommandofenster eingeben und dann nach der Aufforderung das Administrator-Password eingeben. Bei jedem weiteren Aufruf mit /savecred wird dann das zuletzt verwendete Passwort automatisch verwendet. Damit ist vermieden, dass das Administrator-Password im Klartext in einer Visual Studio Projektdatei steht, was eine erhebliche Sicherheitslücke darstellen würde.</p>
<p>Falls man das gemerkte Passwort später wieder löschen möchte: Systemsteuerung/Benutzerkonten/Eigene Netzwerkkennwörter verwalten.</p>
<p>Viele Grüße,<br />
Andreas</p>
<p>Technorati Tags: <a href="http://technorati.com/tag/Visual+Studio" rel="tag">Visual Studio</a>, <a href="http://technorati.com/tag/COM" rel="tag"> COM</a>, <a href="http://technorati.com/tag/ATL" rel="tag"> ATL</a>, <a href="http://technorati.com/tag/Registry" rel="tag">Registry</a>, <a href="http://technorati.com/tag/Eingeschr%C3%A4nkter+Benutzer" rel="tag">Eingeschränkter Benutzer</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.awenius.de/blog/2009/07/20/entwicklung-von-c-com-komponenten-mit-visual-studio-als-eingeschrankter-benutzer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bitte aktivieren Sie JavaScript&#8230;wofür eigentlich?</title>
		<link>http://www.awenius.de/blog/2009/06/23/bitte-aktivieren-sie-javascriptwofur-eigentlich/</link>
		<comments>http://www.awenius.de/blog/2009/06/23/bitte-aktivieren-sie-javascriptwofur-eigentlich/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 19:31:21 +0000</pubDate>
		<dc:creator>Andreas</dc:creator>
				<category><![CDATA[Softwareentwicklung]]></category>
		<category><![CDATA[Sonstiges]]></category>

		<guid isPermaLink="false">http://www.awenius.de/blog/?p=62</guid>
		<description><![CDATA[Hallo,
nachdem mich das Finanzamt an die Abgabe der Steuererklärung erinnert hat, habe ich mein Wiso Sparbuch 2009 gestartet und natürlich die schöne Suche nach Aktualisierungen gestartet.
Nach kurzer Zeit erscheint die Meldung:
Sie haben JavaScript deaktiviert. Damit sind wichtige Funktionen dieses  Programms nicht verfügbar.
Weitere Informationen zu JavaScript und wie Sie  JavaScript aktivieren finden Sie hier.
Bitte [...]]]></description>
			<content:encoded><![CDATA[<p>Hallo,</p>
<p>nachdem mich das Finanzamt an die Abgabe der Steuererklärung erinnert hat, habe ich mein Wiso Sparbuch 2009 gestartet und natürlich die schöne Suche nach Aktualisierungen gestartet.<br />
Nach kurzer Zeit erscheint die Meldung:</p>
<blockquote><p>Sie haben JavaScript deaktiviert. Damit sind wichtige Funktionen dieses  Programms nicht verfügbar.<br />
Weitere Informationen zu JavaScript und wie Sie  JavaScript aktivieren finden Sie hier.</p>
<p>Bitte aktivieren Sie JavaScript  und starten das Programm dann erneut.</p></blockquote>
<p>Was soll denn bitte diese Meldung? Ich habe eine FAT Client Anwendung zur Abgabe meiner Steuererklärung gestartet. Wo und wie soll ich denn nun JavaScript aktivieren?<br />
(Wer nun denkt, in obiger Meldung wäre &#8220;hier&#8221; ein Link, den muss ich enttäuschen)</p>
<p>Hallo Ihr Buhl-Programmierer! Schon mal daran gedacht, dass Ihre Software vielleicht von Personen eingesetzt wird, die mit einer solchen Meldung nicht zurechtkommen? Oder von Personen, die keine Lust haben ihren PC in einen <a href="http://de.wikipedia.org/wiki/Bot">Bot</a> voller <a href="http://de.wikipedia.org/wiki/Malware">Malware</a> zu transformieren?</p>
<p>Um dem Ganzen noch die Krone aufzusetzen, startet beim Klick auf den Link &#8220;Support&#8221; in obigem Dialog der Internet Explorer, obwohl ich den Firefox als Standardbrowser konfiguriert habe. Und die Suche in der Hilfe geht nicht ohne&#8230;JavaScript.</p>
<p>Aber als Entwickler einer Software zur Abgabe von optional verschlüsselten Steuererklärungen hat man mit Themen wie Vertraulichkeit und Sicherheit natürlich überhaupt nichts zu tun.</p>
<p>Unnötig zu erwähnen, dass bis zur letztjährigen Ausgabe der Update-Mechanismus von Wiso-Sparbuch auch ohne JavaScript funktioniert hat.</p>
<p>Ach und noch etwas, Windows 7 kommt in Europa <a href="http://www.golem.de/0906/67720.html">ohne Browser</a> auf den Markt&#8230;</p>
<p>Viele Grüße,<br />
Andreas</p>
<p>Technorati Tags: <a href="http://technorati.com/tag/JavaScript" rel="tag">JavaScript</a>, <a href="http://technorati.com/tag/sichere+Software" rel="tag"> sichere Software</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.awenius.de/blog/2009/06/23/bitte-aktivieren-sie-javascriptwofur-eigentlich/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prüfen auf Schreibrechte für eine Datei in C#</title>
		<link>http://www.awenius.de/blog/2009/02/28/prufen-auf-schreibrechte-fur-eine-datei-in-c/</link>
		<comments>http://www.awenius.de/blog/2009/02/28/prufen-auf-schreibrechte-fur-eine-datei-in-c/#comments</comments>
		<pubDate>Sat, 28 Feb 2009 10:15:35 +0000</pubDate>
		<dc:creator>Andreas</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Softwareentwicklung]]></category>

		<guid isPermaLink="false">http://www.awenius.de/blog/?p=61</guid>
		<description><![CDATA[Hallo,
manchmal möchte man wissen, ob ein bestimmter Benutzer bestimmte Rechte (z.B. Schreibrechte) für eine bestimmte Datei besitzt. Wie sich herausstellt, ist diese Anforderung alles andere als leicht umzusetzen, weil dabei viele verschiedene Aspekte eine Rolle spielen. Die Vorgehensweise sieht prinzipiell so aus:

Abfragen der Access Control Listen für die Datei
Itererieren über alle Einträge und prüfen ob [...]]]></description>
			<content:encoded><![CDATA[<p>Hallo,</p>
<p>manchmal möchte man wissen, ob ein bestimmter Benutzer bestimmte Rechte (z.B. Schreibrechte) für eine bestimmte Datei besitzt. Wie sich <a href="http://discuss.joelonsoftware.com/default.asp?dotnet.12.589499.7">herausstellt</a>, ist diese Anforderung alles andere als leicht umzusetzen, weil dabei viele verschiedene Aspekte eine Rolle spielen. Die Vorgehensweise sieht prinzipiell so aus:</p>
<ul>
<li>Abfragen der Access Control Listen für die Datei</li>
<li>Itererieren über alle Einträge und prüfen ob man für die Kennung oder die Gruppe des gewünschten Benutzers Einträge findet</li>
<li>Dabei die Präzedenz der Einträge beachten (explizite kommen vor vererbten Regeln, &#8220;Deny&#8221;-Regeln kommen for &#8220;Allow&#8221;-Regeln)</li>
</ul>
<p>Den nicht unerheblichen Code hat dankenswerterweise <a href="http://purinvesting.com/principal_hatt.htm">Bruce Hatt</a> in einem <a href="http://www.codeproject.com/KB/files/UserFileAccessRights.aspx">Artikel auf CodeProject.com</a> veröffentlicht.</p>
<p>Man sollte bedenken, dass die Möglichkeit in eine Datei zu schreiben zusätzlich durch das &#8220;ReadOnly-flag&#8221; und die .NET Code Access Security eingeschränkt sein könnte. Beides wird in dieser Klasse nicht berücksichtigt.</p>
<p>Die Prüfung auf das ReadOnly-flag könnte man so schreiben:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp">FileAttributes attrs <span style="color: #008000;">=</span> File.<span style="color: #0000FF;">GetAttributes</span><span style="color: #000000;">&#40;</span>fileName<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>attrs <span style="color: #008000;">&amp;</span>amp<span style="color: #008000;">;</span> FileAttributes.<span style="color: #0600FF;">ReadOnly</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">!=</span> <span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">readOnly</span> <span style="color: #008000;">=</span> true<span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Und für die Prüfung im Rahmen der CAS könnte man folgenden Code verwenden:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp">FileIOPermission fp <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> FileIOPermission<span style="color: #000000;">&#40;</span>FileIOPermissionAccess.<span style="color: #0000FF;">Write</span>, fileName<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">try</span>
<span style="color: #000000;">&#123;</span>
    fp.<span style="color: #0000FF;">Demand</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0600FF;">catch</span> <span style="color: #000000;">&#40;</span>SecurityException<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">readOnly</span> <span style="color: #008000;">=</span> true<span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Wenn es nur um die Prüfung auf Schreibrechte geht, hört man oft den Vorschlag, einfach den Schreibvorgang auszuführen und ggf. die geworfene Exception zu fangen. Dieser Vorschlag ist aber nicht immer geeignet. In meinem Fall war es so, dass ich an einer Anwendung arbeite, in der Dateien editiert werden können. Falls Dateien nicht geschrieben werden können, soll dies visualisiert werden. Man möchte aber vermeiden, dazu bei jedem Start der Anwendung die zu editierenden Texte zu speichern, da damit der Timestamp verändert wäre, obwohl der Benutzer die Datei gar nicht geändert hat und auch nicht speichern wollte.</p>
<p>Viele Grüße,<br />
Andreas</p>
<p>Technorati Tags: <a href="http://technorati.com/tag/.NET+Security" rel="tag">.NET Security</a>, <a href="http://technorati.com/tag/File+Permissions" rel="tag"> File Permissions</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.awenius.de/blog/2009/02/28/prufen-auf-schreibrechte-fur-eine-datei-in-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Destruktor nicht gerufen in mixed mode C++ Anwendungen mit Visual C++ 2008</title>
		<link>http://www.awenius.de/blog/2009/02/09/destruktor-nicht-gerufen-in-mixed-mode-c-anwendungen-mit-visual-c-2008/</link>
		<comments>http://www.awenius.de/blog/2009/02/09/destruktor-nicht-gerufen-in-mixed-mode-c-anwendungen-mit-visual-c-2008/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 07:08:31 +0000</pubDate>
		<dc:creator>Andreas</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Softwareentwicklung]]></category>

		<guid isPermaLink="false">http://www.awenius.de/blog/?p=56</guid>
		<description><![CDATA[Hallo,
in C++ gibt es ja das Resource Aquisition Is Initialization (RAII) pattern. Der Kern dieses Patterns besteht darin, dass ein Objekt bereits bei der Konstruktion die Ownership für eine Resource übernimmt und diese Resource bei seiner Zerstörung wieder frei gibt. Man wendet dieses pattern an, um Resourcen wie allokierten Speicher oder file handles sicher freizugeben. [...]]]></description>
			<content:encoded><![CDATA[<p>Hallo,</p>
<p>in C++ gibt es ja das <a href="http://en.wikipedia.org/wiki/RAII">Resource Aquisition Is Initialization</a> (RAII) pattern. Der Kern dieses Patterns besteht darin, dass ein Objekt bereits bei der Konstruktion die Ownership für eine Resource übernimmt und diese Resource bei seiner Zerstörung wieder frei gibt. Man wendet dieses pattern an, um Resourcen wie allokierten Speicher oder file handles sicher freizugeben. Dabei mancht man sich zu nutze, dass in C++ der Destruktor eines Objektes deterministisch aufgerufen wird, z. B. auch im Falle eine exception.</p>
<p>Dieses pattern ist sehr wichtig, um zuverlässige und robuste Software in C++ zu schreiben und ich nutze es regelmäßig. Nun hatte ich vor einiger Zeit in einem der Unittests in der Software, die ich für mein Unternehmen <a href="http://www.empowertec.de/">EmPowerTec</a> schreibe, einen seltsamen Fehler in einem Unittest. Nach einer längeren Debugging-Session sah es so aus, als würden die Destruktoren für Objekte die in einer Methode auf dem Stack angelegt waren, beim Verlassen der Methode nicht mehr gerufen. Ein solches Verhalten führt mit Sicherheit zu Fehlern, wenn das RAII Pattern genutzt wird. Zunächst war ich darüber verblüfft, da ich mir nicht vorstellen konnte, dass ein derartig fundamentales Verhalten vom Microsoft C++ Compiler nicht richtig implementiert war. Tatsächlich war das aber der Fall, wie in folgendem Knowledge Base Eintrag beschrieben:</p>
<p><a href="http://social.msdn.microsoft.com/forums/en-US/vclanguage/thread/8324a598-ad05-40e1-a271-6f64ce3b6008">http://social.msdn.microsoft.com/forums/en-US/vclanguage/thread/8324a598-ad05-40e1-a271-6f64ce3b6008</a></p>
<p>Wie man dem Thread entnehmen kann, tritt das Problem auf, wenn man von einer C++/CLI Library eine native C++ library aufruft und diese mit inkompatiblen Einstellungen für das Exception handling übersetzt hat.</p>
<p><em>Und die Moral von der Geschicht,<br />
Trau&#8217; keinem Compiler nicht,</em></p>
<p><em>Unittests sollst Du machen,<br />
Sonst hast Du nichts zu lachen</em></p>
<p>Viele Grüße,<br />
Andreas</p>
<p>Technorati Tags: <a href="http://technorati.com/tag/Microsoft+Visual+C%2B%2B" rel="tag">Microsoft Visual C++</a>, <a href="http://technorati.com/tag/RAII" rel="tag">RAII</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.awenius.de/blog/2009/02/09/destruktor-nicht-gerufen-in-mixed-mode-c-anwendungen-mit-visual-c-2008/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>.NET Assembly-Ladevorgang loggen</title>
		<link>http://www.awenius.de/blog/2009/01/26/net-assembly-ladevorgang-loggen/</link>
		<comments>http://www.awenius.de/blog/2009/01/26/net-assembly-ladevorgang-loggen/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 20:41:05 +0000</pubDate>
		<dc:creator>Andreas</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://www.awenius.de/blog/?p=59</guid>
		<description><![CDATA[Hallo,
kürzlich hatte ich folgende Situation:
In einer C#-Solution wurde eine in Managed C++ erstellte .NET Assembly referenziert. Sobald die C#-Anwendung eine Klasse aus der referenzierten Library benutzen wollte, gab es eine Exception der Form:

System.IO.FileNotFoundException: Die Datei oder Assembly "etocl, Version=1.0.3306.20332, Culture=de, PublicKeyToken=null" oder eine Abhängigkeit davon wurde nicht gefunden. Das System kann die angegebene Datei nicht [...]]]></description>
			<content:encoded><![CDATA[<p>Hallo,</p>
<p>kürzlich hatte ich folgende Situation:</p>
<p>In einer C#-Solution wurde eine in Managed C++ erstellte .NET Assembly referenziert. Sobald die C#-Anwendung eine Klasse aus der referenzierten Library benutzen wollte, gab es eine Exception der Form:</p>
<p><code><br />
System.IO.FileNotFoundException: Die Datei oder Assembly "etocl, Version=1.0.3306.20332, Culture=de, PublicKeyToken=null" oder eine Abhängigkeit davon wurde nicht gefunden. Das System kann die angegebene Datei nicht finden.<br />
Dateiname: "etocl, Version=1.0.3306.20332, Culture=de, PublicKeyToken=null"<br />
</code></p>
<p>Die referenzierte Assembly fand sich aber wie es sein sollte im Arbeitsverzeichnis des C#-Programms. Um ein Protokoll des Ladevorgangs zu bekommen kann man nun folgenden Registry-Eintrag anlegen:</p>
<p><code><br />
[HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) = 1<br />
</code></p>
<p>Danach enthält die Fehlermeldung eine Aufstellung der Pfade, die der Loader durchsucht hat:</p>
<p><code><br />
LOG: Download von neuem URL file:///K:/Develop/et/etroot/src/apps/etoclide/bin/Debug/de/etocl.DLL.<br />
LOG: Download von neuem URL file:///K:/Develop/et/etroot/src/apps/etoclide/bin/Debug/de/etocl/etocl.DLL.<br />
LOG: Download von neuem URL file:///K:/Develop/et/etroot/src/apps/etoclide/bin/Debug/de/etocl.EXE.<br />
LOG: Download von neuem URL file:///K:/Develop/et/etroot/src/apps/etoclide/bin/Debug/de/etocl/etocl.EXE.<br />
</code></p>
<p>und das Problem wird schnell sichtbar: der loader sucht im Unterverzeichnis &#8220;de&#8221;. Mit diesem Hinweis ausgerüstet sieht man schnell, dass das AssemblyInfo.cpp-file der referenzierten Library einen expliziten Eintrag für das locale enthielt:</p>
<p><code><br />
[assembly:AssemblyCultureAttribute("de")]<br />
</code></p>
<p>Nach Entfernung dieses Eintrags und erneuter Erstellung der library  funktionierte dann auch alles wieder.</p>
<p>Fairerweise muss ich sagen, dass bereits die ursprüngliche Meldung einen Hinweis auf das Problem enthielt, allerdings nicht so deutlich:</p>
<p><code><br />
System.IO.FileNotFoundException: Die Datei oder Assembly "etocl, Version=1.0.3306.20332, Culture=<strong>de</strong>, PublicKeyToken=null" oder eine Abhängigkeit davon wurde nicht gefunden. Das System kann die angegebene Datei nicht finden.<br />
Dateiname: "etocl, Version=1.0.3306.20332, <strong>Culture=de</strong>, PublicKeyToken=null"<br />
</code></p>
<p>Microsoft empfiehlt, den Registry-Eintrag wieder zu löschen da er zu einer Performance-Einbusse führen könnte.</p>
<p>Viele Grüße,<br />
Andreas</p>
<p>Technorati Tags: <a href="http://technorati.com/tag/.NET" rel="tag">.NET</a>, <a href="http://technorati.com/tag/Assembly+loading" rel="tag">Assembly loading</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.awenius.de/blog/2009/01/26/net-assembly-ladevorgang-loggen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bessere UML Shapes für Visio</title>
		<link>http://www.awenius.de/blog/2009/01/18/bessere-uml-shapes-fur-visio/</link>
		<comments>http://www.awenius.de/blog/2009/01/18/bessere-uml-shapes-fur-visio/#comments</comments>
		<pubDate>Sun, 18 Jan 2009 10:34:29 +0000</pubDate>
		<dc:creator>Andreas</dc:creator>
				<category><![CDATA[Modellierung]]></category>

		<guid isPermaLink="false">http://www.awenius.de/blog/?p=58</guid>
		<description><![CDATA[Hallo,
wer Microsoft Visio für die Erstellung von UML-Diagrammen nutzt kann sich mal diese Shapes auf softwarestencils.com anschauen. Sie sind angeblich besser als die mit Visio mitgelieferten Shapes.
Viele Grüße,
Andreas
Technorati Tags: Visio, UML
]]></description>
			<content:encoded><![CDATA[<p>Hallo,</p>
<p>wer <a href="http://de.wikipedia.org/wiki/Visio">Microsoft Visio</a> für die Erstellung von UML-Diagrammen nutzt kann sich mal <a href="http://softwarestencils.com/uml/index.html">diese Shapes</a> auf <a href="http://softwarestencils.com/index.html">softwarestencils.com</a> anschauen. Sie sind <a href="http://stackoverflow.com/questions/330098/which-are-the-most-useful-resources-to-learn-to-draw-the-uml-class-diagram-in-vis">angeblich</a> besser als die mit Visio mitgelieferten Shapes.</p>
<p>Viele Grüße,<br />
Andreas</p>
<p>Technorati Tags: <a href="http://technorati.com/tag/Visio" rel="tag">Visio</a>, <a href="http://technorati.com/tag/UML" rel="tag">UML</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.awenius.de/blog/2009/01/18/bessere-uml-shapes-fur-visio/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gemeine Entwickler&#8230;</title>
		<link>http://www.awenius.de/blog/2008/11/23/gemeine-entwickler/</link>
		<comments>http://www.awenius.de/blog/2008/11/23/gemeine-entwickler/#comments</comments>
		<pubDate>Sun, 23 Nov 2008 20:45:07 +0000</pubDate>
		<dc:creator>Andreas</dc:creator>
				<category><![CDATA[Sonstiges]]></category>

		<guid isPermaLink="false">http://www.awenius.de/blog/?p=57</guid>
		<description><![CDATA[gibt es wohl auf entwicklerGemein.de.
Liebe Leute, man muss nicht jede Mode mitmachen.
(Über die Qualität dieser site will ich hier ausdrücklich keine Aussage machen).
Viele Grüße,
Andreas
]]></description>
			<content:encoded><![CDATA[<p>gibt es wohl auf <a href="http://www.entwicklergemein.de/">entwicklerGemein.de</a>.</p>
<p>Liebe Leute, man muss nicht jede Mode mitmachen.<br />
(Über die Qualität dieser site will ich hier ausdrücklich keine Aussage machen).</p>
<p>Viele Grüße,<br />
Andreas</p>
]]></content:encoded>
			<wfw:commentRss>http://www.awenius.de/blog/2008/11/23/gemeine-entwickler/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
