〜 ネットワーク編 〜

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

 TOPへ戻る

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

TOPへ戻る

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"作成完了しました"

TOPへ戻る

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"削除完了しました"

TOPへ戻る

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"削除完了しました"

TOPへ戻る

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"転送完了しました"

TOPへ戻る

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"変更完了しました"

TOPへ戻る