<?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>Crazy White Rabbit &#187; Programmation .NET</title>
	<atom:link href="http://webhunter.free.fr/CWRab/index.php/category/programmation-net/feed/" rel="self" type="application/rss+xml" />
	<link>http://webhunter.free.fr/CWRab</link>
	<description>Solutions système et trucs de développement, C# et autres langages ...</description>
	<lastBuildDate>Wed, 08 Sep 2010 15:19:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.1</generator>
		<item>
		<title>C# &#8212; Un bout de code : pour enregistrer un fichier</title>
		<link>http://webhunter.free.fr/CWRab/index.php/c-un-bout-de-code-pour-enregistrer-un-fichier/</link>
		<comments>http://webhunter.free.fr/CWRab/index.php/c-un-bout-de-code-pour-enregistrer-un-fichier/#comments</comments>
		<pubDate>Wed, 08 Sep 2010 14:44:00 +0000</pubDate>
		<dc:creator>kaplan</dc:creator>
				<category><![CDATA[Programmation .NET]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[sample]]></category>

		<guid isPermaLink="false">http://webhunter.free.fr/CWRab/index.php/c-un-bout-de-code-pour-enregistrer-un-fichier/</guid>
		<description><![CDATA[Enregistrer un fichier, c'est simple avec .NET encore faut-il se souvenir des mots clefs essentiels ...]]></description>
			<content:encoded><![CDATA[<p><strong>C</strong>ode pour mon usage propre, pour ne pas réinventer la roue :</p>
<p><strong>Contexte</strong> :</p>
<p>- <strong>D</strong>emander à l’opérateur de donner le nom du fichier avec le lequel on va créer un PDF à partir d’un fichier HTML</p>
<p>- <strong>V</strong>érifier si ce fichier existe, si oui le supprimer     <br />&#160;&#160; (contrôler le bon déroulement avec “try/catch” + messageBox adéquat )</p>
<p>- <strong>E</strong>ffectuer le travail correspondant à la fonction si status correct après suppression</p>
<p> <object class="window" data="http://webhunter.free.fr/CWRab/wp-content/uploads/2010/09/sfd.html" type="text/html" height="300" width="700"> </object></p>
]]></content:encoded>
			<wfw:commentRss>http://webhunter.free.fr/CWRab/index.php/c-un-bout-de-code-pour-enregistrer-un-fichier/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>.Net : Réaliser un programme Mono Instance</title>
		<link>http://webhunter.free.fr/CWRab/index.php/net-realiser-un-programme-mono-instance/</link>
		<comments>http://webhunter.free.fr/CWRab/index.php/net-realiser-un-programme-mono-instance/#comments</comments>
		<pubDate>Wed, 24 Mar 2010 13:03:02 +0000</pubDate>
		<dc:creator>kaplan</dc:creator>
				<category><![CDATA[Programmation .NET]]></category>

		<guid isPermaLink="false">http://webhunter.free.fr/CWRab/?p=105</guid>
		<description><![CDATA[Comment s'assurer qu'un programme ne sera pas lancé plus d'une fois sur une même machine ...]]></description>
			<content:encoded><![CDATA[<p><strong>I</strong>l est quelquefois nécessaire de s’assurer que le programme que l’on développe ne pourra être lancé qu’une seule fois sur une même machine.&#160; Par exemple si l’on veut ne pas accéder plusieurs fois à un ensemble de données et de ce fait en casser l’intégrité logique.</p>
<p>Il y a en gros deux méthodes pour réaliser cette fonction :</p>
<p>1- Lancer un Mutex au démarrage en s’assurant qu’il n’existe pas déjà, … s’il existe déjà, c’est qu’une autre instance du même programme est déjà présente, et on ressort aussitôt en indiquant à l’opérateur qu’il y a une autre fenêtre ouverte quelque part … Si l’on souhaite faire apparaitre cette fenêtre automatiquement, il faudra préférer la solution suivante</p>
<p>2- Chercher le nom du process qui vient de se lancer, et vérifier qu’il n’en existe pas d’autre. Si effectivement il y en a déjà un, avec le Handle de la forme principale, on le rappelle au premier niveau d’affichage.</p>
<p><strong>C’est cette deuxième méthode qui est décrite ci dessous :</strong></p>
<p><object height="300" width="700" class="window" data="http://webhunter.free.fr/CWRab/wp-content/uploads/2010/03/html/oneshot.html" type="text/html"> </object></p>
<p><em><strong>C</strong>e qu&#8217;il y a à noter dans ce code :</em></p>
<p>Le code concerné se place dans le code de démarrage, module appelé &#8220;program.cs&#8221; par défaut</p>
<p>- L&#8217;utilisation de <b>&#8220;ShowWindow&#8221;</b> qui appartient à la bibliothèque &#8220;user32.dll, d&#8217;ou présence de <b>&#8220;Using System.Runtime.InteropServices&#8221;</b></p>
<p>- L&#8217;utilisation de <b>&#8220;Process&#8221;</b>, d&#8217;ou présence de <b>&#8220;Using System.Diagnostics&#8221;</b></p>
]]></content:encoded>
			<wfw:commentRss>http://webhunter.free.fr/CWRab/index.php/net-realiser-un-programme-mono-instance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>.NET : utilisation de l&#8217;EVT webBrowser1_DocumentCompleted</title>
		<link>http://webhunter.free.fr/CWRab/index.php/net-utilisation-de-levt-webbrowser1_documentcompleted/</link>
		<comments>http://webhunter.free.fr/CWRab/index.php/net-utilisation-de-levt-webbrowser1_documentcompleted/#comments</comments>
		<pubDate>Wed, 07 Oct 2009 12:44:40 +0000</pubDate>
		<dc:creator>kaplan</dc:creator>
				<category><![CDATA[Programmation .NET]]></category>

		<guid isPermaLink="false">http://webhunter.free.fr/CWRab/?p=88</guid>
		<description><![CDATA[<strong>P</strong>rogrammation .NET C#. Utilisation de l'évènement DocumentCompleted  de l'objet WebBrowser]]></description>
			<content:encoded><![CDATA[<p><strong>A</strong>yant eu à réaliser des outils d’automatisation du WEB, j’ai de nombreuses fois utilisé le composant <b>.NET « webBrowser »</b>. Cet objet est assez facile à utiliser et facilite grandement l’accès au web pour des outils Winform.<br />L’un de mes soucis majeurs avec ce composant restait néanmoins l’évènement  «<b>DocumentCompleted</b>»  que l’on utilise pour connaitre la fin de chargement de la page appelée via : «<b> webBrowser.Navigate(url)</b> »</p>
<p><strong>E</strong>n effet cet évènement m’a toujours semblé avoir un comportement peu fiable, puisque que dans la majorité des cas, pour une demande ‘<b>Navigate</b>’, on reçoit un nombre variable de ‘<b>DocumentCompleted</b>’ ce qui ne facilite pas la programmation de la suite du programme. En effet, si on utilise cet évènement pour effectuer une analyse automatique du contenu de la page demandée et que celle-ci est incomplètement chargée, ça se termine généralement assez mal. Une recherche Web sur le sujet, m’a juste convaincu que le sujet était connu, mais je n’ai jusqu’à présent pas trouvé de réponse convaincante. Mes pansements divers sur le sujet étaient jusqu’à présent peu reluisants et surtout à base de tempos diverses, ce qui est en fait, un cache misère! A l’occasion d’une nouvelle commande je me suis repenché sur le sujet, bien décidé à trancher dans le vif.</p>
<div class="encadrecentre">
<p> &#8211; Etude des différents évènements et attributs qui pourraient résoudre mon problème<br /> &#8211; Trace sur chaque évènement et utilisation de debugView de Mark Russinovich</p>
</div>
<p><strong>J</strong>’ai réétudié l’ EVT «<b> Navigated</b> » qui apparait très peu de temps après la demande «<b>webBrowser.Navigate(url)</b>». C’est avec cet évènement que l’on découvre qu’une seule demande <b>Navigate</b> peut générer plusieurs «<b> Navigated</b> ».<br />
Les traces avec un exemple d’automatisation du site de ‘laposte.net’ donnent ceci  :</p>
<h3>1 – Pour une demande très simple (appeler la page d’accueil de laposte.net)</h3>
<p class="snippet"><samp>0.00[4380] Navigate url : &#8216;http://www.laposte.net<br />
5.20[4380] Webbrowser completed : http://www.laposte.net<br />
</samp></p>
<p><strong>O</strong>n voit là qu’il n’y a aucun problème, <b>1 Navigate</b>, <b>1 DocCompleted</b><br />
Les choses se corsent quand après avoir rempli les champs, et envoyé la commande <b>submit</b> on constate le résultat :</p>
<h3>2 – Suite du SUBMIT :</h3>
<p class="snippet"><samp>5.37[4380] Activate : &#8216;FORM&#8217; , &#8216;name=userlogin&#8217; , &#8216;submit&#8217;<br />
7.84[4380] Webbrowser completed : <a href="http://webmail.laposte.net/webmail/fr_FR/advertisement_bottom_iframe.html">http://webmail.laposte.net/webmail/fr_FR/advertis_bottom_iframe.html</a><br />
8.04[4380] Webbrowser completed : <a href="http://www.kelkoo.fr/content/fr/partners/laposte/laposte_s_homme.htm">http://www.kelkoo.fr/content/fr/partners/laposte/laposte_s_homme.htm</a><br />
8.47[4380] Webbrowser completed : <a href="http://view.atdmt.com/AMF/iview/115038936/direct;wi.468;hi.60/01?click">http://view.atdmt.com/AMF/iview/115038936/direct;wi.468;hi.60/01?click</a>=<br />
8.47[4380] Webbrowser completed : <a href="http://webmail.laposte.net/webmail/fr_FR/advertisement_top_iframe.html">http://webmail.laposte.net/webmail/fr_FR/advertisement_top_iframe.html</a><br />
8.48[4380] Webbrowser completed : <a href="http://webmail.laposte.net/webmail/fr_FR/inbox.html?KEY=A+183+18000+183A">http://webmail.laposte.net/webmail/fr_FR/inbox.html?KEY=A+183+18000+183A</a><br />
</samp></p>
<p><strong>M</strong>aintenant on voit que pour 1 action “<b>click</b>”, on récupère 5 évènements “<b>webBrowser.DocumentCompleted</b>”. Donc dans ce cas, si on déclenche l’analyse de la page dès le premier <b>DocumentCompleted</b>, on a bien des chances de rater son coup !</p>
<h3>3- Utilisons l’évènement «  Navigated »  :</h3>
<p><strong>L</strong>e cas précédent nous montrera maintenant les traces suivantes :</p>
<p class="snippet"><samp>5.37[4380] Activate : &#8216;FORM&#8217; , &#8216;name=userlogin&#8217; , &#8216;submit&#8217;<br />
6.79[4380] Webbrowser Navigated : <a href="http://webmail.laposte.net/webmail/fr_FR/inbox.html?KEY=A+183+18000+183A">http://webmail.laposte.net/webmail/fr_FR/inbox.html?KEY=A+183+18000+183A</a><br />
7.09[4380] Webbrowser Navigated : <a href="http://webmail.laposte.net/webmail/fr_FR/advertisement_top_iframe.html">http://webmail.laposte.net/webmail/fr_FR/advertisement_top_iframe.html</a><br />
7.23[4380] Webbrowser Navigated : <a href="http://webmail.laposte.net/webmail/fr_FR/advertisement_bottom_iframe.html">http://webmail.laposte.net/webmail/fr_FR/advertisement_bottom_iframe.html</a><br />
7.36[4380] Webbrowser Navigated : <a href="http://www.kelkoo.fr/content/fr/partners/laposte/laposte_s_homme.htm">http://www.kelkoo.fr/content/fr/partners/laposte/laposte_s_homme.htm</a><br />
7.68[4380] Webbrowser Navigated : <a href="http://view.atdmt.com/AMF/iview/115038936/direct;wi.468;hi.60/01?click">http://view.atdmt.com/AMF/iview/115038936/direct;wi.468;hi.60/01?click</a>=<br />
7.84[4380] Webbrowser completed : <a href="http://webmail.laposte.net/webmail/fr_FR/advertisement_bottom_iframe.html">http://webmail.laposte.net/webmail/fr_FR/advertisement_bottom_iframe.html</a><br />
8.04[4380] Webbrowser completed : <a href="http://www.kelkoo.fr/content/fr/partners/laposte/laposte_s_homme.htm">http://www.kelkoo.fr/content/fr/partners/laposte/laposte_s_homme.htm</a><br />
8.47[4380] Webbrowser completed : <a href="http://view.atdmt.com/AMF/iview/115038936/direct;wi.468;hi.60/01?click">http://view.atdmt.com/AMF/iview/115038936/direct;wi.468;hi.60/01?click</a>=<br />
8.47[4380] Webbrowser completed : <a href="http://webmail.laposte.net/webmail/fr_FR/advertisement_top_iframe.html">http://webmail.laposte.net/webmail/fr_FR/advertisement_top_iframe.html</a><br />
8.48[4380] Webbrowser completed : <a href="http://webmail.laposte.net/webmail/fr_FR/inbox.htmlKEY=A+183+18000+183A">http://webmail.laposte.net/webmail/fr_FR/inbox.htmlKEY=A+183+18000+183A</a></samp></p>
<p><strong>C</strong>ette fois, on a toujours nos 5 évènements “<b>DocCompleted</b>” pour une action ‘<b>click</b>’, mais on voit que l’on a eu également 5 « <b>navigated</b>». Ce qui vient donc à l’esprit immédiatement, utilisons un compteur, mis à 0 lors du click, incrémenté par chaque«<b>Navigated</b>» et décrémenté par chaque « <b>DocCompleted</b>». Quand il passe à Zéro, j’obtiens mon vrai évènement «<b>Fin de navigation</b>» qui me permettra de faire tranquillement l’autopsie de ma page en étant sûr que c’est le bon cadavre !<br />Donc l’histoire se termine ici, tout est bien qui finit bien …</p>
<p><strong>E</strong>h bien non, car ce scénario idyllique ne marche qu’à 80% du temps, voyez donc ce qui se passe quand je tente d’interroger par programme cette autre URL :</p>
<p class="snippet"><samp>00.00[] Navigate url : &#8216;http://oami..eu//Request/en_SearchBasic&#8217;<br />
03.84[] Webbrowser Navigated : http://oami..eu//Request/en_SearchBasic, Count = 1<br />
12.22[] Webbrowser completed : http://oami..eu//Request/en_SearchBasic, Count = 0<br />
12.32[] Activate : &#8216;INPUT&#8217; , &#8216;name=search&#8217; , &#8216;click&#8217;<br />
14.24[] Webbrowser Navigated : http://oami..eu//Request/en_Result_NoReg, Count = 1<br />
14.70[] Webbrowser Navigated : http://oami..eu//Request/en_UnsuccessfulSearch_NoReg, Count = 2<br />
19.01[] Webbrowser completed : http://oami..eu//Request/en_UnsuccessfulSearch_NoReg, Count = 1<br />
</samp></p>
<p><strong>D</strong>ans ce cas, dans la trace, j’ai ajouté la valeur du compteur qui me sert à compter les <b>Navigated</b>, pour décompter les <b>DocCompleted</b>, et là on voit qu’après l’action ‘<b>click</b>’ il ya eu 2 ‘<b>Navigated</b>’ et 1 seul ‘<b>DocCompleted</b>’, mon scénario de rêve tourne au cauchemar.</p>
<p><strong>E</strong>xplorons d’autres outils :<br />Le WebBrowser possède un attribut booléen «<b>IsBusy</b> » que j’avais déjà tenté d’utiliser, mais qui devenait <b>false</b> bien avant le «<b> docCompleted</b>».<br />Il existe également un attribut «<b>ReadyState</b>», la conjonction de ces éléments donne ceci dans les traces :</p>
<p class="snippet">
<samp>00.00[6892] Navigate url : &#8216;http://oami..eu//Request/en_SearchBasic&#8217;<br />
03.84[6892] Webbrowser Navigated : http://oami..eu//Request/en_SearchBasic, Busy: True, ReadyState: Loading<br />
12.22[6892] Webbrowser completed : http://oami..eu//Request/en_SearchBasic, Busy: False, ReadyState: Complete<br />
12.32[6892] Activate : &#8216;INPUT&#8217; , &#8216;name=search&#8217; , &#8216;click&#8217;<br />
14.24[6892] Webbrowser Navigated : http://oami..eu//Request/en_Result_NoReg, Busy: True, ReadyState: Complete<br />
14.70[6892] Webbrowser Navigated : http://oami..eu//Request/en_UnsuccessfulSearch_NoReg, Busy: True, ReadyState: Loading<br />
19.01[6892] Webbrowser completed : http://oami..eu//Request/en_UnsuccessfulSearch_NoReg, Busy: False, ReadyState: Complete<br />
</samp></p>
<p><strong>D</strong>ans cet exemple, les traces nous montrent à chaque passage dans ‘<b>Navigated</b>’, puis ‘<b>DocCompleted</b>’ l’état de ‘<b>IsBusy</b>’ et de ‘<b>ReadyState</b>’. A priori, quand on a la conjonction suivante :</p>
<p class="snippet"><samp>- IsBusy == false <br />- ReadyState == Complete</samp></p>
<p><strong>L</strong>a page demandée est complète et prête à être autopsiée. Ce qui pourrait donner les lignes suivantes dans <b>webBrowser_DocumentCompleted</b> :</p>
<p><object type="text/html" data="http://webhunter.free.fr/CWRab/wp-content/uploads/2009/09/html/doccompleted.htm" class="window" height="200" width="700"> alt : <a href="http://webhunter.free.fr/CWRab/wp-content/uploads/2009/09/html/doccompleted.htm">http://webhunter.free.fr/CWRab/wp-content/uploads/2009/09/html/doccompleted.htm</a></object></p>
]]></content:encoded>
			<wfw:commentRss>http://webhunter.free.fr/CWRab/index.php/net-utilisation-de-levt-webbrowser1_documentcompleted/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
