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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
1205
Ponyo[wininet] 画像のファイルデータが異なってしまう5解決


Ponyo

リンク

2019/12/5(Thu) 22:07:47|NO.88998


// *** 必要となるAPIや定数の定義 *** // #uselib "wininet.dll" #cfunc InternetOpen "InternetOpenA" sptr, int, sptr, sptr, int #cfunc InternetOpenUrl "InternetOpenUrlA" int, str, sptr, int, int, int #func InternetQueryDataAvailable "InternetQueryDataAvailable" int, int, int, int #cfunc InternetReadFile "InternetReadFile" int, int, int, int #func InternetCloseHandle "InternetCloseHandle" int #cfunc InternetConnect "InternetConnectA" int, str, int, sptr, sptr, int, int, int #define INTERNET_OPEN_TYPE_DIRECT 1 #define INTERNET_OPTION_CONNECT_TIMEOUT 2 #define INTERNET_OPTION_HTTP_DECODING 65 #define INTERNET_DEFAULT_HTTPS_PORT 443 #define INTERNET_SERVICE_HTTP 3 #define INTERNET_FLAG_RELOAD 0x80000000 #define INTERNET_FLAG_SECURE 0x00800000 #define INTERNET_FLAG_NO_CACHE_WRITE 0x04000000 #define INTERNET_FLAG_DONT_CACHE INTERNET_FLAG_NO_CACHE_WRITE #define INTERNET_FLAG_IGNORE_CERT_DATE_INVALID 0x00002000 #define INTERNET_FLAG_IGNORE_CERT_CN_INVALID 0x00001000 #enum HTTP_QUERY_MIME_VERSION = 0 #enum HTTP_QUERY_CONTENT_TYPE #enum HTTP_QUERY_CONTENT_TRANSFER_ENCODING #enum HTTP_QUERY_CONTENT_ID #enum HTTP_QUERY_CONTENT_DESCRIPTION #enum HTTP_QUERY_CONTENT_LENGTH #enum HTTP_QUERY_CONTENT_LANGUAGE #enum HTTP_QUERY_ALLOW #enum HTTP_QUERY_PUBLIC #enum HTTP_QUERY_DATE #enum HTTP_QUERY_EXPIRES #enum HTTP_QUERY_LAST_MODIFIED #enum HTTP_QUERY_MESSAGE_ID #enum HTTP_QUERY_URI #enum HTTP_QUERY_DERIVED_FROM #enum HTTP_QUERY_COST #enum HTTP_QUERY_LINK #enum HTTP_QUERY_PRAGMA #enum HTTP_QUERY_VERSION #enum HTTP_QUERY_STATUS_CODE #enum HTTP_QUERY_STATUS_TEXT #enum HTTP_QUERY_RAW_HEADERS #enum HTTP_QUERY_RAW_HEADERS_CRLF #enum HTTP_QUERY_CONNECTION #enum HTTP_QUERY_ACCEPT #enum HTTP_QUERY_ACCEPT_CHARSET #enum HTTP_QUERY_ACCEPT_ENCODING #enum HTTP_QUERY_ACCEPT_LANGUAGE #enum HTTP_QUERY_AUTHORIZATION #enum HTTP_QUERY_CONTENT_ENCODING #enum HTTP_QUERY_FORWARDED #enum HTTP_QUERY_FROM #enum HTTP_QUERY_IF_MODIFIED_SINCE #enum HTTP_QUERY_LOCATION #enum HTTP_QUERY_ORIG_URI #enum HTTP_QUERY_REFERER #enum HTTP_QUERY_RETRY_AFTER #enum HTTP_QUERY_SERVER #enum HTTP_QUERY_TITLE #enum HTTP_QUERY_USER_AGENT #enum HTTP_QUERY_WWW_AUTHENTICATE #enum HTTP_QUERY_PROXY_AUTHENTICATE #enum HTTP_QUERY_ACCEPT_RANGES #enum HTTP_QUERY_SET_COOKIE #enum HTTP_QUERY_COOKIE #enum HTTP_QUERY_REQUEST_METHOD #define HTTP_QUERY_MAX 45 #define HTTP_QUERY_CUSTOM 65535 #define HTTP_QUERY_FLAG_REQUEST_HEADERS 0x80000000 #define HTTP_QUERY_FLAG_SYSTEMTIME 0x40000000 #define HTTP_QUERY_FLAG_NUMBER 0x20000000 #define HTTP_QUERY_FLAG_COALESCE 0x10000000 #define HTTP_QUERY_MODIFIER_FLAGS_MASK (HTTP_QUERY_FLAG_REQUEST_HEADERS|HTTP_QUERY_FLAG_SYSTEMTIME|HTTP_QUERY_FLAG_NUMBER|HTTP_QUERY_FLAG_COALESCE) #define HTTP_QUERY_HEADER_MASK (HTTP_QUERY_MODIFIER_FLAGS_MASK) #define global METHOD_GET 0 #define global METHOD_POST 1 #define global METHOD_DELETE 2 #define global METHOD_PUT 3 #define global FORMAT_JSON 0 #define global FORMAT_XML 1 // *** ウィンドウの作成や設定 *** // screen 0, 900, 600, SCREEN_HIDE title "ViewOneEight" // *** 最終処理 *** // gsel 0, 1 hInternet = InternetOpen( null, INTERNET_OPEN_TYPE_DIRECT, null, null, 0 ) if ( hInternet == null ) { dialog "インターネットの接続に失敗しました", 1 end } hService = InternetOpenUrl( hInternet, "https://www.onionsoft.net/hsp/v36/doclib/hsp3ttl.jpg", null, 0, INTERNET_FLAG_RELOAD, 0 ) if ( hService == null ) { dialog "URLのリクエストに失敗しました", 1 end } InternetQueryDataAvailable hService, varptr(availableSize), 0, 0 sdim responseBuffer, ( availableSize + 1 ) responseBody = "" repeat response = InternetReadFile( hService, varptr(responseBuffer), availableSize, varptr(hSize) ) if ( response == 0 ) { break } if ( hSize < 1 ) { break } responseBody += strmid( responseBuffer, 0, hSize ) await 0 loop InternetCloseHandle hService InternetCloseHandle hInternet memfile responseBody picload "MEM:a.jpg" stop
WINAPIにてファイル(画像)を表示するプログラムを開発する予定なのですが、
応答なしとなってしまいます。どうすれば問題を解決できるのでしょうか?
調べたところ、APIは正常に動作しましたが、リクエストするファイルのデータが異なっていました。
https://www.onionsoft.net/hsp/v36/doclib/hsp3ttl.jpg
  https://www.onionsoft.net/hsp/v36/doclib/hsp3ttl.txt としてメモ帳かなんかで閲覧して比較しました。



この記事に返信する


MillkeyStars

リンク

2019/12/6(Fri) 08:40:53|NO.89003

【間違っているところ抜粋】

InternetQueryDataAvailable hService, varptr(availableSize), 0, 0 sdim responseBuffer,10240 //←一時データ領域(バイナリ) を 10KB で作成 sdim responseBodyTemp,1024000 //←ファイルのデータバッファを作成(1MB)として仮作成(1MBより大きい場合、repeat 内部で拡張してください) responseBody = "" offset = 0 repeat response = InternetReadFile( hService, varptr(responseBuffer), availableSize, varptr(hSize) ) if ( response == 0 ) { break } if ( hSize < 1 ) { break } memcpy responseBodyTemp,responseBuffer,hsize,offset offset += hSize // responseBody += strmid( responseBuffer, 0, hSize ) await 0 loop InternetCloseHandle hService InternetCloseHandle hInternet //ここで改めて responseBody にデータを入れている( //resposeBodyTemp に直接入るデータ量であれば直接 responseBodyTemp を memfile で指定しても良い // sdim responseBody,offset // memcpy responseBody,responseBodyTemp,offset // memfile responseBody memfile responseBodyTemp,0,offset picload "MEM:a.jpg" stop
strmid は、テキスト専用命令です。バイナリデータを扱うことができませんので、バッファサイズがおかしくなります。



Ponyo

リンク

2019/12/6(Fri) 13:10:12|NO.89005

>strmid は、テキスト専用命令です。
>バイナリデータを扱うことができませんので、バッファサイズがおかしくなります。
あっ、そうですね。画像を一般的な文字列型変数で使用していました(^^;)
バイナリデータに差し替えたことで、正常に動作しました。
スクリプトを参考にさせて頂きます。MillkeyStarsさんありがとうございました。



Ponyo

リンク

2019/12/6(Fri) 20:25:08|NO.89008

申し訳ないですが、もう一つ質問させていただきます。

画像とかのバイナリではない一般的な文字列型のページ(API)で取得する予定なのですが、
テキスト版で利用する InternetReadFile関数 は正常なのですが、文字化けする場合があります。

https://ext.nicovideo.jp/api/getthumbinfo/sm9
↑ブラウザでは正常に文字が描画されてますが、取得した内容(responseBody)では文字化けしちゃいます。

responseBody をどう変換すれば文字化けせずに取得できるのでしょうか?
二度も質問すいません(^^;)



MillkeyStars

リンク

2019/12/7(Sat) 12:47:18|NO.89015

ANSI か Unicode のどちらかしかないので、それをまず変換。
あとは、URL 先の xml・html などの文字コードタグを確認して、その国の文字コードに変換。

追加質問は、新しいスレッドにするといいよ。解決にすると見ないから気を付けて。



Ponyo

リンク

2019/12/7(Sat) 19:11:19|NO.89017

>追加質問は、新しいスレッドにするといいよ。解決にすると見ないから気を付けて。
そうですね。めんどくさいとも思ったのですが、
いちいちスレッドを立てることでそれはそれで問題が起きるかも。と考えたものでして、
深く考えすぎました。すいません(^^;)

>ANSI か Unicode のどちらかしかないので、それをまず変換。
文字コードの変換でしたが。了解しました。
ありがとうございます。



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