<?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>&#62;devblog_</title>
	<atom:link href="http://devblog.itsth.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://devblog.itsth.com</link>
	<description>Thoughts on developing shareware</description>
	<lastBuildDate>Fri, 04 May 2012 14:19:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>EnumResourceNames + RT_STRING</title>
		<link>http://devblog.itsth.com/2012/05/04/enumresourcenames-rt_string/</link>
		<comments>http://devblog.itsth.com/2012/05/04/enumresourcenames-rt_string/#comments</comments>
		<pubDate>Fri, 04 May 2012 14:19:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[EnumResourceNames]]></category>
		<category><![CDATA[resources]]></category>
		<category><![CDATA[RT_STRING]]></category>

		<guid isPermaLink="false">http://devblog.itsth.com/?p=187</guid>
		<description><![CDATA[It sounds pretty straightforward to enumerate the resources  in a file. But it turned out to be rather a lot of work (and waste of time), since the MS doesn&#8217;t tell you, that it doesn&#8217;t enumerate the strings, but blocks of strings in a binary format that you have to process yourself. Here&#8217;s how to [...]]]></description>
			<content:encoded><![CDATA[<p>It sounds pretty straightforward to enumerate the resources  in a file. But it turned out to be rather a lot of work (and waste of time), since the MS doesn&#8217;t tell you, that it doesn&#8217;t enumerate the strings, but blocks of strings in a binary format that you have to process yourself.</p>
<p>Here&#8217;s how to do it:</p>
<pre>BOOL CALLBACK EnumResNameProc(HMODULE hModule, LPCTSTR lpszType, LPTSTR lpszName, LONG_PTR lParam)
{
 switch ((int)lpszType)
 {
 case RT_STRING:
 {
 HRSRC hRes = FindResourceEx(hModule, RT_STRING, MAKEINTRESOURCE(lpszName), MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL));

 if (hRes)
 {
 HGLOBAL hGlo = LoadResource(hModule, hRes);
 LPCWSTR lpStr = (LPCWSTR)LockResource(hGlo);
 DWORD dwsize = SizeofResource(hModule, hRes);

 long count=0;
 for (int i=0; i &lt; (int)dwsize; i++)
 {
 count++;
 if (count&gt;=16)
 break;

 if (lpStr[i])
 {
 WORD *pString = lpStr+i+1;
 long lString = lpStr[i];

 //Process string here

 i += lpStr[i];
 }
 }
 }
 }
 break;
 }

 return(TRUE);
}

EnumResourceNames(hModule, RT_STRING, &amp;EnumResNameProc, NULL);</pre>
]]></content:encoded>
			<wfw:commentRss>http://devblog.itsth.com/2012/05/04/enumresourcenames-rt_string/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google accusing Apple of &#8220;Unacceptable Business Practices&#8221;?</title>
		<link>http://devblog.itsth.com/2012/04/01/google-accusing-apple-of-unacceptable-business-practices/</link>
		<comments>http://devblog.itsth.com/2012/04/01/google-accusing-apple-of-unacceptable-business-practices/#comments</comments>
		<pubDate>Sun, 01 Apr 2012 16:48:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[business]]></category>
		<category><![CDATA[apple google itunes]]></category>

		<guid isPermaLink="false">http://devblog.itsth.com/?p=181</guid>
		<description><![CDATA[It sounds like an April Fools&#8217; Day prank. But I didn&#8217;t make this one up. Promise. I just entered &#8220;iTunes&#8221; as search keyword for Google AdWords. I wasn&#8217;t surprised that Google didn&#8217;t allow it. But it reason was a jaw-dropper: These entries could not be added due to the following reasons: Unacceptable Business Practices (Detail) We&#8217;ve [...]]]></description>
			<content:encoded><![CDATA[<p>It sounds like an April Fools&#8217; Day prank. But I didn&#8217;t make this one up. Promise.</p>
<p>I just entered &#8220;iTunes&#8221; as search keyword for Google AdWords. I wasn&#8217;t surprised that Google didn&#8217;t allow it. But it reason was a jaw-dropper:</p>
<address>These entries could not be added due to the following reasons:<br />
Unacceptable Business Practices (Detail)<br />
We&#8217;ve detected that your keyword list may contain words related to unacceptable business practices. Google policy does not permit the advertisement of websites that contain unacceptable business practices.<br />
Recommended actions: Please delete or edit these keywords. </address>
<p>So is Google accusing Apple of  &#8221;Unacceptable Business Practices&#8221;? Sounds like it. I know that they didn&#8217;t really like each other since Google started Android, but this is pretty heavy stuff.</p>
<p>Screenshot:<br />
<a href="http://www.easy2sync.de/img/blog/iTunesAdWords.png"><img class="alignnone" title="Unacceptable Business Practices" src="http://www.easy2sync.de/img/blog/iTunesAdWords.png" alt="" width="510" height="385" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://devblog.itsth.com/2012/04/01/google-accusing-apple-of-unacceptable-business-practices/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The three types of insane customers&#8230;.</title>
		<link>http://devblog.itsth.com/2011/12/14/the-three-types-of-insane-customers/</link>
		<comments>http://devblog.itsth.com/2011/12/14/the-three-types-of-insane-customers/#comments</comments>
		<pubDate>Wed, 14 Dec 2011 16:29:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[humor]]></category>

		<guid isPermaLink="false">http://devblog.itsth.com/?p=175</guid>
		<description><![CDATA[1. The reason guesser His goldfish died while the customer was installing your software. So it must be your fault. That&#8217;s why he sends you a three-page e-mail. 2. The ignorer  You wrote that the customer should do 1. &#8230; 2. &#8230; 3. &#8230; to solve the problem. The customer writes back that he did [...]]]></description>
			<content:encoded><![CDATA[<p><strong>1. The reason guesser</strong></p>
<p>His goldfish died while the customer was installing your software. So it must be your fault. That&#8217;s why he sends you a three-page e-mail.</p>
<p><strong>2. The ignorer </strong></p>
<p>You wrote that the customer should do 1. &#8230; 2. &#8230; 3. &#8230; to solve the problem. The customer writes back that he did something completely different, that it still doesn&#8217;t work and that your support sucks.</p>
<p><strong>3. The insister</strong></p>
<p>Tells you that you&#8217;re all wrong, ignores everything that you wrote and insists that you&#8217;d better send him a solution RIGHT NOW.</p>
<p>And probably there are many more types&#8230; <img src='http://devblog.itsth.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://devblog.itsth.com/2011/12/14/the-three-types-of-insane-customers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The secret back-to-edit hotkey</title>
		<link>http://devblog.itsth.com/2011/06/02/the-secret-back-to-edit-hotkey/</link>
		<comments>http://devblog.itsth.com/2011/06/02/the-secret-back-to-edit-hotkey/#comments</comments>
		<pubDate>Thu, 02 Jun 2011 08:55:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[back-to-edit]]></category>
		<category><![CDATA[editing]]></category>
		<category><![CDATA[hotkey]]></category>
		<category><![CDATA[redo]]></category>
		<category><![CDATA[undo]]></category>

		<guid isPermaLink="false">http://devblog.itsth.com/?p=170</guid>
		<description><![CDATA[Just a tiny trick today. When you&#8217;re programming, you&#8217;re often&#8230; typing something Then you browse through the same file, look for something copy something And now you want to get back  to the place that you previously edited. There&#8217;s a secret hotkey (actually a sequence) for that which works in most editors: Ctrl+Z, Ctrl+Y. Works [...]]]></description>
			<content:encoded><![CDATA[<p>Just a tiny trick today.</p>
<p>When you&#8217;re programming, you&#8217;re often&#8230;</p>
<ul>
<li>typing something</li>
<li>Then you browse through the same file, look for something</li>
<li>copy something</li>
<li>And now you want to get back  to the place that you previously edited.</li>
</ul>
<p>There&#8217;s a secret hotkey (actually a sequence) for that which works in most editors: Ctrl+Z, Ctrl+Y.</p>
<p>Works in Visual Studio, Word, text editors, etc.</p>
]]></content:encoded>
			<wfw:commentRss>http://devblog.itsth.com/2011/06/02/the-secret-back-to-edit-hotkey/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A bit of advertising: ZeroClickSpellchecker</title>
		<link>http://devblog.itsth.com/2011/04/05/a-bit-of-advertising-zeroclickspellchecker/</link>
		<comments>http://devblog.itsth.com/2011/04/05/a-bit-of-advertising-zeroclickspellchecker/#comments</comments>
		<pubDate>Tue, 05 Apr 2011 11:48:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[business]]></category>

		<guid isPermaLink="false">http://devblog.itsth.com/?p=164</guid>
		<description><![CDATA[I recently published a new software: ZeroClickSpellchecker. It&#8217;s basically a spell-checker which doesn&#8217;t mark errors, but auto-corrects them. At least those that can be corrected safely. (It won&#8217;t try to correct kljfhsdakljh, for example.) But quite a lot errors can be corrected, so the program works pretty well. It effectively that speeds up your typing, [...]]]></description>
			<content:encoded><![CDATA[<p>I recently published a new software: ZeroClickSpellchecker. It&#8217;s basically a spell-checker which doesn&#8217;t mark errors, but auto-corrects them. At least those that can be corrected safely. (It won&#8217;t try to correct kljfhsdakljh, for example.) But quite a lot errors can be corrected, so the program works pretty well. It effectively that speeds up your typing, because you don&#8217;t have to stop and correct any more.</p>
<p>It&#8217;s great tool when writing e-mails. Basically I wrote it because I was fed up with typing &#8220;copmuter&#8221; again and again. If you find this (or other typos) in your own e-mails, check out my <a href="http://www.easy2sync.com/en/produkte/ZeroClickSpellchecker.php">auto-correction</a> software.</p>
]]></content:encoded>
			<wfw:commentRss>http://devblog.itsth.com/2011/04/05/a-bit-of-advertising-zeroclickspellchecker/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Useful function: EnableWindowsDependingOn</title>
		<link>http://devblog.itsth.com/2011/03/21/useful-function-enablewindowsdependingon/</link>
		<comments>http://devblog.itsth.com/2011/03/21/useful-function-enablewindowsdependingon/#comments</comments>
		<pubDate>Mon, 21 Mar 2011 14:48:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://devblog.itsth.com/?p=161</guid>
		<description><![CDATA[One of my favorite internal functions. It helps my manage my app&#8217;s GUI. Checkboxes that cause their sub-elements to be greyed out when not checked can be easily handled by this: bool EnableWindowsDependingOn (CWnd *pParent, DWORD DependingOnThisCheckbox, DWORD Value1, ...) { va_list marker; bool bState = (((CButton*)pParent-&#62;GetDlgItem(DependingOnThisCheckbox))-&#62;GetCheck()!=0); DWORD i=Value1; va_start (marker, Value1); while (i != [...]]]></description>
			<content:encoded><![CDATA[<p>One of my favorite internal functions. It helps my manage my app&#8217;s GUI. Checkboxes that cause their sub-elements to be greyed out when not checked can be easily handled by this:</p>
<pre>bool EnableWindowsDependingOn (CWnd *pParent, DWORD DependingOnThisCheckbox, DWORD Value1, ...)
{
 va_list marker;

 bool bState = (((CButton*)pParent-&gt;GetDlgItem(DependingOnThisCheckbox))-&gt;GetCheck()!=0);

 DWORD i=Value1;
 va_start (marker, Value1);
 while (i != 0)
 {
 if (i&lt;=0xffff)
 {
 if (pParent-&gt;GetDlgItem(i))
 pParent-&gt;GetDlgItem(i)-&gt;EnableWindow (bState);
 }
 else
 ((CWnd*)i)-&gt;EnableWindow (bState);

 i = va_arg (marker, long);
 }
 va_end (marker);

 return (bState);
}
</pre>
<p>It excepts the this pointer of your CDialog and the id of the master checkbox. Then you can append any number of sub-element ids or pointers. And finally a NULL. Example:<br />
EnableWindowsDependingOn (this, IDC_CHECK1, IDC_EDIT1, IDC_EDIT2, NULL);</p>
<p>This would enable the two edit boxes if the checkbox is enabled.</p>
]]></content:encoded>
			<wfw:commentRss>http://devblog.itsth.com/2011/03/21/useful-function-enablewindowsdependingon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Win+Tab in Debugging</title>
		<link>http://devblog.itsth.com/2010/12/31/wintab-in-debugging/</link>
		<comments>http://devblog.itsth.com/2010/12/31/wintab-in-debugging/#comments</comments>
		<pubDate>Fri, 31 Dec 2010 10:21:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[debuggung]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Windows 7]]></category>

		<guid isPermaLink="false">http://devblog.itsth.com/?p=155</guid>
		<description><![CDATA[Placing a breakpoint can be dangerous. In some code sections, like drawing a menu, Windows doesn&#8217;t like to be interrupted. The debugger will stop your application, but your app will remain on-screen and Alt+Tab and all other options of changing the current application are blocked. Except, if you&#8217;re using Windows 7. For some reason the [...]]]></description>
			<content:encoded><![CDATA[<p>Placing a breakpoint can be dangerous. In some code sections, like drawing a menu, Windows doesn&#8217;t like to be interrupted. The debugger will stop your application, but your app will remain on-screen and Alt+Tab and all other options of changing the current application are blocked.</p>
<p>Except, if you&#8217;re using Windows 7.</p>
<p>For some reason the 3d-flipping mode with Win+Tab still works. And allows you to switch to the debugger.</p>
]]></content:encoded>
			<wfw:commentRss>http://devblog.itsth.com/2010/12/31/wintab-in-debugging/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Devloping asp.NET websites in 3 simple steps&#8230;</title>
		<link>http://devblog.itsth.com/2010/12/07/devloping-asp-net-websites-in-3-simple-steps/</link>
		<comments>http://devblog.itsth.com/2010/12/07/devloping-asp-net-websites-in-3-simple-steps/#comments</comments>
		<pubDate>Tue, 07 Dec 2010 12:44:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[microsoft]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[rant]]></category>

		<guid isPermaLink="false">http://devblog.itsth.com/?p=150</guid>
		<description><![CDATA[Step 1: Waste hours researching to find out how to do something trivial. (Like renaming the insert link) Step 2: Curse Microsoft Step 3: Throw out the MS way and program it yourself. Repeat for every trivial issue.]]></description>
			<content:encoded><![CDATA[<p>Step 1: Waste hours researching to find out how to do something trivial. (Like renaming the insert link)</p>
<p>Step 2: Curse Microsoft</p>
<p>Step 3: Throw out the MS way and program it yourself.</p>
<p>Repeat for every trivial issue.</p>
]]></content:encoded>
			<wfw:commentRss>http://devblog.itsth.com/2010/12/07/devloping-asp-net-websites-in-3-simple-steps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>There IS life on the other side&#8230;</title>
		<link>http://devblog.itsth.com/2010/11/24/there-is-life-on-the-other-side/</link>
		<comments>http://devblog.itsth.com/2010/11/24/there-is-life-on-the-other-side/#comments</comments>
		<pubDate>Wed, 24 Nov 2010 14:53:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[business]]></category>
		<category><![CDATA[AISIP]]></category>
		<category><![CDATA[reg.net]]></category>

		<guid isPermaLink="false">http://devblog.itsth.com/?p=145</guid>
		<description><![CDATA[&#8230;of the order form. I always suspected it, but it&#8217;s interesting to be on the other side for a change. I&#8217;m talking about being a customer for a  change. I tried to check out AISIP&#8217;s member forums and one has to pay for that. Okay, I tried. I filled in the reg.net order form, hit [...]]]></description>
			<content:encoded><![CDATA[<p>&#8230;of the order form. I always suspected it, but it&#8217;s interesting to be on the other side for a change.</p>
<p>I&#8217;m talking about being a customer for a  change. I tried to check out AISIP&#8217;s member forums and one has to pay for that. Okay, I tried. I filled in the reg.net order form, hit the submit button only to see the same form again. I double-checked my data, I looked for marks that I forget something. Nothing. Same form again. I triple-checked my data, tried another browser, another computer. Even my iPhone. Nothing worked. I contacted AISIP (three times). No reply. I contacted reg.net and got a standard mail. My reply to that mail was left unanswered.</p>
<p>So I want to pay, but I can&#8217;t. It&#8217;s frustrating.</p>
<p>Hope you&#8217;re treating your customers better than that. I know that I do, but I wonder if I should test *my* payment processor&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://devblog.itsth.com/2010/11/24/there-is-life-on-the-other-side/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visual Studio 2005: Speeding up compiles</title>
		<link>http://devblog.itsth.com/2010/10/19/visual-studio-2005-speeding-up-compiles/</link>
		<comments>http://devblog.itsth.com/2010/10/19/visual-studio-2005-speeding-up-compiles/#comments</comments>
		<pubDate>Tue, 19 Oct 2010 21:49:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://devblog.itsth.com/?p=139</guid>
		<description><![CDATA[There&#8217;s a hidden switch in Visual Studio 2005 while doubles compile speed. I know, it sounds ridiculous.  But I&#8217;ve tested it. It&#8217;s MUCH faster now. The switch works by enabling multi-core processing. I have no idea why Microsoft has hidden this, instead of making it a big, obvious feature. Anyways. You can enable it by [...]]]></description>
			<content:encoded><![CDATA[<p>There&#8217;s a hidden switch in Visual Studio 2005 while doubles compile speed.</p>
<p>I know, it sounds ridiculous.  But I&#8217;ve tested it. It&#8217;s MUCH faster now. The switch works by enabling multi-core processing. I have no idea why Microsoft has hidden this, instead of making it a big, obvious feature.</p>
<p>Anyways. You can enable it by adding /MP to the &#8220;Additional options&#8221; in &#8220;Configuration properties &gt; C/C++ &gt; Commandline&#8221;.</p>
<p>(Found it at <a href="http://lahsiv.net/blog/?p=40">1</a> and <a href="http://blog.280z28.org/archives/2007/10/17/">2</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://devblog.itsth.com/2010/10/19/visual-studio-2005-speeding-up-compiles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

