HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
1120
RadworpInternetFindNextFile ができない?6解決


Radworp

リンク

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



この記事に返信する


Kpan

リンク

2007/11/20(Tue) 21:18:01|NO.12525

FTPのことは知らないのでスクリプトは実行してませんが、InternetFindNextFileの
説明見ると、WIN32_FIND_DATA構造体で返ってくるのでは?
http://yokohama.cool.ne.jp/chokuto/urawaza/struct/WIN32_FIND_DATA.html



りさ

リンク

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



Radworp

リンク

2007/11/21(Wed) 00:15:23|NO.12532

Kpanさん、りささん、すばやい回答大変ありがとうございます。

Kpanさんご指摘ありがとうございます。
りささんサンプルスクリプト参考になりました。スクリプトは正常に実行されました。

8割がた理解できたと思います。

解決にしますが、1つお聞きしたいことがあります。

DLLの関数指定に null を指定したいときはどうすればよろしいのでしょうか?

"null" と記述するとスクリプトコンパイル時にエラーがでるようです・・・。

そもそも null という概念がよく理解できません。



tumo0b

リンク

2007/11/21(Wed) 00:38:16|NO.12533

nullってのは、「なにもない」という値のことだったような・・・



ANTARES

リンク

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



ANTARES

リンク

2007/11/21(Wed) 01:45:19|NO.12535

【修正前】
mes entry
【修正後】
if lpeek(buf,0)&FILE_ATTRIBUTE_DIRECTORY {
mes "["+entry+"]"
} else {
mes entry
}



ONION software Copyright 1997-2023(c) All rights reserved.