hsp3_64.as と hspint64.as の練習に wininet.dll のFTPのラップ関数を
モジュール化してみました。使い方がおかしい部分などがあれば、ご指摘
頂けると助かります。
////////////////////////////////////////////////////
//Required Includes
//#include "hsp3_64.as"
//#include "hspint64.as"
////////////////////////////////////////////////////
#module wininet64
#ifdef __hsp30__
#ifndef __WININET64__
#define global __WININET64__
#uselib "kernel32.dll"
#cfunc GetLastError  "GetLastError"
#uselib "WININET.DLL"
#func global InternetOpen "InternetOpenA" sptr,sptr,sptr,sptr,sptr
#func global InternetConnect "InternetConnectA" sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr
#func global InternetCloseHandle "InternetCloseHandle" sptr
#func global InternetGetLastResponseInfo "InternetGetLastResponseInfoA" sptr,sptr,sptr
#func global FtpPutFile "FtpPutFileA" sptr,sptr,sptr,sptr,sptr
#func global FtpGetFile "FtpGetFileA" sptr,sptr,sptr,sptr,sptr,sptr,sptr
#func global FtpDeleteFile "FtpDeleteFileA" sptr,sptr
#func global FtpRenameFile "FtpRenameFileA" sptr,sptr,sptr
#func global FtpCommand "FtpCommandA" sptr,sptr,sptr,sptr,sptr
#func global FtpCreateDirectory "FtpCreateDirectoryA" sptr,sptr
#func global FtpRemoveDirectory "FtpRemoveDirectoryA" sptr,sptr
#func global FtpSetCurrentDirectory "FtpSetCurrentDirectoryA" sptr,sptr
#func global FtpGetCurrentDirectory "FtpGetCurrentDirectoryA" sptr,sptr,sptr
;InternetOpen AccessType
#define INTERNET_OPEN_TYPE_DIRECT   1 ;全てのホスト名をローカルに解決
;InternetConnect Service
#define INTERNET_SERVICE_FTP        1 ;FTP
#define INTERNET_FLAG_PASSIVE       0x08000000
;FtpPutFile Flags
#define FTP_TRANSFER_TYPE_ASCII     1
#define FTP_TRANSFER_TYPE_BINARY    2
#define INTERNET_FLAG_RELOAD        0x80000000
#define INTERNET_FLAG_DONT_CACHE    0x04000000
;FtpGetFile Attr
#define FILE_ATTRIBUTE_ARCHIVE      0x20 ;アーカイブ
#define FILE_ATTRIBUTE_DIRECTORY    0x10 ;ディレクトリ
#define FILE_ATTRIBUTE_HIDDEN       0x02 ;隠しファイル
#define FILE_ATTRIBUTE_NORMAL       0x80 ;属性を持たない
#define FILE_ATTRIBUTE_READONLY     0x01 ;読み込み専用
#define FILE_ATTRIBUTE_SYSTEM       0x04 ;システムファイル
#define TRUE  1
#define FALSE 0
#define NULL  0
#define global ERROR_INTERNET_EXTENDED_ERROR 12003
#endif
////////////////////////////////////////////////////
#defcfunc _GetLastError
	return cfunc64i(GetLastError)
////////////////////////////////////////////////////
;ネットワークオープン
#defcfunc netOpen
mref _stat, 64
	;オープンされていればクローズ
	ftpClose
	netClose
	;インターネットに接続
	hInternet = cfunc64i(InternetOpen, nullptr, INTERNET_OPEN_TYPE_DIRECT, nullptr, nullptr, 0)
	if hInternet {
		return TRUE
	}
	_stat= _GetLastError()
	return FALSE
////////////////////////////////////////////////////
;ネットワーククローズ
#deffunc netClose
	if hSession {
		cfunc64v InternetCloseHandle, hSession
		hSession = 0
	}
	return
////////////////////////////////////////////////////
;FTPオープン
#defcfunc ftpOpen str _Url, str _Username, str _Password, int _Port
	if hInternet {
		;サーバー(ホスト)に接続
		hSession = cfunc64i(InternetConnect, hInternet, _Url, _Port, _Username, _Password, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0)
		if hSession {
			return TRUE
		}
		_stat= _GetLastError()
	}
	return FALSE
////////////////////////////////////////////////////
;FTPクローズ
#deffunc ftpClose
	if hInternet {
		cfunc64v InternetCloseHandle, hInternet
		hInternet = 0
	}
	return
////////////////////////////////////////////////////
;FTPレスポンス取得
#deffunc ftpLastResponse var _Err, var _Ans, var _Size
	cfunc64v InternetGetLastResponseInfo, varptr64(_Err), varptr64(_Ans), varptr64(_Size)
	return
////////////////////////////////////////////////////
;FTPファイル受信
#defcfunc ftpGet str _Src, str _Dst
	if hSession {
		iret = cfunc64i(FtpGetFile, hSession, _Src, _Dst, 1, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_BINARY + INTERNET_FLAG_RELOAD, 0)
		if iret {
			return TRUE
		}
		_stat= _GetLastError()
	}
	return FALSE
////////////////////////////////////////////////////
;FTPファイル送信
#defcfunc ftpPut str _Src, str _Dst
	if hSession {
		iret = cfunc64i(FtpPutFile, hSession, _Src, _Dst, FTP_TRANSFER_TYPE_BINARY, 0)
		if iret {
			return TRUE
		}
		_stat= _GetLastError()
	}
	return FALSE
////////////////////////////////////////////////////
;FTPファイル削除
#defcfunc ftpDel str _Src
	if hSession {
		iret = cfunc64i(FtpDeleteFile, hSession, _Src)
		if iret {
			return TRUE
		}
		_stat= _GetLastError()
	}
	return FALSE
////////////////////////////////////////////////////
;FTPファイル名変更
#defcfunc ftpRen str _Src, str _Dst
	if hSession {
		iret = cfunc64i(FtpRenameFile, hSession, _Src, _Dst)
		if iret {
			return TRUE
		}
		_stat= _GetLastError()
	}
	return FALSE
////////////////////////////////////////////////////
;FTPコマンド実行
#defcfunc ftpCmd str _Cmd
	if hSession {
		iret = cfunc64i(FtpCommand, hSession, FALSE, FTP_TRANSFER_TYPE_BINARY, _Cmd, 0, nullptr)
		if iret {
			return TRUE
		}
		_stat= _GetLastError()
	}
	return FALSE
////////////////////////////////////////////////////
;FTPディレクトリ作成
#defcfunc ftpMkDir str _Dir
	if hSession {
		iret = cfunc64i(FtpCreateDirectory, hSession, _Dir)
		if iret {
			return TRUE
		}
		_stat= _GetLastError()
	}
	return FALSE
////////////////////////////////////////////////////
;FTPディレクトリ削除
#defcfunc ftpRmDir str _Dir
	if hSession {
		iret = cfunc64i(FtpRemoveDirectory, hSession, _Dir)
		if iret {
			return TRUE
		}
		_stat= _GetLastError()
	}
	return FALSE
////////////////////////////////////////////////////
;FTPカレントディレクトリ取得
#defcfunc ftpGetDir var _Ans, var _Size
	if hSession {
		;FTPの現在のディレクトリ名を取得
		iret = cfunc64i(FtpGetCurrentDirectory, hSession, varptr64(_Ans), varptr64(_Size))
		if iret {
			return TRUE
		}
		_stat= _GetLastError()
	}
	return FALSE
////////////////////////////////////////////////////
;FTPカレントディレクトリ変更
#defcfunc ftpSetDir str _Dir
	if hSession {
		;カレントのディレクトリを変更
		if strlen(_Dir) > 0 {
			iret = cfunc64i(FtpSetCurrentDirectory, hSession, _Dir)
			if iret {
				return TRUE
			}
			_stat= _GetLastError()
		}
	}
	return FALSE
////////////////////////////////////////////////////
;FTPディレクトリ移動・取得
#defcfunc ftpDir str _Dir, var _Ans, var _Size
	if hSession {
		;カレントのディレクトリを変更
		if strlen(_Dir) > 0 {
			iret = cfunc64i(FtpSetCurrentDirectory, hSession, _Dir)
			if iret {
				;FTPの現在のディレクトリ名を取得
				iret = cfunc64i(FtpGetCurrentDirectory, hSession, varptr64(_Ans), varptr64(_Size))
				if iret {
					return TRUE
				}
			}
			_stat= _GetLastError()
		}
	}
	return FALSE
#global

