|
 |
|
2007/11/20(Tue) 17:55:44|NO.12517
こんにちわ。
hspinet の FTP関連関数は何かとフリーズが多かったりバグが多かったりするので
生意気にも自力で関数を組んでいます。
WinAPI 系や C/C++系 の知識はほとんどゼロに等しいので四苦八苦しています。
どなかた手を貸していただけると幸いです。
さて、カレントディレクトリ一覧のファイル一覧を取得したいのですが、
下記のスクリプトですと、わけのわからない文字が帰ってきてしまいます。
記述が間違っている部分がありましたら、教えていただけませんでしょうか?
また、FTP系ですので、お手数ではありますが
FTPサーバー,ID,パスワードをご用意していただく必要がございます。
#define INTERNET_OPEN_TYPE_DIRECT 1
#define INTERNET_INVALID_PORT_NUMBER 0
#define INTERNET_SERVICE_FTP 1
#define INTERNET_DEFAULT_FTP_PORT 21
#define INTERNET_FLAG_DONT_CACHE 4000000
#uselib "wininet.dll"
#cfunc global InternetOpenA "InternetOpenA" str,int,int,int,int
#cfunc global InternetConnect "InternetConnectA" int,str,int,str,str,int,int,int
#cfunc global FtpFindFirstFile "FtpFindFirstFileA" int,str,var,int,int
#func global FtpGetCurrentDirectory "FtpGetCurrentDirectoryA" int,sptr,var
#func global InternetFindNextFile "InternetFindNextFileA" int,var
#func InternetCloseHandle "InternetCloseHandle" int
pServer = "サーバー名"
pUser = "ユーザー名"
pPass = "パスワード"
onexit *bye
sdim Buf,1024
sdim Get,1024
hNet =InternetOpenA("WIN.SYSTEM.CALL",INTERNET_OPEN_TYPE_DIRECT,0,0,0)
hConnect = InternetConnect(hNet,pServer,INTERNET_DEFAULT_FTP_PORT,pUser,pPass,INTERNET_SERVICE_FTP,0,0)
FtpGetCurrentDirectory hConnect,Get,Size
hInet = FtpFindFirstFile(hConnect,"",Buf,INTERNET_FLAG_RELOAD|INTERNET_FLAG_DONT_CACHE,0)
InternetFindNextFile hInet,Get
dialog get
*bye
InternetCloseHandle hNet
end

| |
|
2007/11/20(Tue) 23:57:36|NO.12531
こんにちわ。
> 下記のスクリプトですと、わけのわからない文字が帰ってきてしまいます。
あたしもFTPは分からないのですが、面白そうなのでやってみました。
これでいいのかは分かりませんが、取得出来ているっぽいです。
#define global INTERNET_INVALID_PORT_NUMBER 0x00000000
#define global INTERNET_OPEN_TYPE_DIRECT 0x00000001
#define global INTERNET_SERVICE_FTP 0x00000001
#define global INTERNET_DEFAULT_FTP_PORT 0x00000015
#define global INTERNET_FLAG_DONT_CACHE 0x04000000
#define global INTERNET_FLAG_RELOAD 0x80000000
#define global MAX_PATH 0x00000104
#define global NULL 0
#define global WFD_CFILENAME 44 /* WFDのcFileNameの位置 */
#define global lengthOfWDF 80 /* WFDを格納する配列長(318バイト) */
#uselib "WININET.DLL"
#cfunc global InternetOpen "InternetOpenA" sptr, sptr, sptr, sptr, sptr
#cfunc global InternetConnect "InternetConnectA" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
#cfunc global InternetFindNextFile "InternetFindNextFileA" sptr, sptr
#func global InternetCloseHandle "InternetCloseHandle" sptr
#cfunc global FtpFindFirstFile "FtpFindFirstFileA" sptr, sptr, sptr, sptr, sptr
#func global FtpGetCurrentDirectory "FtpGetCurrentDirectoryA" sptr, sptr, sptr
#define SERVER "★★★" ;"サーバ名"
#define USER "★★★" ;"ユーザ名"
#define PASSWORD "★★★" ;"パスワード"
#module
#defcfunc Read array WIN32_FIND_DATA
sdim string, MAX_PATH
memcpy string, WIN32_FIND_DATA, MAX_PATH, 0, WFD_CFILENAME
return string
#global
onexit goto *Exit
dim buff, lengthOfWDF
sdim directory
size = 0
hInternet = InternetOpen("WIN.SYSTEM.CALL", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0)
mes "hInternet : " + hInternet
if (hInternet == NULL) {
goto *Exit
}
hFtpSession = InternetConnect(hInternet, SERVER, INTERNET_DEFAULT_FTP_PORT, USER, PASSWORD, INTERNET_SERVICE_FTP, 0, 0)
mes "hFtpSession : " + hFtpSession
if (hFtpSession == NULL) {
goto *Exit
}
FtpGetCurrentDirectory hFtpSession, varptr(directory), varptr(size)
mes "cur. dir. : " + directory
mes "size : " + size
hFind = FtpFindFirstFile(hFtpSession, "", varptr(buff), (INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE), 0)
mes "hFind : " + hFind
if (hFind == NULL) {
goto *Exit
}
repeat -1, 1
mes "enum files : " + Read(buff)
if (InternetFindNextFile(hFind, varptr(buff)) == NULL) {
title "" + (cnt) + "files"
break
}
loop
stop
*Exit
if (hFind) {
InternetCloseHandle hFind
hFind = NULL
}
if (hFtpSession) {
InternetCloseHandle hFtpSession
hFtpSession = NULL
}
if (hInternet) {
InternetCloseHandle hInternet
hInternet = NULL
}
end

| |
|
2007/11/21(Wed) 00:15:23|NO.12532
Kpanさん、りささん、すばやい回答大変ありがとうございます。
Kpanさんご指摘ありがとうございます。
りささんサンプルスクリプト参考になりました。スクリプトは正常に実行されました。
8割がた理解できたと思います。
解決にしますが、1つお聞きしたいことがあります。
DLLの関数指定に null を指定したいときはどうすればよろしいのでしょうか?
"null" と記述するとスクリプトコンパイル時にエラーがでるようです・・・。
そもそも null という概念がよく理解できません。
|
|
2007/11/21(Wed) 00:38:16|NO.12533
nullってのは、「なにもない」という値のことだったような・・・
|
|
2007/11/21(Wed) 01:31:20|NO.12534
>DLLの関数指定に null を指定したいときはどうすればよろしいのでしょうか?
0を指定します。
先を越されてしまいましたが、エラーチェックは少し参考になるかも。
「FtpGetCurrentDirectory hConnect,Get,Size」以降を以下に置き換えてください。
(一部再定義していますので、重複するものは削除してください)
#define INTERNET_FLAG_RELOAD 0x80000000 // retrieve the original item
#define INTERNET_FLAG_DONT_CACHE 0x4000000
#define FILE_ATTRIBUTE_DIRECTORY 0x00000010
#define ERROR_NO_MORE_FILES 18
#cfunc global FtpGetCurrentDirectory "FtpGetCurrentDirectoryA" int,var,var
#cfunc global InternetFindNextFile "InternetFindNextFileA" int,var
#uselib "kernel32.dll"
#cfunc global GetLastError "GetLastError"
size=1024
if FtpGetCurrentDirectory(hConnect,Get,Size)==0 {
dialog "FtpGetCurrentDirectory error.": goto *bye
}
mes "current directory="+get
hFind = FtpFindFirstFile(hConnect,"",Buf,INTERNET_FLAG_RELOAD|INTERNET_FLAG_DONT_CACHE,0)
if hFind==0: dialog "FtpFindFirstFile error.": goto *bye
sdim entry,260
repeat
memcpy entry,buf,260,0,44
mes entry
flg=InternetFindNextFile( hFind,buf)
if flg==0 {
er=GetLastError()
if er==ERROR_NO_MORE_FILES: break
dialog "InternetFindNextFile error "+er
goto *bye
}
loop
stop
*bye
InternetCloseHandle hFind
InternetCloseHandle hConnect
InternetCloseHandle hNet
end

| |
|
2007/11/21(Wed) 01:45:19|NO.12535
【修正前】
mes entry
【修正後】
if lpeek(buf,0)&FILE_ATTRIBUTE_DIRECTORY {
mes "["+entry+"]"
} else {
mes entry
}
|
|