<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="https://www.schweda.net/style_feed.css" ?>
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
    xmlns:atom="http://www.w3.org/2005/Atom"	
	xmlns:dc="http://purl.org/dc/elements/1.1/" > 
<channel>
    <title>schweda.net - Blog</title>
    <link>https://www.schweda.net/</link>
    <description>schweda.net - Blog - Blog-Beitraege</description>
    <language>de-at</language>
    <copyright>Copyright 2006-2026</copyright>
    <generator>schweda.net</generator>
    <managingEditor>heinz.schweda@schweda.net (Heinz Schweda)</managingEditor>
    <webMaster>heinz.schweda@schweda.net (Heinz Schweda)</webMaster>
    <category>Blog</category>
	<atom:link href="https://schweda.net/blog_rss.php?bid=182" rel="self" type="application/rss+xml" />
<item>
<title><![CDATA[Zugriff auf FTP-Server per WinInet]]></title>
<description><![CDATA[
<p>Unter AX auf einen FTP-Server zuzugreifen und dort mit Dateien zu jonglieren ist meines Wissens nach standardm&auml;ssig nicht m&ouml;glich. Gl&uuml;cklicherweise stellt Windows aber eine API namens <b>WinInet</b> zur Verf&uuml;gung, deren Funktionen man auch unter AX ansprechen kann.
</p>

<p>&nbsp;
</p>

<p>Im folgenden findest Du einen einfachen Job, der anhand einger FTP-Befehle aufzeigt, wie die WinInet eingebunden werden kann. Selbstverst&auml;ndlich kann man mit ein paar Handgriffen auch auf andere Funktionen dieser API zugreifen. Der eigenen Fantasie bzw. auch den W&uuml;nschen der Kunden sind kaum Grenzen gesetzt ;-)
</p>

<div class="div_blog_axcode"><font color="#0000ff">static void</font> HandleFTP(Args _args)<br />
{<br />
&nbsp;&nbsp;&nbsp; <font color="#007d00">// Variablen-Definition</font><br />
&nbsp;&nbsp;&nbsp; DLL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; winInet;<br />
&nbsp;&nbsp;&nbsp; DLLFunction&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; internetConnect;<br />
&nbsp;&nbsp;&nbsp; DLLFunction&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; internetOpen;<br />
&nbsp;&nbsp;&nbsp; DLLFunction&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; internetCloseHandle;<br />
&nbsp;&nbsp;&nbsp; DLLFunction&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ftpPutFile;<br />
&nbsp;&nbsp;&nbsp; DLLFunction&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ftpRenameFile;<br />
&nbsp;&nbsp;&nbsp; DLLFunction&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ftpDeleteFile;<br />
&nbsp;&nbsp;&nbsp; DLLFunction&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ftpCreateDirectory;<br />
&nbsp;&nbsp;&nbsp; DLLFunction&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ftpRemoveDirectory;<br />
<br />
&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connectionHandle;<br />
&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileHandle;<br />
&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; handle;<br />
<br />
&nbsp;&nbsp;&nbsp; <font color="#007d00">// Submethoden</font><br />
&nbsp;&nbsp;&nbsp; <font color="#0000ff">int</font> internetOpen(<font color="#0000ff">str</font> 255 _agent, <font color="#0000ff">int</font> _accessType, <font color="#0000ff">str</font> 255 _proxyName, <font color="#0000ff">str</font> 255 _proxyByPass, <font color="#0000ff">int</font> _flags)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#0000ff">return</font> internetOpen.call(_agent, _accessType, _proxyName, _proxyByPass, _flags);<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; <font color="#0000ff">int</font> internetConnect(<font color="#0000ff">str</font> 60 _server, <font color="#0000ff">str</font> 99 _userName, <font color="#0000ff">str</font> 99 _password )<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#0000ff">return</font> internetConnect.call(handle, _server, 0, _userName, _password, 1, 0, 0);<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; boolean internetCloseHandle(int _handle)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#0000ff">return</font> internetCloseHandle.call(_handle);<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; <font color="#0000ff">int</font> FtpPutFile(int _hdl, <font color="#0000ff">str</font> 255 _localFile, <font color="#0000ff">str</font> 255 _remoteFile)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#0000ff">return</font> FtpPutFile.call(_hdl, _localFile, _remoteFile, 2, 0);<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; <font color="#0000ff">int</font> FtpRenameFile(int _hdl, <font color="#0000ff">str</font> 255 _localFile, <font color="#0000ff">str</font> 255 _remoteFile)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#0000ff">return</font> FtpRenameFile.call(_hdl, _localFile, _remoteFile);<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; <font color="#0000ff">int</font> FtpDeleteFile(int _hdl, <font color="#0000ff">str</font> 255 _localFile)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#0000ff">return</font> FtpDeleteFile.call(_hdl, _localFile);<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; <font color="#0000ff">int</font> FtpCreateDirectory(int _hdl, <font color="#0000ff">str</font> 255 _directory)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#0000ff">return</font> FtpCreateDirectory.call(_hdl, _directory);<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; <font color="#0000ff">int</font> FtpRemoveDirectory(int _hdl, <font color="#0000ff">str</font> 255 _directory)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#0000ff">return</font> FtpRemoveDirectory.call(_hdl, _directory);<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; ;<br />
<br />
&nbsp;&nbsp;&nbsp; <font color="#007d00">// Objekte erstellen</font><br />
&nbsp;&nbsp;&nbsp; winInet = <font color="#0000ff">new</font> DLL(<font color="#ff0000">'WinInet'</font>);<br />
<br />
&nbsp;&nbsp;&nbsp; internetConnect = <font color="#0000ff">new</font> DLLFunction(winInet, <font color="#ff0000">&quot;InternetConnectA&quot;</font>);<br />
&nbsp;&nbsp;&nbsp; internetConnect.returns(ExtTypes::DWORD);<br />
&nbsp;&nbsp;&nbsp; internetConnect.arg(ExtTypes::DWORD);<br />
&nbsp;&nbsp;&nbsp; internetConnect.arg(ExtTypes::STRING);<br />
&nbsp;&nbsp;&nbsp; internetConnect.arg(ExtTypes::DWORD);<br />
&nbsp;&nbsp;&nbsp; internetConnect.arg(ExtTypes::STRING);<br />
&nbsp;&nbsp;&nbsp; internetConnect.arg(ExtTypes::STRING);<br />
&nbsp;&nbsp;&nbsp; internetConnect.arg(ExtTypes::DWORD);<br />
&nbsp;&nbsp;&nbsp; internetConnect.arg(ExtTypes::DWORD);<br />
&nbsp;&nbsp;&nbsp; internetConnect.arg(ExtTypes::DWORD);<br />
<br />
&nbsp;&nbsp;&nbsp; internetOpen = <font color="#0000ff">new</font> DLLFunction(winInet, <font color="#ff0000">'InternetOpenA'</font>);<br />
&nbsp;&nbsp;&nbsp; internetOpen.returns(ExtTypes::DWORD);<br />
&nbsp;&nbsp;&nbsp; internetOpen.arg(ExtTypes::STRING);<br />
&nbsp;&nbsp;&nbsp; internetOpen.arg(ExtTypes::DWORD);<br />
&nbsp;&nbsp;&nbsp; internetOpen.arg(ExtTypes::STRING);<br />
&nbsp;&nbsp;&nbsp; internetOpen.arg(ExtTypes::STRING);<br />
&nbsp;&nbsp;&nbsp; internetOpen.arg(ExtTypes::DWORD);<br />
<br />
&nbsp;&nbsp;&nbsp; internetCloseHandle = <font color="#0000ff">new</font> DLLFunction(winInet, <font color="#ff0000">'InternetCloseHandle'</font>);<br />
&nbsp;&nbsp;&nbsp; internetCloseHandle.returns(ExtTypes::DWORD);<br />
&nbsp;&nbsp;&nbsp; internetCloseHandle.arg(ExtTypes::DWORD);<br />
<br />
&nbsp;&nbsp;&nbsp; ftpPutFile&nbsp; = <font color="#0000ff">new</font> DLLFunction(winInet, <font color="#ff0000">&quot;FtpPutFileA&quot;</font>);<br />
&nbsp;&nbsp;&nbsp; ftpPutFile.returns(ExtTypes::DWORD);<br />
&nbsp;&nbsp;&nbsp; ftpPutFile.arg(ExtTypes::DWORD);<br />
&nbsp;&nbsp;&nbsp; ftpPutFile.arg(ExtTypes::STRING);<br />
&nbsp;&nbsp;&nbsp; ftpPutFile.arg(ExtTypes::STRING);<br />
&nbsp;&nbsp;&nbsp; ftpPutFile.arg(ExtTypes::DWORD);<br />
&nbsp;&nbsp;&nbsp; ftpPutFile.arg(ExtTypes::DWORD);<br />
<br />
&nbsp;&nbsp;&nbsp; ftpRenameFile&nbsp; = <font color="#0000ff">new</font> DLLFunction(winInet, <font color="#ff0000">&quot;FtpRenameFileA&quot;</font>);<br />
&nbsp;&nbsp;&nbsp; ftpRenameFile.returns(ExtTypes::DWORD);<br />
&nbsp;&nbsp;&nbsp; ftpRenameFile.arg(ExtTypes::DWORD);<br />
&nbsp;&nbsp;&nbsp; ftpRenameFile.arg(ExtTypes::STRING);<br />
&nbsp;&nbsp;&nbsp; ftpRenameFile.arg(ExtTypes::STRING);<br />
<br />
&nbsp;&nbsp;&nbsp; ftpDeleteFile&nbsp; = <font color="#0000ff">new</font> DLLFunction(winInet, <font color="#ff0000">&quot;FtpDeleteFileA&quot;</font>);<br />
&nbsp;&nbsp;&nbsp; ftpDeleteFile.returns(ExtTypes::DWORD);<br />
&nbsp;&nbsp;&nbsp; ftpDeleteFile.arg(ExtTypes::DWORD);<br />
&nbsp;&nbsp;&nbsp; ftpDeleteFile.arg(ExtTypes::STRING);<br />
<br />
&nbsp;&nbsp;&nbsp; ftpCreateDirectory&nbsp; = <font color="#0000ff">new</font> DLLFunction(winInet, <font color="#ff0000">&quot;FtpCreateDirectoryA&quot;</font>);<br />
&nbsp;&nbsp;&nbsp; ftpCreateDirectory.returns(ExtTypes::DWORD);<br />
&nbsp;&nbsp;&nbsp; ftpCreateDirectory.arg(ExtTypes::DWORD);<br />
&nbsp;&nbsp;&nbsp; ftpCreateDirectory.arg(ExtTypes::STRING);<br />
<br />
&nbsp;&nbsp;&nbsp; ftpRemoveDirectory&nbsp; = <font color="#0000ff">new</font> DLLFunction(winInet, <font color="#ff0000">&quot;FtpRemoveDirectoryA&quot;</font>);<br />
&nbsp;&nbsp;&nbsp; ftpRemoveDirectory.returns(ExtTypes::DWORD);<br />
&nbsp;&nbsp;&nbsp; ftpRemoveDirectory.arg(ExtTypes::DWORD);<br />
&nbsp;&nbsp;&nbsp; ftpRemoveDirectory.arg(ExtTypes::STRING);<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; <font color="#007d00">// Verbindung aufbauen</font><br />
&nbsp;&nbsp;&nbsp; handle = internetOpen(<font color="#ff0000">'Axapta'</font>, 0, <font color="#ff0000">''</font>, <font color="#ff0000">''</font>, 0);<br />
<br />
&nbsp;&nbsp;&nbsp; connectionHandle = internetConnect(<font color="#ff0000">'someftp.com'</font>, <font color="#ff0000">'domain/username'</font>, <font color="#ff0000">'password'</font>);<br />
&nbsp;&nbsp;&nbsp; <font color="#0000ff">if</font>(connectionHandle <font color="#0000ff">==</font> 0)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#0000ff">throw</font> error(<font color="#ff0000">'Could not connect'</font>);<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; <font color="#007d00">// Datei &uuml;bertragen</font><br />
&nbsp;&nbsp;&nbsp; FileHandle = FtpPutFile(connectionHandle, <font color="#ff0000">'c:\\filename.ext'</font>, <font color="#ff0000">'dir1/subdir1/subdir2/uploadfilename.ext'</font>);<br />
&nbsp;&nbsp;&nbsp; <font color="#0000ff">if</font> (FileHandle <font color="#0000ff">==</font> 0)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; error(<font color="#ff0000">'Error'</font>);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <font color="#0000ff">else</font><br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; info(<font color="#ff0000">'Success'</font>);<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; <font color="#007d00">// Datei am FTP-Server umbenennen</font><br />
&nbsp;&nbsp;&nbsp; FileHandle = FtpRenameFile(connectionHandle, <font color="#ff0000">'dir1/subdir1/subdir2/uploadfilename.ext'</font>, <font color="#ff0000">'dir1/subdir1/subdir2/renamed_filename.ext'</font>);<br />
&nbsp;&nbsp;&nbsp; <font color="#0000ff">if</font> (FileHandle <font color="#0000ff">==</font> 0)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; error(<font color="#ff0000">'Error'</font>);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <font color="#0000ff">else</font><br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; info(<font color="#ff0000">'Success'</font>);<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; <font color="#007d00">// Datei am FTP-Server l&ouml;schen</font><br />
&nbsp;&nbsp;&nbsp; FileHandle = FtpDeleteFile(connectionHandle, <font color="#ff0000">'dir1/subdir1/subdir2/renamed_filename.ext'</font>);<br />
&nbsp;&nbsp;&nbsp; <font color="#0000ff">if</font> (FileHandle <font color="#0000ff">==</font> 0)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; error(<font color="#ff0000">'Error'</font>);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <font color="#0000ff">else</font><br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; info(<font color="#ff0000">'Success'</font>);<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; <font color="#007d00">// Verzeichnis am FTP-Server erstellen</font><br />
&nbsp;&nbsp;&nbsp; FileHandle = FtpCreateDirectory(connectionHandle, <font color="#ff0000">'dir1/subdir1/subdir2/new_dir'</font>);<br />
&nbsp;&nbsp;&nbsp; <font color="#0000ff">if</font> (FileHandle <font color="#0000ff">==</font> 0)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; error(<font color="#ff0000">'Error'</font>);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <font color="#0000ff">else</font><br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; info(<font color="#ff0000">'Success'</font>);<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; <font color="#007d00">// Verzeichnis am FTP-Server l&ouml;schen</font><br />
&nbsp;&nbsp;&nbsp; FileHandle = FtpRemoveDirectory(connectionHandle, <font color="#ff0000">'dir1/subdir1/subdir2/new_dir'</font>);<br />
&nbsp;&nbsp;&nbsp; <font color="#0000ff">if</font> (FileHandle <font color="#0000ff">==</font> 0)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; error(<font color="#ff0000">'Error'</font>);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <font color="#0000ff">else</font><br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; info(<font color="#ff0000">'Success'</font>);<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; <font color="#007d00">// Verbindung trennen</font><br />
&nbsp;&nbsp;&nbsp; internetCloseHandle(connectionHandle);<br />
&nbsp;<br />
}
</div>

<p>&Uuml;brigens, den Code habe ich bislang nur in AX 4.0 getestet, er sollte aber auch problemlos in anderen, &auml;lteren AX-Versionen laufen.
</p>

<p>Wer mehr &uuml;ber die WinInet wissen m&ouml;chte, im <a title="MSDN" type="MSDN" target="_blank" href="http://msdn2.microsoft.com/en-us/library/aa383630.aspx">Microsoft Developer Network</a> findet man so ziemlich alles dazu.
</p>]]></description>
<category>Microsoft Dynamics AX (Axapta)</category>
<pubDate>Thu, 13 Dec 2007 20:46:00 +0100</pubDate>
<link>https://www.schweda.net/blog_ax.php?bid=182</link>
<comments>https://www.schweda.net/blog_ax.php?bid=182</comments>
<guid isPermaLink="true">https://www.schweda.net/blog_ax.php?bid=182</guid>
<author>heinz.schweda@schweda.net (Heinz Schweda)</author>
<wfw:commentRss>https://www.schweda.net/blog_ax.php?bid=182</wfw:commentRss>
</item>
</channel>
</rss>	
