<?xml version="1.0" encoding="iso-8859-1" standalone="yes" ?>
<rss version="2.0">
<channel>
<title>UA Developer: Clarion FAQ - The five questions posted most recently:</title>
<description>Online knowledge base with frequently asked question about programming using Softvelocity Clarion</description>
<link>http://clarionfaq.uadeveloper.com</link>	<item>
		<title><![CDATA[How to know the equate name of the control at run-time?]]></title>
		<description><![CDATA[<ol>
	<li>You may use undocumented procedure:
	<blockquote>
		ClaFieldName(<span class="keyword">LONG</span>),<span class="keyword">NAME</span>(<span class="string">&#39;Cla$FieldName&#39;</span>),<span class="keyword">CSTRING</span>,<span class="keyword">PROC</span>
	</blockquote>
	<br />
	</li>
	<li>As mention above function is undocumented you may use legally user template (EXTENSION) that generates queue like:
	<blockquote>
		<pre>
		ControlNameQueue <span class="keyword">QUEUE</span>
		Feq<span class="keyword">                UNSIGNED</span>
		Name<span class="keyword">               STRING</span>(<span class="number">100</span>) <span class="remark">! or ASTRING</span>
		<span class="keyword">                 END</span>
		Run though all control and generate code for its fill:
		<span class="keyword">#FOR</span>(%Control)
		<span class="keyword">  #IF</span>(%Control)
		ControlNameQueue.Feq  = %Control
		ControlNameQueue.Name = &#39;%Control&#39;
		<span class="keyword">ADD</span>(ControlNameQueue)
		<span class="keyword">  #ENDIF</span>
		<span class="keyword">#ENDFOR</span>
		<span class="keyword">SORT</span>(ControlNameQueue, ControlNameQueue.Feq)
		After that equate name of control will be exctacted easy. 
		</pre>
	</blockquote>
	</li>
</ol>
]]></description>
		<link>http://clarionfaq.uadeveloper.com/content/1/82/en/how-to-know-the-equate-name-of-the-control-at-run_time.html</link>
		<pubDate>Thu, 18 Oct 2007 13:18:00 GMT</pubDate>
	</item>
	<item>
		<title><![CDATA[How to run application that will not be displayed in task bar?]]></title>
		<description><![CDATA[It is possible to hide application only under Windows 95/98. It should use function <a href="http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/win9x/95func_3t0z.asp" target="_blank">RegisterServiceProcess</a>: 
<pre>
<span class="remark">! MAP Section</span><br />
<span class="keyword">MAP</span><br />
  <span class="keyword">MODULE</span>(<span class="string">&#39;API&#39;</span>)<br />
    GetVersionEx(<span class="keyword">LONG</span>),<span class="keyword">NAME</span>(<span class="string">&#39;GetVersionExA&#39;</span>),<span class="keyword">SIGNED</span>,<span class="keyword">PASCAL</span>,<span class="keyword">PROC</span>,<span class="keyword">RAW</span><br />
    RegisterServiceProcess(<span class="keyword">ULONG</span> dwProcessId,<span class="keyword">ULONG</span> dwType),<span class="keyword">ULONG</span>,<span class="keyword">RAW</span>,<span class="keyword">PASCAL</span><br />
    GetCurrentProcessId(),<span class="keyword">ULONG</span>,<span class="keyword">RAW</span>,<span class="keyword">PASCAL</span><br />
  <span class="keyword">END</span><br />
<span class="keyword">END</span><br />
<br />
<span class="remark">! Data Section</span><br />
VER_PLATFORM_WIN32_NT      <span class="keyword">EQUATE</span>(<span class="number">2</span>)<br />
VER_PLATFORM_WIN32_WINDOWS <span class="keyword">EQUATE</span>(<span class="number">1</span>)<br />
VER_PLATFORM_WIN32S        <span class="keyword">EQUATE</span>(<span class="number">0</span>)<br />
<br />
OVI                    <span class="keyword">GROUP</span>,<span class="keyword">PRE</span>(OVI)<br />
OVI:dwOSVersionInfoSize  <span class="keyword">DWORD</span><br />
OVI:dwMajorVersion       <span class="keyword">DWORD</span><br />
OVI:dwMinorVersion       <span class="keyword">DWORD</span><br />
OVI:dwBuildNumber        <span class="keyword">DWORD</span><br />
OVI:dwPlatformId         <span class="keyword">DWORD</span><br />
OVI:szCSDVersion         <span class="keyword">CHAR</span>,<span class="keyword">DIM</span>(<span class="keyword">128</span>)<br />
                       <span class="keyword">END</span><br />
<br />
<span class="remark">! Code Section</span><br />
<span class="remark">! Define version of Windows</span><br />
OVI:dwOSVersionInfoSize = <span class="keyword">SIZE</span>(OVI)<br />
<span class="keyword">IF</span> GetVersionEx( <span class="keyword">ADDRESS</span>(OVI) ) = <span class="number">0</span><br />
  <span class="keyword">MESSAGE</span>(<span class="string">&#39;Unable to determine Windows version&#39;</span>,<span class="string">&#39;Error&#39;</span>)<br />
<span class="keyword">ELSE</span><br />
  <span class="keyword">CASE</span> OVI:dwPlatformId<br />
  <span class="keyword">OF</span> VER_PLATFORM_WIN32S<br />
    g:OSType = <span class="number">0</span><br />
    <span class="keyword">MESSAGE</span>(<span class="string">&#39;Unable to run under Win32s - get a real OS&#39;</span>,<span class="keyword">&#39;Error&#39;</span>)<br />
  <span class="keyword">OF</span> VER_PLATFORM_WIN32_WINDOWS<br />
    g:OSType = <span class="number">1</span><br />
    g:WindowsPath = <span class="keyword">LOWER</span>(GetRegistry(<span class="string">&#39;SoftwareMicrosoftWindowsCurrentVersion&#39;</span>,|<br />
                                      <span class="string">&#39;SystemRoot&#39;</span>,<span class="string">&#39;&#39;</span>,HKEY_LOCAL_MACHINE))<br />
  <span class="keyword">OF</span> VER_PLATFORM_WIN32_NT<br />
    <span class="keyword">IF</span> OVI:dwMajorVersion = <span class="number">5</span><br />
      g:OSType = <span class="number">1</span> <span class="remark">! Windows 2000</span><br />
    <span class="keyword">ELSE</span><br />
      g:OSType = <span class="number">2</span> <span class="remark">! Windows NT</span><br />
    <span class="keyword">END</span><br />
    g:WindowsPath = <span class="keyword">LOWER</span>(GetRegistry(<span class="string">&#39;SoftwareMicrosoftWindows NTCurrentVersion&#39;</span>,|<br />
                                      <span class="string">&#39;SystemRoot&#39;</span>,<span class="string">&#39;&#39;</span>,HKEY_LOCAL_MACHINE))<br />
  <span class="keyword">ELSE</span><br />
    <span class="keyword">MESSAGE</span>(<span class="string">&#39;Unable to determine which Windows you have&#39;</span>,<span class="string">&#39;Error&#39;</span>)<br />
  <span class="keyword">END</span><br />
<span class="keyword">END</span><br />
<br />
<span class="remark">! Register as service only under Windows 9x</span><br />
<span class="keyword">IF</span> g:OSType = <span class="number">1</span> <span class="remark">! Win9x</span><br />
  loc:CurrentProcessId = GetCurrentProcessId()<br />
  r# = RegisterServiceProcess( loc:CurrentProcessId, <span class="number">1</span>)<br />
<span class="keyword">END</span>
</pre>
]]></description>
		<link>http://clarionfaq.uadeveloper.com/content/13/9/en/how-to-run-application-that-will-not-be-displayed-in-task-bar.html</link>
		<pubDate>Tue, 17 Jul 2007 08:32:00 GMT</pubDate>
	</item>
	<item>
		<title><![CDATA[How to define IP address of computer?]]></title>
		<description><![CDATA[<pre>
<span class="keyword">  PROGRAM</span>
<span class="keyword">  MAP</span>
<span class="keyword">    MODULE</span>(<span class="string">&#39;wsock32.dll&#39;</span>)
WSAStartup(<span class="keyword">SIGNED</span>, *lpWSAData),<span class="keyword">SIGNED</span>,<span class="keyword">RAW</span>,<span class="keyword">PASCAL</span>,<span class="keyword">NAME</span>(<span class="string">&#39;WSAStartup&#39;</span>)
Inet_NToA(<span class="keyword">ULONG</span>),<span class="keyword">ULONG</span>,<span class="keyword">RAW</span>,<span class="keyword">PASCAL</span>,<span class="keyword">NAME</span>(<span class="string">&#39;Inet_NToA&#39;</span>)
WSACleanup(),<span class="keyword">SIGNED</span>,<span class="keyword">RAW</span>,<span class="keyword">PASCAL</span>,<span class="keyword">NAME</span>(<span class="string">&#39;WSACleanUP&#39;</span>)
GetHostByName(*<span class="keyword">CSTRING</span>),<span class="keyword">LONG</span>,<span class="keyword">RAW</span>,<span class="keyword">PASCAL</span>,<span class="keyword">NAME</span>(<span class="string">&#39;GetHostByName&#39;</span>)
GetHostName(*<span class="keyword">CSTRING</span>,<span class="keyword">LONG</span>),<span class="keyword">LONG</span>,<span class="keyword">RAW</span>,<span class="keyword">PASCAL</span>,<span class="keyword">NAME</span>(<span class="string">&#39;GetHostName&#39;</span>)
<span class="keyword">    END</span>
<span class="keyword">  END</span>
</pre>
<pre>
lpWSAData         <span class="keyword">GROUP</span>,<span class="keyword">TYPE</span>
wVersion            <span class="keyword">SIGNED</span>
wHighVersion        <span class="keyword">SIGNED</span>
szDescription       <span class="keyword">CSTRING</span>(<span class="number">257</span>)
szSystemStatus      <span class="keyword">CSTRING</span>(<span class="number">129</span>)
iMaxSockets         <span class="keyword">USHORT</span>
iMaxUpdDg           <span class="keyword">USHORT</span>
lpVendorInfo        <span class="keyword">LONG</span>
<span class="keyword">END</span>
InetAddr          <span class="keyword">ULONG</span>
WSAData1          <span class="keyword">GROUP</span>(lpWSAData)
<span class="keyword">END</span>
LocalHost         <span class="keyword">CSTRING</span>(<span class="number">100</span>)
LocalIP           <span class="keyword">CSTRING</span>(<span class="number">15</span>)
</pre>
<pre>
<span class="keyword">  CODE</span>
<span>  err# = WSACleanUP()</span>
<span class="keyword">  CLEAR</span>(WSAData1)
<span class="keyword">  IF</span> WSAStartup(<span class="number">2</span>,WSAData1) &lt; 0
<span class="keyword">    RETURN</span>
<span class="keyword">  END</span>
<span>  err# = GetHostName(LocalHost,<span class="number">100</span>)</span>
<span>  InetAddr = GetHostByName(LocalHost)</span>
<span class="keyword">  IF</span> InetAddr
<span class="keyword">    PEEK</span>(InetAddr + <span class="number">12</span>,InetAddr)
<span class="keyword">    PEEK</span>(InetAddr,InetAddr)
<span class="keyword">    PEEK</span>(InetAddr,InetAddr)
<span class="keyword">    PEEK</span>(Inet_NToA(InetAddr),LocalIP)
<span class="keyword">  END</span>
<span>  err# = WSACleanup()</span>
<span class="keyword">  MESSAGE</span>(LocalIP)
</pre>
]]></description>
		<link>http://clarionfaq.uadeveloper.com/content/13/10/en/how-to-define-ip-address-of-computer.html</link>
		<pubDate>Tue, 17 Jul 2007 08:11:00 GMT</pubDate>
	</item>
	<item>
		<title><![CDATA[How to call WinAPI functions from Clarion applications?]]></title>
		<description><![CDATA[For the first time it is necessary to declare in MAP-section the prototype of WinAPI-function in terms of Clarion, i.e. to replace C-data types with corresponding data types of Clarion. You may use service program <strong>winapi.exe</strong> which is delivered with Clarion. Its database content great variety already adapted prototypes for Clarion. As soon as procedure will be prototyped correctly, it may be used as usual Clarion-function.
<p>
Example:
</p>
<pre>
<span class="remark">! WinAPI prototype</span>
LRESULT SendMessage(HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
</pre>
<pre>
<span class="remark">! Clarion prototype</span>
SendMessage(<span class="keyword">UNSIGNED</span> hWnd,<span class="keyword">UNSIGNED</span> Msg,<span class="keyword">UNSIGNED</span> wParam,<span class="keyword">LONG</span> lParam), |
<span class="keyword">UNSIGNED</span>,<span class="keyword">PASCAL</span>,<span class="keyword">RAW</span>,<span class="keyword">NAME</span>(<span class="string">&#39;SendMessageA&#39;</span>),<span class="keyword">PROC</span>
</pre>
It should to pay special attention to attribute of procedure <span class="keyword">NAME</span>. The matter is that functions WinAPI can be used both for usual null-terminated strings and for Unicode-string. Therefore Windows libraries export at least two names for the same function. Depending on types of string function will work, its name can be terminated by letter <strong>A</strong> (null-terminated strings) or <strong>W</strong> (wide strings).
One more attribute demanding attention - <span class="keyword">RAW</span>. It is necessary to specify it in the prototype of function if among its parameters there is a <span class="keyword">CSTRING</span>-parameter. This attribute defines, that string parameter will be passed to procedure by its address.
For detail information read the help.
]]></description>
		<link>http://clarionfaq.uadeveloper.com/content/13/22/en/how-to-call-winapi-functions-from-clarion-applications.html</link>
		<pubDate>Tue, 17 Jul 2007 08:03:00 GMT</pubDate>
	</item>
	<item>
		<title><![CDATA[How to get unique identifier GUID?]]></title>
		<description><![CDATA[<pre>
<span class="keyword">  PROGRAM</span>
<span class="keyword">  MAP</span>
<span class="keyword">    MODULE</span>(&#39;winapi&#39;)
CoCreateGuid(*?),UNSIGNED,PASCAL,RAW,DLL(1),NAME(<span class="string">&#39;CoCreateGuid&#39;</span>)
StringFromGUID2(*?,*?,LONG cchMax),UNSIGNED,PASCAL,RAW,NAME(<span class="string">&#39;StringFromGUID2&#39;</span>)
WideCharToMultiByte(UNSIGNED CodePage=0,USHORT dwFlags=0,|
*? lpWideCharStr,LONG cchWideChar,*? lpMultiByteStr,|
LONG cbMultiByte,? lpDefaultChar,|
BYTE lpUsedDefaultChar), |
UNSIGNED,PASCAL,RAW,NAME(<span class="string">&#39;WideCharToMultiByte&#39;</span>)
<span class="keyword">    END</span>
<span class="keyword">  END</span>
</pre>
<pre>
pGuid  <span class="keyword">STRING</span>(<span class="number">16</span>)
buf    <span class="keyword">STRING</span>(<span class="number">128</span>)
buf2   <span class="keyword">STRING</span>(<span class="number">64</span>)
cbSize <span class="keyword">LONG</span>
</pre>
<pre>
<span class="keyword">  CODE</span>
<span class="keyword">  IF</span> CoCreateGuid(pGUID)
<span class="keyword">    MESSAGE</span>(<span class="string">&#39;&#39;</span>,<span class="string">&#39;GUID is not received.&#39;</span>)
<span class="keyword">  ELSE</span>
<span class="keyword">    IF</span> StringFromGuid2(pGuid,buf,<span class="keyword">SIZE</span>(buf)/<span class="number">2</span>)
<span>      cbSize = WideCharToMultiByte(, , buf, <span class="number">-1</span>, buf2, SIZE(buf2), <span class="number">0</span>,<span class="number">0</span>)</span>
<span class="keyword">      IF</span> cbSize &gt; <span class="=number">0</span>
<span>        buf2 = buf2[<span class="number">1</span> : cbSize]</span>
<span class="keyword">        SETCLIPBOARD</span>(<span class="keyword">CLIP</span>(buf2))
<span class="keyword">        MESSAGE</span>(buf2,<span class="string">&#39;GUID is received and placed into clipboard.&#39;</span>)
<span class="keyword">      END</span>
<span class="keyword">    ELSE</span>
<span class="keyword">      MESSAGE</span>(<span class="string">&#39;Buffer is too small for accepted value.&#39;</span>)
<span class="keyword">    END</span>
<span class="keyword">  END</span>
</pre>
]]></description>
		<link>http://clarionfaq.uadeveloper.com/content/8/36/en/how-to-get-unique-identifier-guid.html</link>
		<pubDate>Tue, 17 Jul 2007 07:59:00 GMT</pubDate>
	</item>
</channel>
</rss>