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