<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-790082722115179561</id><updated>2011-12-02T20:50:25.751-08:00</updated><category term='game programming on Windows Mobile'/><category term='HTC mobile'/><category term='WM_KEYUP'/><category term='window procedure'/><category term='key messages'/><category term='Windows Mobile'/><category term='HTC'/><category term='WM 5.0'/><category term='flipping'/><category term='Qtek'/><category term='WM_ACTIVATE'/><category term='DDSCL_NORMAL'/><category term='keyboard'/><category term='key handling'/><category term='DDSCL_FULLSCREEN'/><category term='focus change'/><category term='DDSCAPS_VIDEOMEMORY'/><category term='DirectX'/><category term='DDBLT_KEYSRC'/><category term='DDSCAPS_BACKBUFFER'/><title type='text'>Mobile development</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://stenlikmobile.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/790082722115179561/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://stenlikmobile.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>stenlik</name><uri>http://www.blogger.com/profile/17897204962662479785</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>5</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-790082722115179561.post-3759816752942146123</id><published>2009-04-25T00:24:00.000-07:00</published><updated>2009-04-25T00:35:25.505-07:00</updated><title type='text'>Embedding Python in Windows Mobile C++</title><content type='html'>&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;   &lt;/w:Compatibility&gt;   &lt;w:browserlevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" latentstylecount="156"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt; &lt;!--  /* Font Definitions */  @font-face  {font-family:Wingdings;  panose-1:5 0 0 0 0 0 0 0 0 0;  mso-font-charset:2;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:0 268435456 0 0 -2147483648 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal  {mso-style-parent:"";  margin:0cm;  margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:11.0pt;  font-family:Arial;  mso-fareast-font-family:"Times New Roman";  mso-bidi-font-family:"Times New Roman";} @page Section1  {size:612.0pt 792.0pt;  margin:72.0pt 90.0pt 72.0pt 90.0pt;  mso-header-margin:36.0pt;  mso-footer-margin:36.0pt;  mso-paper-source:0;} div.Section1  {page:Section1;}  /* List Definitions */  @list l0  {mso-list-id:595485405;  mso-list-type:hybrid;  mso-list-template-ids:434954052 1546573756 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l0:level1  {mso-level-tab-stop:36.0pt;  mso-level-number-position:left;  text-indent:-18.0pt;} @list l1  {mso-list-id:603420754;  mso-list-type:hybrid;  mso-list-template-ids:-1259809974 1546573756 931326384 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l1:level1  {mso-level-tab-stop:36.0pt;  mso-level-number-position:left;  text-indent:-18.0pt;} @list l1:level2  {mso-level-start-at:4;  mso-level-number-format:bullet;  mso-level-text:-;  mso-level-tab-stop:72.0pt;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Arial;  mso-fareast-font-family:"Times New Roman";} @list l2  {mso-list-id:812795166;  mso-list-type:hybrid;  mso-list-template-ids:-1549358244 1546573756 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l2:level1  {mso-level-tab-stop:36.0pt;  mso-level-number-position:left;  text-indent:-18.0pt;} @list l3  {mso-list-id:2137873265;  mso-list-type:hybrid;  mso-list-template-ids:-1960153808 1546573756 67698693 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l3:level1  {mso-level-tab-stop:36.0pt;  mso-level-number-position:left;  text-indent:-18.0pt;} @list l3:level2  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:72.0pt;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Wingdings;} ol  {margin-bottom:0cm;} ul  {margin-bottom:0cm;} --&gt; &lt;/style&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable  {mso-style-name:"Table Normal";  mso-tstyle-rowband-size:0;  mso-tstyle-colband-size:0;  mso-style-noshow:yes;  mso-style-parent:"";  mso-padding-alt:0cm 5.4pt 0cm 5.4pt;  mso-para-margin:0cm;  mso-para-margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:10.0pt;  font-family:"Times New Roman";  mso-ansi-language:#0400;  mso-fareast-language:#0400;  mso-bidi-language:#0400;} &lt;/style&gt; &lt;![endif]--&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;Build&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;b style=""&gt;&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;&lt;span style=""&gt;1.&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Download and unpack Python sources &lt;span style=";font-family:&amp;quot;;" &gt;PythonCE-2.5-20061219-source.zip&lt;/span&gt; from www.sourceforge.net&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;    &lt;p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;&lt;span style=""&gt;2.&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;On www.sourceforge.net in Tracker&gt;Patches section click on "PythonCE 2.5 for WM Smartphone" &lt;span style=""&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt;are information about the patch for WM5/WM6 OS version, which can be build with Vs2005&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;&lt;span style=""&gt;3.&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Download the patch file (&lt;span style=";font-family:&amp;quot;;" &gt;Python-2.5-20071004-patch.zip&lt;/span&gt;) from link http://sourceforge.net/project/showfiles.php?group_id=104228&amp;amp;package_id=247631&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;&lt;span style=""&gt;4.&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Unpack the patch and&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-family:Wingdings;"&gt;&lt;span style=""&gt;-&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;copy "PC" folder to original Python sources&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-family:Wingdings;"&gt;&lt;span style=""&gt;-&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;use GNU patch utility (http://gnuwin32.sourceforge.net/packages/patch.htm) to both .patch files&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-family:Wingdings;"&gt;&lt;span style=""&gt;-&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style=";font-family:&amp;quot;;" &gt;patch -p1 &lt;&lt; &lt;/span&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;   &lt;/w:Compatibility&gt;   &lt;w:browserlevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" latentstylecount="156"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt; &lt;!--  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal  {mso-style-parent:"";  margin:0cm;  margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:11.0pt;  font-family:Arial;  mso-fareast-font-family:"Times New Roman";  mso-bidi-font-family:"Times New Roman";} @page Section1  {size:612.0pt 792.0pt;  margin:72.0pt 90.0pt 72.0pt 90.0pt;  mso-header-margin:36.0pt;  mso-footer-margin:36.0pt;  mso-paper-source:0;} div.Section1  {page:Section1;} --&gt; &lt;/style&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable  {mso-style-name:"Table Normal";  mso-tstyle-rowband-size:0;  mso-tstyle-colband-size:0;  mso-style-noshow:yes;  mso-style-parent:"";  mso-padding-alt:0cm 5.4pt 0cm 5.4pt;  mso-para-margin:0cm;  mso-para-margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:10.0pt;  font-family:"Times New Roman";  mso-ansi-language:#0400;  mso-fareast-language:#0400;  mso-bidi-language:#0400;} &lt;/style&gt; &lt;![endif]--&gt;&lt;span style="font-size: 11pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;smartphone.patch&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-family:Wingdings;"&gt;&lt;span style=""&gt;-&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style=";font-family:&amp;quot;;" &gt;patch -p1 &lt;&lt; &lt;/span&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;   &lt;/w:Compatibility&gt;   &lt;w:browserlevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" latentstylecount="156"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt; &lt;!--  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal  {mso-style-parent:"";  margin:0cm;  margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:11.0pt;  font-family:Arial;  mso-fareast-font-family:"Times New Roman";  mso-bidi-font-family:"Times New Roman";} @page Section1  {size:612.0pt 792.0pt;  margin:72.0pt 90.0pt 72.0pt 90.0pt;  mso-header-margin:36.0pt;  mso-footer-margin:36.0pt;  mso-paper-source:0;} div.Section1  {page:Section1;} --&gt; &lt;/style&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable  {mso-style-name:"Table Normal";  mso-tstyle-rowband-size:0;  mso-tstyle-colband-size:0;  mso-style-noshow:yes;  mso-style-parent:"";  mso-padding-alt:0cm 5.4pt 0cm 5.4pt;  mso-para-margin:0cm;  mso-para-margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:10.0pt;  font-family:"Times New Roman";  mso-ansi-language:#0400;  mso-fareast-language:#0400;  mso-bidi-language:#0400;} &lt;/style&gt; &lt;![endif]--&gt;&lt;span style="font-size: 11pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;vs2005-compiler.patch&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;&lt;span style=""&gt;5.&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Go to directory ...\PCbuild\WinCE\ and start the build command "scons.bat"&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;&lt;span style=""&gt;6.&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;For debug builds use "scons.bat debug-all"&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;Use&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;b style=""&gt;&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;&lt;span style=""&gt;1.&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Copy &lt;span style=";font-family:&amp;quot;;" &gt;python25.dll&lt;/span&gt; to the mobile&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;&lt;span style=""&gt;2.&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Link against the &lt;span style=";font-family:&amp;quot;;" &gt;python25.lib&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;or for debug &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-indent: -36pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;&lt;span style=""&gt;1.&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Copy &lt;span style=";font-family:&amp;quot;;" &gt;python25_d.dll&lt;/span&gt; to the mobile&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-indent: -36pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;&lt;span style=""&gt;2.&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Link against the &lt;span style=";font-family:&amp;quot;;" &gt;python25_d.lib&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;Problem&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;b style=""&gt;&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;The only problem is the DLL size, which is over 2.5 megabytes, I have asked here what I can do with it:&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;https://sourceforge.net/forum/forum.php?thread_id=3241586&amp;amp;forum_id=358833&lt;span style=""&gt;  &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;Links&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;b style=""&gt;&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;http://sourceforge.net/projects/pythonce/&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/790082722115179561-3759816752942146123?l=stenlikmobile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stenlikmobile.blogspot.com/feeds/3759816752942146123/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://stenlikmobile.blogspot.com/2009/04/embedding-python-on-windows-mobile.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/790082722115179561/posts/default/3759816752942146123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/790082722115179561/posts/default/3759816752942146123'/><link rel='alternate' type='text/html' href='http://stenlikmobile.blogspot.com/2009/04/embedding-python-on-windows-mobile.html' title='Embedding Python in Windows Mobile C++'/><author><name>stenlik</name><uri>http://www.blogger.com/profile/17897204962662479785</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-790082722115179561.post-754222690329406170</id><published>2009-04-23T22:56:00.000-07:00</published><updated>2009-04-23T23:10:25.457-07:00</updated><title type='text'>Embedding Python into Symbian C++</title><content type='html'>&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;   &lt;/w:Compatibility&gt;   &lt;w:browserlevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" latentstylecount="156"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt; &lt;!--  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal  {mso-style-parent:"";  margin:0cm;  margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:11.0pt;  font-family:Arial;  mso-fareast-font-family:"Times New Roman";  mso-bidi-font-family:"Times New Roman";} a:link, span.MsoHyperlink  {color:blue;  text-decoration:underline;  text-underline:single;} a:visited, span.MsoHyperlinkFollowed  {color:purple;  text-decoration:underline;  text-underline:single;} p.Ccode, li.Ccode, div.Ccode  {mso-style-name:"C++ code";  margin:0cm;  margin-bottom:.0001pt;  text-align:justify;  text-indent:7.85pt;  mso-pagination:widow-orphan;  background:#E6E6E6;  border:none;  mso-border-alt:dotted windowtext .5pt;  padding:0cm;  mso-padding-alt:1.0pt 2.0pt 1.0pt 2.0pt;  font-size:7.0pt;  mso-bidi-font-size:11.0pt;  font-family:"Courier New";  mso-fareast-font-family:"Times New Roman";  mso-bidi-font-family:"Times New Roman";} @page Section1  {size:612.0pt 792.0pt;  margin:72.0pt 90.0pt 72.0pt 90.0pt;  mso-header-margin:36.0pt;  mso-footer-margin:36.0pt;  mso-paper-source:0;} div.Section1  {page:Section1;} --&gt; &lt;/style&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable  {mso-style-name:"Table Normal";  mso-tstyle-rowband-size:0;  mso-tstyle-colband-size:0;  mso-style-noshow:yes;  mso-style-parent:"";  mso-padding-alt:0cm 5.4pt 0cm 5.4pt;  mso-para-margin:0cm;  mso-para-margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:10.0pt;  font-family:"Times New Roman";  mso-ansi-language:#0400;  mso-fareast-language:#0400;  mso-bidi-language:#0400;} &lt;/style&gt; &lt;![endif]--&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;b style=""&gt;Introduction&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify; text-indent: 18pt;"&gt;Use of the Python scripting language is an excellent way how to extend the functionality of the C++ program. It is ideal especially for the game scripting or for complex configuration files. The Python itself can be downloaded from the &lt;u&gt;www.sourceforge.net&lt;/u&gt; pages. For the embedding on the S60 3&lt;sup&gt;rd&lt;/sup&gt; platform the sis file (&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;PythonForS60_1_4_5_3rdEd.sis)&lt;/span&gt; is necessary to be installed on the phone. In fact the only necessary component for the embedding is the Python interpreter DLL library &lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;python222.dll&lt;/span&gt; included within the installation sis file. If embedding the sis file into application sis, which invokes the Python from C++, is not the suitable way or capabilities of the DLL must be changed or there is simply some other reason to not use the installation directly, we have the possibility to download sources (&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;pys60-1.4.5_src.zip&lt;/span&gt;) and build the python interpreter DLL on our own. With the help of description in the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;readme.txt&lt;/span&gt; from the sources zip file it is quite easy. If the own build of the interpreter DLL will be part of the sis installation package you have to remember to change its UID and name to not clash with the original Python installation. &lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;b style=""&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;b style=""&gt;Portability&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify; text-indent: 18pt;"&gt;The advantage of the Python is also its availability on Windows Mobile platform, so if you are writing the portable C++ application it is currently the only choice (as far as I know) for the scripting language as other good languages like &lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;Lua&lt;/span&gt; or &lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;GameMonkey&lt;/span&gt; are not ported to both platforms.&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;b style=""&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;b style=""&gt;How to embed&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify; text-indent: 18pt;"&gt;For embedding scripts into C++ code there are two possibilities, either use directly the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;Python/C API&lt;/span&gt; or use the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;CSPyInterpreter&lt;/span&gt; Symbian wrapper class. While use of the wrapper class is easier to use, it does not allow handling input/output script (module) parameters, calling selected functions and getting back the result. &lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify; text-indent: 18pt;"&gt;To be able to use the Python in C++ code the SDK from the &lt;u&gt;www.sourceforge.net&lt;/u&gt; pages has to be downloaded and installed. For each S60 3&lt;sup&gt;rd&lt;/sup&gt; platform edition there is the separate package (e.g. &lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;PythonForS60_1_4_5_SDK_3rdEd.zip&lt;/span&gt;) – it contains include header files and the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;Python222.lib&lt;/span&gt; export library we need to link against.&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify; text-indent: 18pt;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify; text-indent: 18pt;"&gt;Using the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;CSPyInterpreter&lt;/span&gt; class is pretty simple, as shown in the code snippet below:&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify; text-indent: 18pt;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-align: justify; text-indent: 18pt;"&gt;&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;div style="border: 1pt dotted windowtext; padding: 1pt 4pt; background: rgb(230, 230, 230) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;...&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;RunPythonSimpleScriptL( _L("c:\\resource\\writeToFile.py") );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;...&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;void RunPythonSimpleScriptL( const TDesC&amp;amp; aScriptName )&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;// Create a&lt;span style=""&gt;  &lt;/span&gt;Python interpreter&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;CSPyInterpreter* it = CSPyInterpreter::NewInterpreterL();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;CleanupStack::PushL( it );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;// Convert the script name to char*&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;HBufC8* scriptName = CnvUtfConverter::ConvertFromUnicodeToUtf8L( aScriptName );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;CleanupStack::PushL( scriptName );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;char* scriptNameChar = (char*)scriptName-&gt;Des().PtrZ();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;// Run script&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;TInt err = it-&gt;RunScript( 1, &amp;amp;scriptNameChar );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;User::LeaveIfError( err );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;// Clean everything&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;CleanupStack::PopAndDestroy( scriptName );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;CleanupStack::PopAndDestroy( it );&lt;span style=""&gt;    &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;} &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/div&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;Python script &lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;writeToFile.py&lt;/span&gt;:&lt;/p&gt;  &lt;div style="border: 1pt dotted windowtext; padding: 1pt 4pt; background: rgb(230, 230, 230) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;file = open("c:\\test.txt", 'w')&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;file.write("This is the new content of test.txt :-)")&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;file.close()&lt;/span&gt;&lt;/p&gt;  &lt;/div&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify; text-indent: 17.85pt;"&gt;In a more complex example we need:&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;1. Convert data values from Symbian C++ to native C representation and then to Python representation&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;2. Perform a function call from a Python script using converted values&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;3. Convert data values from the Python back to the Symbian C++&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify; text-indent: 17.85pt;"&gt;Following code snippets do the stuff. First some initialization is done; the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;c:\scripts&lt;/span&gt; path is specified as a script repository. If the path is not specified &lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;.py&lt;/span&gt; scripts are expected to be saved in the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;c:\resource&lt;/span&gt; directory. Then all parameters are converted to the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;PyObject&lt;/span&gt; type and the script is loaded by calling the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;PyImport_Import()&lt;/span&gt; method. Later on the function object is retrieved from the script and is called. The result is converted from &lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;PyObject&lt;/span&gt; to &lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;char*&lt;/span&gt; and then to &lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;TPtrC8&lt;/span&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-align: justify; text-indent: 17.85pt;"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;div style="border: 1pt dotted windowtext; padding: 1pt 4pt; background: rgb(230, 230, 230) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;void RunPythonScript1L()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;{ &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;// Create a&lt;span style=""&gt;  &lt;/span&gt;Python interpreter&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;CSPyInterpreter* it = CSPyInterpreter::NewInterpreterL();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;CleanupStack::PushL( it );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;// Save state of any current Python interpreter, and acquire the&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;// interpreter lock&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;PyEval_RestoreThread( PYTHON_TLS-&gt;thread_state );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;// Set path for .py scripts&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;_LIT8(KPyExecPath, "c:\\scripts\0");&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;PySys_SetPath((char*)TPtrC8(KPyExecPath).Ptr());&lt;span style=""&gt;               &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;                 &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;// .py module name&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;char *module_name = "simpleScript";&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;// .py module function name&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;char *function_name = "returnString";&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;// Python API objects&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;PyObject *py_module_name, *py_module, *py_function, *py_result;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;// Module (script) name (Return a new string object with a copy of the string)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;py_module_name = PyString_FromString( module_name );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;// The function imports the module name, potentially using the given &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;// globals and locals to determine how to interpret the name in a package context&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;py_module = PyImport_Import( py_module_name );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;Py_DECREF( py_module_name );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;if ( py_module )&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;// Retrieve an attribute named from object (i.e. function from module)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;py_function = PyObject_GetAttrString( py_module, function_name );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;if ( py_function )&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;// Call a callable Python object&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;py_result = PyObject_CallObject( py_function, NULL );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;Py_DECREF( py_module );&lt;span style=""&gt;  &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;Py_DECREF( py_function ); &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;// Convert result from PyObject to char*&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;int result_len = -1;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;// .py function result&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;span style=""&gt;     &lt;/span&gt;char *result = NULL;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;result = PyString_AsString( py_result ) ;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;result_len = strlen( result ) ;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;// Make a Symbian descriptor pointer to the char * response&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;TPtrC8 sym_result( (TUint8*)result, result_len );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;if ( sym_result.Compare( _L8("Hello world") ) != 0 )&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;        &lt;/span&gt;// The result is other then expected&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;        &lt;/span&gt;Py_DECREF( py_result );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;        &lt;/span&gt;PyEval_SaveThread();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;        &lt;/span&gt;User::Leave( KErrGeneral );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;Py_DECREF( py_result );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;else&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;   &lt;/span&gt;&lt;span style=""&gt;   &lt;/span&gt;// Function not found in the module&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;Py_DECREF( py_module ); &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;PyEval_SaveThread();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;User::Leave( KErrNotFound ); &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;else&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;// Module not found&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;PyEval_SaveThread();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;User::Leave( KErrNotFound ); &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;PyEval_SaveThread();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;CleanupStack::PopAndDestroy( it );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/div&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;b style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;b style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;b style=""&gt;&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify; text-indent: 17.85pt;"&gt;The second example shows the situation, where the method to sum two number is called, so we need to pass to Python script two integer values we want to be added. This is done by &lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;PyTuple_XXX()&lt;/span&gt; methods, which construct kind of dynamic array into which we consequently insert &lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;PyObject&lt;/span&gt; arguments for the script function.&lt;/p&gt;&lt;p class="MsoNormal" style="text-align: justify; text-indent: 17.85pt;"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;b style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;div style="border: 1pt dotted windowtext; padding: 1pt 4pt; background: rgb(230, 230, 230) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;void RunPythonScript2L()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;{ &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;// Create a&lt;span style=""&gt;  &lt;/span&gt;Python interpreter&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;CSPyInterpreter* it = CSPyInterpreter::NewInterpreterL();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;CleanupStack::PushL( it );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;// Save state of any current Python interpreter, and acquire the&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;// interpreter lock&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;PyEval_RestoreThread( PYTHON_TLS-&gt;thread_state );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;// Set path for .py scripts&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;_LIT8(KPyExecPath, "c:\\scripts\0");&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;PySys_SetPath((char*)TPtrC8(KPyExecPath).Ptr());&lt;span style=""&gt;               &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;                 &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;// .py module name&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;char *module_name = "simpleScript";&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;// .py module function name&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;char *function_name = "sum";&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;//&lt;span style=""&gt;  &lt;/span&gt;.py function result&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;int result = -1;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;// Python API objects&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;PyObject *py_module_name, *py_module, *py_function, *py_result;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;// Python funtcion agum,ents&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;PyObject *py_arguments, *py_argument;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;// Module (script) name (Return a new string object with a copy of the string)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;py_module_name = PyString_FromString( module_name );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;// The function imports the module name, potentially using the given &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;// globals and locals to determine how to interpret the name in a package context&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;py_module = PyImport_Import( py_module_name );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;Py_DECREF( py_module_name );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;if ( py_module )&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;// Retrieve an attribute named from object (i.e. function from module)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;py_function = PyObject_GetAttrString( py_module, function_name );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;if ( py_function )&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;// Create fumction arguments object of size 2&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;py_arguments = PyTuple_New( 2 );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;// 1st argument &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;py_argument = PyInt_FromLong(5);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;PyTuple_SetItem(py_arguments, 0, py_argument);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;// 2nd argument &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;py_argument = PyInt_FromLong(3);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;PyTuple_SetItem(py_arguments, 1, py_argument);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;// Call a callable Python object&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;py_result = PyObject_CallObject( py_function, py_arguments );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;Py_DECREF( py_arguments ); &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;Py_DECREF( py_module );&lt;span style=""&gt;  &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;Py_DECREF( py_function ); &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;// Convert result from PyObject to char*&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;result = PyInt_AsLong( py_result ) ;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;if ( result != 8 )&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;        &lt;/span&gt;// The result is other then expected&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;        &lt;/span&gt;Py_DECREF( py_result );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;        &lt;/span&gt;PyEval_SaveThread();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;        &lt;/span&gt;User::Leave( KErrGeneral );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;Py_DECREF( py_result );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;else&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;// Function not found in the module&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;Py_DECREF( py_module ); &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;PyEval_SaveThread();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;      &lt;/span&gt;User::Leave( KErrNotFound ); &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;else&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;// Module not found&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;PyEval_SaveThread();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;User::Leave( KErrNotFound ); &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;PyEval_SaveThread();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;CleanupStack::PopAndDestroy( it );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/div&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;b style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;b style=""&gt;&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify; text-indent: 17.85pt;"&gt;The &lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;simpleScript.py&lt;/span&gt;:&lt;/p&gt;&lt;p class="MsoNormal" style="text-align: justify; text-indent: 17.85pt;"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;div style="border: 1pt dotted windowtext; padding: 1pt 4pt; background: rgb(230, 230, 230) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;# Returns the string simply&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;def returnString():&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;return "Hello world"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;# Returns sum of 2 given numbers&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;def sum(a,b):&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;c = a + b&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="Ccode"&gt;&lt;span style=""&gt;&lt;span style=""&gt;    &lt;/span&gt;return c&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/div&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;b style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;b style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;b style=""&gt;&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;b style=""&gt;Links&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;S60 Python home page:&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;a href="http://www.forum.nokia.com/Resources_and_Information/Tools/Runtimes/Python_for_S60/"&gt;http://www.forum.nokia.com/Resources_and_Information/Tools/Runtimes/Python_for_S60/&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Sourceforge:&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;a href="http://sourceforge.net/project/showfiles.php?group_id=154155&amp;amp;package_id=171153"&gt;http://sourceforge.net/project/showfiles.php?group_id=154155&amp;amp;package_id=171153&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Python/C API &lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;a href="http://docs.python.org/extending/embedding.html"&gt;http://docs.python.org/extending/embedding.html&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/790082722115179561-754222690329406170?l=stenlikmobile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stenlikmobile.blogspot.com/feeds/754222690329406170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://stenlikmobile.blogspot.com/2009/04/normal-0-false-false-false.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/790082722115179561/posts/default/754222690329406170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/790082722115179561/posts/default/754222690329406170'/><link rel='alternate' type='text/html' href='http://stenlikmobile.blogspot.com/2009/04/normal-0-false-false-false.html' title='Embedding Python into Symbian C++'/><author><name>stenlik</name><uri>http://www.blogger.com/profile/17897204962662479785</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-790082722115179561.post-788041583533482654</id><published>2009-02-23T23:19:00.000-08:00</published><updated>2009-02-23T23:40:23.422-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DDSCL_NORMAL'/><category scheme='http://www.blogger.com/atom/ns#' term='DDSCL_FULLSCREEN'/><category scheme='http://www.blogger.com/atom/ns#' term='focus change'/><category scheme='http://www.blogger.com/atom/ns#' term='DirectX'/><category scheme='http://www.blogger.com/atom/ns#' term='WM_ACTIVATE'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='game programming on Windows Mobile'/><title type='text'>Receiving/loosing the focus (WM_ACTIVATE) on Windows Mobile</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ZnuTSEwgsHU/SaOhGrDOOOI/AAAAAAAAAAM/NgLqWpPclMk/s1600-h/App.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 310px;" src="http://2.bp.blogspot.com/_ZnuTSEwgsHU/SaOhGrDOOOI/AAAAAAAAAAM/NgLqWpPclMk/s320/App.gif" alt="" id="BLOGGER_PHOTO_ID_5306261921980102882" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;When DirectX application is running in full screen (&lt;span style="font-family:courier new;"&gt;DDSCL_FULLSCREEN&lt;/span&gt;) it does not receive any focus changed events, namely &lt;span style="font-family:courier new;"&gt;WM_ACTIVATE&lt;/span&gt; message. &lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;br /&gt;As stated in &lt;/span&gt;&lt;a style="font-family: arial;" href="http://msdn.microsoft.com/en-us/library/ms847103.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms847103.aspx&lt;/a&gt;&lt;span style="font-family:arial;"&gt;:&lt;/span&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;&lt;br /&gt;"...The exclusive (full-screen) mode prevents other applications from allocating some surface types and from drawing to the primary display. The exclusive mode also prevents other windows on the system from coming to the foreground, so DirectDraw applications must watch for system events (such as incoming phone calls) so they can relinquish control back to the system when necessary..."&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;br /&gt;The possible solution for that is discussed here &lt;/span&gt;&lt;a style="font-family: arial;" href="http://social.msdn.microsoft.com/Forums/en-US/vssmartdevicesnative/thread/33bfb706-fd34-4f6a-9679-c6cec4b8fda1/"&gt;http://social.msdn.microsoft.com/Forums/en-US/vssmartdevicesnative/thread/33bfb706-fd34-4f6a-9679-c6cec4b8fda1/&lt;/a&gt;&lt;span style="font-family:arial;"&gt;:&lt;/span&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;&lt;br /&gt;"...My solution is not to use DDSCL_FULLSCREEN cooperative level. Use DDSCL_NORMAL..."&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;br /&gt;Another related link is &lt;/span&gt;&lt;a style="font-family: arial;" href="http://blogs.msdn.com/windowsmobile/archive/2007/08/13/have-you-migrated-to-directdraw-yet.aspx"&gt;http://blogs.msdn.com/windowsmobile/archive/2007/08/13/have-you-migrated-to-directdraw-yet.aspx&lt;/a&gt;&lt;span style="font-family:arial;"&gt;. Sludge said here:&lt;/span&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;&lt;br /&gt;"...When opening a full screen application, there is no way to receive focus change events. For example on the HTC Touch, screen elements aren't drawn correctly when a phone call comes in, or the volume buttons are used..."&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;br /&gt;I&lt;/span&gt;&lt;span style="font-family:arial;"&gt;t looks that couple of people has problems with not receiving the &lt;span style="font-family:courier new;"&gt;WM_ACTIVATE&lt;/span&gt; message. In order to receive &lt;span style="font-family:courier new;"&gt;WM_ACTIVATE&lt;/span&gt; message the DirectX cooperative level has to be set to &lt;span style="font-family:courier new;"&gt;DDSCL_NORMAL&lt;/span&gt;, not &lt;span style="font-family:courier new;"&gt;DDSCL_FULLSCREEN&lt;/span&gt;.&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;br /&gt;This looks fine, but it introduces another problem as written here &lt;a href="http://msdn.microsoft.com/en-us/library/ms893935.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms893935.aspx&lt;/a&gt;: &lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"…Processes in NORMAL mode can access primary surfaces but are restricted with regard to flipping, creating complex primaries, and setting display modes…"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;br /&gt;On older devices like HTC Wizard(Qtek 9100) where the &lt;/span&gt;&lt;span style="font-family:arial;"&gt;HW &lt;/span&gt;&lt;span style="font-family:arial;"&gt;flipping is not supported it is fine but on e.g. HTC Kaiser when using the NORMAL mode, the application crashes when the primary surface is initialized with the error &lt;span style="font-family:courier new;"&gt;DDERR_NOCOOPERATIVELEVELSET&lt;/span&gt;. This is because the HTC Kaiser supports HW flipping, which is detected, and I try to use it, but this is unfortunately not possible in the &lt;span style="font-family:courier new;"&gt;DDSCL_NORMAL&lt;/span&gt; mode. &lt;span style="font-weight: bold;"&gt;So I have to choose - either try to be phone friendly and handle the &lt;/span&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;WM_ACTIVATE&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; or be game friendly and use the HW flipping…&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;br /&gt;The application can loose focus from many reasons, e.g. receiving the call, message, Bluetooth transfer, alarm event, calendar notification, going to sleep mode. Even if I receive the &lt;span style="font-family:courier new;"&gt;WM_ACTIVATE&lt;/span&gt; message I need to follow the complex handling:&lt;/span&gt;  &lt;ul&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;I call &lt;span style="font-family: courier new;"&gt;ShowWindow()&lt;/span&gt; with &lt;span style="font-family:courier new;"&gt;SW_HIDE&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;The game loop is interrupted and application is chilled with the &lt;span style="font-family:courier new;"&gt;GetMessage() &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;After the situation is handled (e.g. call) and the user starts the application again, new process is created.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;I use the &lt;span style="font-family:courier new;"&gt;FindWindow()&lt;/span&gt; to detect such situation and when I found existing window I set it to foreground by calling &lt;span style="font-family:courier new;"&gt;SetForegroundWindow()&lt;/span&gt; and I exit the new instance&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt; &lt;span style="font-family:arial;"&gt;Is there some easier way how to handle it? I'm really pretty new, do I something badly? &lt;/span&gt;  &lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;br /&gt;Anyway if some Win CE platform developers want to see how to handle such situations in an elegant way - check the DSA (Direct Screen Access) approach used on Symbian platform &lt;a href="http://developer.symbian.com/main/downloads/papers/dsa/direct_screen_access.pdf"&gt;http://developer.symbian.com/main/downloads/papers/dsa/direct_screen_access.pdf&lt;/a&gt;&lt;/span&gt;  &lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;br /&gt;Every comment welcomed!!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/790082722115179561-788041583533482654?l=stenlikmobile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stenlikmobile.blogspot.com/feeds/788041583533482654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://stenlikmobile.blogspot.com/2009/02/receivingloosing-focus-wmactivate-on.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/790082722115179561/posts/default/788041583533482654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/790082722115179561/posts/default/788041583533482654'/><link rel='alternate' type='text/html' href='http://stenlikmobile.blogspot.com/2009/02/receivingloosing-focus-wmactivate-on.html' title='Receiving/loosing the focus (WM_ACTIVATE) on Windows Mobile'/><author><name>stenlik</name><uri>http://www.blogger.com/profile/17897204962662479785</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ZnuTSEwgsHU/SaOhGrDOOOI/AAAAAAAAAAM/NgLqWpPclMk/s72-c/App.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-790082722115179561.post-6797838611636935631</id><published>2009-02-20T06:43:00.000-08:00</published><updated>2009-02-20T06:54:07.169-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='keyboard'/><category scheme='http://www.blogger.com/atom/ns#' term='key messages'/><category scheme='http://www.blogger.com/atom/ns#' term='HTC mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='key handling'/><category scheme='http://www.blogger.com/atom/ns#' term='window procedure'/><category scheme='http://www.blogger.com/atom/ns#' term='HTC'/><category scheme='http://www.blogger.com/atom/ns#' term='WM_KEYUP'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='Qtek'/><title type='text'>Keypad messages handling on HTC</title><content type='html'>&lt;span style="color: rgb(0, 0, 0);font-family:arial;" &gt;I'm facing problems with keypad handling, which I observed on HTC devices (I do not have similar problems with HP iPAQ). The result was either the significant program slow down or in the worse the FPS falls to 0 (so the scene was not updated), depending on how fast I was pressing buttons. I have found that problem happens when user presses buttons quickly in sequence. Then the message processing loop becomes too busy and is never leaved, so the screen redrawing is stopped. Below is the simplified game loop. It consists of two parts, at first messages from the queue are picked and handled and then the scene is rendered. Because the &lt;span style="font-family:courier new;"&gt;PeekMessage()&lt;/span&gt; while loop is too busy with key messages handling, it is not leaved and consequently the &lt;span style="font-family:courier new;"&gt;Update()&lt;/span&gt; function is never called.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:arial;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;while ( isRunning )&lt;br /&gt;{  &lt;br /&gt;  ...&lt;br /&gt;  // 1a. Pick up message&lt;br /&gt;  while (PeekMessage(&amp;amp;msg, NULL, 0, 0, PM_REMOVE))&lt;br /&gt;  {&lt;br /&gt;    //1b. Handle message&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  // 2. Renders scene&lt;br /&gt;  Update();&lt;br /&gt;  ...&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:arial;" &gt;&lt;br /&gt;I do not understand, what is wrong with HTC devices, that they handle key press related message so slowly, that it blocks the game loop. I thought this is a common issue, so I tried to search Internet, but the only reference I found was there &lt;a href="http://blogs.msdn.com/windowsmobile/archive/2007/08/13/have-you-migrated-to-directdraw-yet.aspx.%20Guy%20named%20Fred%20Di%20Sano%20wrote"&gt;http://blogs.msdn.com/windowsmobile/archive/2007/08/13/have-you-migrated-to-directdraw-yet.aspx. Guy named Fred Di Sano wrote&lt;/a&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0); font-style: italic;font-family:arial;" &gt;"…Getting input via the message pump is kind of clunky and in some cases (like on various HTC devices) it slows down the app!", but I do not find any other reference..."&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:arial;" &gt;&lt;br /&gt;&lt;br /&gt;I did not found any solution except defining the maximal number of messages that can be processed in the loop iteration:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;// Max. messages that are processed in one step&lt;br /&gt;const int KMaxMessagesProcessedInOneStep = 3;&lt;br /&gt;&lt;br /&gt;while ( isRunning )&lt;br /&gt;{&lt;br /&gt; ...&lt;br /&gt; // Messages processed&lt;br /&gt; int messagesProcessed = 0;&lt;br /&gt; // 1a. Pick up message&lt;br /&gt; while (PeekMessage(&amp;amp;msg, NULL, 0, 0, PM_REMOVE)) &lt;br /&gt; {&lt;br /&gt;   //1b. Handle message&lt;br /&gt;&lt;br /&gt;   // Check how many messages were processed&lt;br /&gt;   messagesProcessed++;&lt;br /&gt;   if ( messagesProcessed &amp;gt; KMaxMessagesProcessedInOneStep )&lt;br /&gt;     break;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; // 2. Renders scene&lt;br /&gt; Update();&lt;br /&gt; ...&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-family:arial;" &gt;I believe this is not the best solution, so if anyone can suggest something better I will appreciate it.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/790082722115179561-6797838611636935631?l=stenlikmobile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stenlikmobile.blogspot.com/feeds/6797838611636935631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://stenlikmobile.blogspot.com/2009/02/im-facing-problems-with-keypad-handling.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/790082722115179561/posts/default/6797838611636935631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/790082722115179561/posts/default/6797838611636935631'/><link rel='alternate' type='text/html' href='http://stenlikmobile.blogspot.com/2009/02/im-facing-problems-with-keypad-handling.html' title='Keypad messages handling on HTC'/><author><name>stenlik</name><uri>http://www.blogger.com/profile/17897204962662479785</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-790082722115179561.post-4463846441058424805</id><published>2009-02-19T09:27:00.000-08:00</published><updated>2009-02-19T09:47:53.710-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flipping'/><category scheme='http://www.blogger.com/atom/ns#' term='WM 5.0'/><category scheme='http://www.blogger.com/atom/ns#' term='DDSCAPS_BACKBUFFER'/><category scheme='http://www.blogger.com/atom/ns#' term='DirectX'/><category scheme='http://www.blogger.com/atom/ns#' term='DDSCAPS_VIDEOMEMORY'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='DDBLT_KEYSRC'/><title type='text'>Some comments about DirectX on Windows Mobile</title><content type='html'>&lt;span style="font-weight: bold; color: rgb(0, 0, 0);font-family:arial;" &gt;Some comments about DirectX on Windows Mobile&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:arial;" &gt;&lt;br /&gt;&lt;br /&gt;I'm a Symbian developer, who is currently porting a game to Windows Mobile 5.0. I’m trying to use the DirectX and I naively thought it will be easy, but soon I found it is quite fuzzy and tricky. This forced me to make up this blog to share what I have found and get some comments and tips from experienced developers.&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);font-family:arial;" &gt;&lt;br /&gt;&lt;br /&gt;1. Hardware flipping support&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:arial;" &gt;&lt;br /&gt;&lt;br /&gt;First surprise was for me that how many devices do not support the surface hardware flipping. This results in fact that I was forced to blit the content of the back buffer instead of just flipping it. I do not know why I expect the hardware support here – probably because I always connected the DirectX with desktop PCs…&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:arial;" &gt;&lt;br /&gt;&lt;br /&gt;I found here &lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa454897.aspx"&gt;&lt;span style="color: rgb(0, 0, 0);font-family:arial;" &gt;http://msdn.microsoft.com/en-us/library/aa454897.aspx&lt;/span&gt;&lt;/a&gt;&lt;span style="color: rgb(0, 0, 0);font-family:arial;" &gt;:&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 0);font-family:arial;" &gt;&lt;br /&gt;"…From the above code example, note the check for whether the device is capable of "Flipping" surfaces rather than BLT'ing them to display memory. For the vast majority of emerging Windows Mobile platforms, hardware flipping is not available…"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:arial;" &gt;&lt;br /&gt;&lt;br /&gt;There is nothing to do with this, just accept it...&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);font-family:arial;" &gt;&lt;br /&gt;&lt;br /&gt;2. VRAM&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:arial;" &gt;&lt;br /&gt;&lt;br /&gt;Secondly I thought that the back buffer could be created in the VRAM, but the API call always fails when specifying the DDSCAPS_VIDEOMEMORY flag. When I checked the video memory size it returns me some small values (HTC Wizard 200 (Qtek 9100) – 0 bytes, HTC Kaiser 120 (MDA Vario-III) – 153600 bytes, hp iPAQ hw6915 – 28800 bytes). I was not able to create back buffer in VRAM, so I created it in the system memory, which slows the blitting operation again. I do not have any idea what the VRAM is supposed to be used for or how to use it…&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:arial;" &gt;&lt;br /&gt;&lt;br /&gt;I found here &lt;a href="http://www.pocketmatrix.com/forums/viewtopic.php?t=28664"&gt;http://www.pocketmatrix.com/forums/viewtopic.php?t=28664&lt;/a&gt;:&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 0);font-family:arial;" &gt;&lt;br /&gt;“…1) From what I've come to understand is that most devices have JUST enough video memory to house the primary surface. Sometimes the device has a bit of extra video ram left which is why the free video memory amount is so small.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 0);font-family:arial;" &gt;2) Creating surfaces in video memory generally doesn't seem to work as there isn't ever enough room there to create a big surface. Maybe small ones that are &lt;= to the free video memory size…”&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-family:arial;" &gt;Any ideas how (if) it can be used?&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);font-family:arial;" &gt;&lt;br /&gt;&lt;br /&gt;3. Transparency&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:arial;" &gt;&lt;br /&gt;&lt;br /&gt;I have, without any optimization about 25-30 FPS when the whole scene was rendered (no user interaction). When rendering just one bitmap (size 240x180px) the FPS was about 100. Unfortunately when I started to use the color key to specify the transparent parts of bitmaps the FPS falls to 5.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:arial;" &gt;&lt;br /&gt;&lt;br /&gt;As written in the discussion here&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-family:arial;" &gt;&lt;a href="http://www.codeproject.com/KB/mobile/Caleidoscope.aspx?display=PrintAll&amp;amp;fid=348045&amp;amp;df=90&amp;amp;mpp=25&amp;amp;noise=3&amp;amp;sort=Position&amp;amp;view=Quick&amp;amp;fr=51"&gt;http://www.codeproject.com/KB/mobile/Caleidoscope.aspx?display=PrintAll&amp;amp;fid=348045&amp;amp;df=90&amp;amp;mpp=25&amp;amp;noise=3&amp;amp;sort=Position&amp;amp;view=Quick&amp;amp;fr=51&lt;/a&gt;:&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 0);font-family:arial;" &gt;&lt;br /&gt;“…I'm doing some blitting with alpha-test (I need to draw some sprites) but when I use the normal blitting with the DDBLT_KEYSRC flag, I lose much in performance (e.g. when I blit a 240X320 bitmap I have 220 fps but when I blit it with DDBLT_KEYSRC flag to lose the background, I get a fps of about 17 ?!)... for the moment, I’m doing the alpha-test myself by locking the surface and checking each pixel, which brings me a fps of about 25 for the same case... I've also tried doing it using GAPI, but I couldn't get a fps higher than 20…”&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:arial;" &gt;&lt;br /&gt;&lt;br /&gt;The only possible solution I can see there is to try to decrease the number of rendered sprites and simplify the way they are displayed plus I could possibly try to make my own routine for transparency handling, but I do not believe this will give me some more FPS. I welcome any hints on that…&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/790082722115179561-4463846441058424805?l=stenlikmobile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stenlikmobile.blogspot.com/feeds/4463846441058424805/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://stenlikmobile.blogspot.com/2009/02/some-comments-about-directx-on-windows.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/790082722115179561/posts/default/4463846441058424805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/790082722115179561/posts/default/4463846441058424805'/><link rel='alternate' type='text/html' href='http://stenlikmobile.blogspot.com/2009/02/some-comments-about-directx-on-windows.html' title='Some comments about DirectX on Windows Mobile'/><author><name>stenlik</name><uri>http://www.blogger.com/profile/17897204962662479785</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
