01.リモートのファイル情報を取得する (要llmod.as , WinInet.dll)
02.リモートのファイル内容を取得する (要llmod.as , WinInet.dll)
03.リモートにディレクトリを作成する (要llmod.as , WinInet.dll)
04.リモートのディレクトリを削除する (要llmod.as , WinInet.dll)
05.リモートのファイルを削除する (要llmod.as , WinInet.dll)
06.ローカルからリモートへファイルを転送する (要llmod.as , WinInet.dll)
07.リモートのファイル名を変更する (要llmod.as , WinInet.dll)
01.リモートのファイル情報を取得する (要llmod.as , WinInet.dll)
インターネットのサーバーにアップされているファイルの情報をAPIを使用して取得しようというものです。
このサンプルではWinsock.DLLよりずっと簡単なWinInet.DLLを使用しています。
利用するにはIE3.02以上がインストールされている環境が必要になります。
Win98以上であれば必ず入っているので、大半のWinユーザーは持っているはずですが。
取得できる情報はヘッダ情報、リソースサイズ、関係付けられたクッキーなどである。
詳しくはHttpQueryInfo関数を紹介しているページを見てください。
(例)サーバーから返された全ヘッダを受け取る
#define INTERNET_OPEN_TYPE_PRECONFIG 0 ; レジストリに記録されている方法
#define INTERNET_FLAG_RELOAD $80000000 ; キャッシュを使わずサーバーから取得
#define HTTP_QUERY_RAW_HEADERS_CRLF 22 ; サーバーによって返されてすべてのヘッダーを受け取る
#include "llmod.as"
ll_libload inet,"wininet.dll"
infosize=1024
sdim url,128
sdim info,infosize
url="http://www.rinku.zaq.ne.jp/ultimate/index.htm"
; WinInet初期化
agent="ultimate"
getptr prm,agent ; アプリケーション名
prm.1=INTERNET_OPEN_TYPE_PRECONFIG ; 接続方式
prm.2=0 ; プロキシサーバー名
prm.3=0 ; ローカルでの既知のホスト名またはIPアドレスのリスト(とりあえずNULL)
prm.4=0 ; Win32インターネット関数の振る舞いを指定するフラグ(とりあえず0)
dllproc "InternetOpenA",prm,5,inet
hndl.0=dllret
; URLオープン
prm.0=hndl.0 ; InternetOpenで返されたハンドル
getptr prm.1,url ; HTTPで始まるURLのポインタ
prm.2=0 ; HTTPサーバに送るヘッダ(とりあえずNULL)
prm.3=0; Headersの文字数(とりあえず0)
prm.4=INTERNET_FLAG_RELOAD; オープンの種別を指定するビットマスク値
prm.5=0 ; アプリケーション定義の32bit値
dllproc "InternetOpenUrlA",prm,6,inet
hndl.1=dllret
if hndl.1=0 : dialog "取得に失敗しました" : stop
; ファイル情報の取得
prm.0=hndl.1 ; 情報の取得元のHTTP要求を識別するハンドル
prm.1=HTTP_QUERY_RAW_HEADERS_CRLF ; 要求する情報
getptr prm.2,info ; 取得結果
getptr prm.3,infosize ; バッファサイズ
prm.4=0 ; 同一ヘッダが存在する場合に識別するためのインデクス
dllproc "HttpQueryInfoA",prm,5,inet
; 開放
prm=hndl.1
dllproc "InternetCloseHandle",prm,1,inet ; ハンドルを閉じる
prm=hndl.0
dllproc "InternetCloseHandle",prm,1,inet ; ハンドルを閉じる
ll_libfree inet
dialog ""+info
02.リモートのファイル内容を取得する (要llmod.as , WinInet.dll)
インターネットのサーバーにアップされているファイル内容をAPIを使用して取得しようというものです。
コレはダウンローダーとして以外にもいろいろな使い方ができるかと思います。
注意を一点。テキストとして取得する場合、文字化け等が発生しますので各自で直すようにしてください。
ファイル情報の取得までは01と同じです。詳しくはソチラをご覧ください。
(例)ファイル(画像)内容をバイナリ形式で取得し、ファイルとして書き出す
#define INTERNET_OPEN_TYPE_PRECONFIG 0
#define INTERNET_FLAG_RELOAD $80000000
#define HTTP_QUERY_CONTENT_LENGTH 5 ; リソースのサイズ
#include "llmod.as"
ll_libload inet,"wininet.dll"
bufsize=16000 ; 初めに用意しておくバッファの確保サイズ
sdim buf,bufsize
sdim url,128
sdim len,4
url="http://www.rinku.zaq.ne.jp/ultimate/img/banner.jpg"
agent="ultimate"
getptr prm,agent
prm.1=INTERNET_OPEN_TYPE_PRECONFIG
prm.2=0
prm.3=0
prm.4=0
dllproc "InternetOpenA",prm,5,inet
hndl.0=dllret
prm.0=hndl.0
getptr prm.1,url
prm.2=0
prm.3=0
prm.4=INTERNET_FLAG_RELOAD
prm.5=0
dllproc "InternetOpenUrlA",prm,6,inet
hndl.1=dllret
if hndl.1=0 : dialog "取得に失敗しました" : stop
prm.0=hndl.1
prm.1=HTTP_QUERY_CONTENT_LENGTH
getptr prm.2,len
getptr prm.3,bufsize
prm.4=0
dllproc "HttpQueryInfoA",prm,5,inet
int len
; 読み込み
prm.0=hndl.1 ; URLオープンした時のハンドル
getptr prm.1,buf ; 読み込み用バッファ
prm.2=len ; バッファサイズ
getptr prm.3,len ; サイズへのポインタ
dllproc "InternetReadFile",prm,4,inet
prm=hndl.1
dllproc "InternetCloseHandle",prm,1,inet
prm=hndl.0
dllproc "InternetCloseHandle",prm,1,inet
ll_libfree inet
bsave "hspbc_banner.jpg",buf,len
03.リモートにディレクトリを作成する (要llmod.as , WinInet.dll)
FTPによって指定したディレクトリをリモートに作成します。
管理人は自分のホームページのサーバーでテストをしましたが、TIPSとして情報を公開することは出来ませんので、
このTIPSをテストされる場合は、あらかじめFTPが扱えるサーバーのスペースを確保するようにしてください。
初めのWinInetを初期化する処理については01をご覧ください。
FTP処理を行う時は中盤にあるInternetConnectが必要となります。使い方を覚えておきましょう。
(例)フォルダを作成する
#define INTERNET_OPEN_TYPE_PRECONFIG 0
#define INTERNET_DEFAULT_FTP_PORT 21
#define INTERNET_SERVICE_FTP 1
#include "llmod.as"
ll_libload inet,"wininet.dll"
agent="ultimate"
server="ftp.xxx.xxx" ; 接続先ホスト・IPアドレス
port=INTERNET_DEFAULT_FTP_PORT ; TCP/IPポート
user="xxx" ; ユーザー名(NULLなら anonymous を使用される)
pass="xxx" ; パスワード(ユーザー名もパスワードもNULLなら e-mail が使用される)
directory="NewDirTest" ; 作成するディレクトリ名
getptr prm,agent
prm.1=INTERNET_OPEN_TYPE_PRECONFIG
prm.2=0
prm.3=0
prm.4=0
dllproc "InternetOpenA",prm,5,inet
hndl.0=dllret
; サーバーに接続
prm.0=hndl.0 ; ハンドル
getptr prm.1,server ; サーバー(ホスト)名
prm.2=port ; ポート
getptr prm.3,user ; ユーザー名
getptr prm.4,pass ; パスワード
prm.5=INTERNET_SERVICE_FTP ; サービスのタイプ
prm.6=0 ; サービス固有のフラグ
prm.7=0 ; アプリケーション定義の32bit値
dllproc "InternetConnectA",prm,8,inet
hndl.1=dllret
if hndl.1=0 : dialog"接続できませんでした" : end
; ディレクトリ作成
prm.0=hndl.1
getptr prm.1,directory
dllproc "FtpCreateDirectoryA",prm,2,inet
prm=hndl.1
dllproc "InternetCloseHandle",prm,1,inet
prm=hndl.0
dllproc "InternetCloseHandle",prm,1,inet
ll_libfree inet
dialog"作成完了しました"
04.リモートのディレクトリを削除する (要llmod.as , WinInet.dll)
03の逆で既に作成されている指定されたディレクトリを削除してみたいと思います。
FTP接続(InternetConnection)については03と同じです。詳しくはソチラをご覧ください。
(例)フォルダを削除する
#define INTERNET_OPEN_TYPE_PRECONFIG 0
#define INTERNET_DEFAULT_FTP_PORT 21
#define INTERNET_SERVICE_FTP 1
#include "llmod.as"
ll_libload inet,"wininet.dll"
agent="ultimate"
server="ftp.xxx.xxx"
port=INTERNET_DEFAULT_FTP_PORT
user="xxx"
pass="xxx"
directory="NewDirTest"
getptr prm,agent
prm.1=INTERNET_OPEN_TYPE_PRECONFIG
prm.2=0
prm.3=0
prm.4=0
dllproc "InternetOpenA",prm,5,inet
hndl.0=dllret
prm.0=hndl.0
getptr prm.1,server
prm.2=port
getptr prm.3,user
getptr prm.4,pass
prm.5=INTERNET_SERVICE_FTP
prm.6=0
prm.7=0
dllproc "InternetConnectA",prm,8,inet
hndl.1=dllret
if hndl.1=0 : dialog"接続できませんでした" : end
; ディレクトリ削除
prm.0=hndl.1
getptr prm.1,directory
dllproc "FtpRemoveDirectoryA",prm,2,inet
prm=hndl.1
dllproc "InternetCloseHandle",prm,1,inet
prm=hndl.0
dllproc "InternetCloseHandle",prm,1,inet
ll_libfree inet
dialog"削除完了しました"
05.リモートのファイルを削除する (要llmod.as , WinInet.dll)
04のディレクトリではなく、今度はファイルを削除したいと思います。
ファイル削除のコメント以前までは03と全く同じです。詳しくはソチラをご覧ください。
(例)
#define INTERNET_OPEN_TYPE_PRECONFIG 0
#define INTERNET_DEFAULT_FTP_PORT 21
#define INTERNET_SERVICE_FTP 1
#include "llmod.as"
ll_libload inet,"wininet.dll"
agent="ultimate"
server="ftp.xxx.xxx"
port=INTERNET_DEFAULT_FTP_PORT
user="xxx"
pass="xxx"
file="DelFile"
getptr prm,agent
prm.1=INTERNET_OPEN_TYPE_PRECONFIG
prm.2=0
prm.3=0
prm.4=0
dllproc "InternetOpenA",prm,5,inet
hndl.0=dllret
prm.0=hndl.0
getptr prm.1,server
prm.2=port
getptr prm.3,user
getptr prm.4,pass
prm.5=INTERNET_SERVICE_FTP
prm.6=0
prm.7=0
dllproc "InternetConnectA",prm,8,inet
hndl.1=dllret
if hndl.1=0 : dialog"接続できませんでした" : end
; ファイル削除
prm.0=hndl.1
getptr prm.1,file
dllproc "FtpDeleteFileA",prm,2,inet
prm=hndl.1
dllproc "InternetCloseHandle",prm,1,inet
prm=hndl.0
dllproc "InternetCloseHandle",prm,1,inet
ll_libfree inet
dialog"削除完了しました"
06.ローカルからリモートへファイルを転送する (要llmod.as , WinInet.dll)
現在パソコンに入っているファイルをリモートに送信します。いわゆるアップロードというやつです。
ファイル転送のコメントまでは今までの手順とほとんど同じです。
(例)ファイルをアップロードする
#define INTERNET_OPEN_TYPE_PRECONFIG 0
#define INTERNET_DEFAULT_FTP_PORT 21
#define INTERNET_SERVICE_FTP 1
#define INTERNET_FLAG_TRANSFER_BINARY 2
#include "llmod.as"
ll_libload inet,"wininet.dll"
agent="ultimate"
server="ftp.xxx.xxx"
port=INTERNET_DEFAULT_FTP_PORT
user="xxx"
pass="xxx"
file="c:\\windows\\xxx.yyy" ; 転送元ファイル名
newfile="xyz.yyy" ; アップロード後のファイル名
getptr prm,agent
prm.1=INTERNET_OPEN_TYPE_PRECONFIG
prm.2=0
prm.3=0
prm.4=0
dllproc "InternetOpenA",prm,5,inet
hndl.0=dllret
prm.0=hndl.0
getptr prm.1,server
prm.2=port
getptr prm.3,user
getptr prm.4,pass
prm.5=INTERNET_SERVICE_FTP
prm.6=0
prm.7=0
dllproc "InternetConnectA",prm,8,inet
hndl.1=dllret
if hndl.1=0 : dialog"接続できませんでした" : end
; ファイル転送
prm.0=hndl.1 ; FTPセッションのハンドル
getptr prm.1,file ; 転送元ファイル
getptr prm.2,newfile ; 転送先ファイル
prm.3=INTERNET_FLAG_TRANSFER_BINARY ; 転送方法 INTERNET_FLAG_TRANSFER_BINARY=バイナリー
prm.4=0 ; コールバック関数に渡す32bit値(不要)
dllproc "FtpPutFileA",prm,5,inet
prm=hndl.1
dllproc "InternetCloseHandle",prm,1,inet
prm=hndl.0
dllproc "InternetCloseHandle",prm,1,inet
ll_libfree inet
dialog"転送完了しました"
07.リモートのファイル名を変更する (要llmod.as , WinInet.dll)
リモートに置かれているファイル名をFTPを使って変更してみましょう。
リネームコメントまでは今までとほぼ同じです。
(例)ファイル名置換
#define INTERNET_OPEN_TYPE_PRECONFIG 0
#define INTERNET_DEFAULT_FTP_PORT 21
#define INTERNET_SERVICE_FTP 1
#define INTERNET_FLAG_TRANSFER_BINARY 2
#include "llmod.as"
ll_libload inet,"wininet.dll"
agent="ultimate"
server="ftp.xxx.xxx"
port=INTERNET_DEFAULT_FTP_PORT
user="xxx"
pass="xxx"
file="xyz.yyy" ; 置換するファイル
newfile="abc.yyy" ; 置換後のファイル名
getptr prm,agent
prm.1=INTERNET_OPEN_TYPE_PRECONFIG
prm.2=0
prm.3=0
prm.4=0
dllproc "InternetOpenA",prm,5,inet
hndl.0=dllret
prm.0=hndl.0
getptr prm.1,server
prm.2=port
getptr prm.3,user
getptr prm.4,pass
prm.5=INTERNET_SERVICE_FTP
prm.6=0
prm.7=0
dllproc "InternetConnectA",prm,8,inet
hndl.1=dllret
if hndl.1=0 : dialog"接続できませんでした" : end
; ファイル名を変更する
prm.0=hndl.1
getptr prm.1,file
getptr prm.2,newfile
dllproc "FtpRenameFileA",prm,5,inet
prm=hndl.1
dllproc "InternetCloseHandle",prm,1,inet
prm=hndl.0
dllproc "InternetCloseHandle",prm,1,inet
ll_libfree inet
dialog"変更完了しました"