御指導願えませんか?

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
メッセージ
作成者
mako

御指導願えませんか?

#1 投稿記事 by mako »

皆様初めましてmakoと言います。

初めてRADツールを使ってみて、いきなりよくわからない事態に陥ってしまい
教えて頂こうと思い書き込みさせて頂きました。

・やりたい内容
EditBox1とEditBox2を設置してCommandButton1をクリックした時にEditBox1の内容(複数行のURL)を取り込んで、InternetReadFile関数で読み込んだ後に中から必要な行だけを抜き出してEditBox2に表示後CommandButton1をクリックしたらクリップボードにEditBox2で表示した内容をコピーしたいと思ってるのですが上手く行きません。

どの様にしたら良いのでしょうか?

①複数行の入力があった時に全部で何行なのかどうやって調べたら良いのでしょうか?
 又、各行を変数に取り込むにはどうしたら良いのか?
 (現状手付かずになってます)

②EditBox1の内容を1行だけにして取り込んでみてもInternetReadFileの個所でエラーになってしまいます。
変数を使用したInternetReadFileは使えないのでしょうか?
(過去ログ等では直接http://・・・と書いてありますし)

③"***"を含むと言った検索は文字列を検索しているのですが"***"を含む行をそのまま変数に取り込む様にするにはどうしたら良いのでしょうか?

④③で取り込んだ1行をEditBox2に表示したいのですが、SendMessageの使い方が良くわかっていません。

⑤クリップボードへの取り込みは過去ログやサンプルからなんとか作れそうな気はするのですが、未だコードは入ってません。

長々とわかりにくい文章ですいません。

[/code]
'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd

' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。

Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent As BytePtr,_
ByVal lAccessType As Long, ByVal sProxyName As BytePtr,ByVal sProxyBypass As BytePtr,_
ByVal lFlags As Long) As Long
Declare Function InternetOpenUrl Lib "wininet.dll" Alias "InternetOpenUrlA" (ByVal hInternetSession As Long,_
ByVal sUrl As BytePtr,ByVal sHeaders As BytePtr, ByVal lHeadersLength As Long, _
ByVal lFlags As Long, ByVal lContext As Long) As Long
Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, ByVal sBuffer As BytePtr,_
ByVal lNumBytesToRead As Long,lNumberOfBytesRead As Long) As Integer
Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Integer


Dim url As Long
Dim open As Long
Dim buffer As String
Dim Size As Long
Dim html As String

Dim SearchWord As String
Dim i As Long
Dim Gurl as string

Dim ourl As String
Dim length As Long


'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数

Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。

' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function


'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。

Sub MainWnd_Destroy()
yousend_DestroyObjects()
PostQuitMessage(0)
End Sub

Sub MainWnd_CommandButton1_Click()

'本文テキスト データを格納するためのバッファ領域を確保
Dim hEdit As HWND
hEdit=GetDlgItem(hMainWnd,EditBox1) 'EditBox1のハンドル
length=GetWindowTextLength(hEdit)
ourl=ZeroString(length+1)
GetWindowText(hEdit, ourl, length+1)
'EditBox1から取得した文字列を保存しようとするとNULLが入ってしまう
'最後のNULLを取る
ourl=Left$(ourl,InStr(1,ourl,Chr$(0))-1)
ourl=Chr$(34)+ourl+Chr$(34)

buffer=ZeroString(1001)
open=InternetOpen(0,0,0,0,0)
url=InternetOpenUrl(open,ourl,0,0,0,0)
Size=Len(buffer)
Do
InternetReadFile(url,buffer,1000,VarPtr(Size))
html=html+Left$(buffer,InStr(1,buffer,Chr$(0))-1)
Loop While Size<>0
InternetCloseHandle(open)

SearchWord="/file/"

i=1
Do
i=InStr(i, buffer, SearchWord)
If i=0 Then
Exit Do
End If


' buf=Str$(i)+"文字目に、文字列「"+SearchWord+"」があります。"
' MessageBox(0,buf,"目的の場所",MB_OK)

Gurl=Mid$(buffer,i,63)
i=0

Loop

SendMessage(EditBox2,Gurl) '取りあえず書いてあるだけです^^;

End Sub

コード: 全て選択

7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

Re: 御指導願えませんか?

#2 投稿記事 by 7 »

> 皆様初めましてmakoと言います。
初めまして。7と言います。

> 1.複数行の入力があった時に全部で何行なのかどうやって調べたら良いのでしょうか?
エディットボックスに対してEM_GETLINECOUNTを送信することで行数を取得することができます。 >  又、各行を変数に取り込むにはどうしたら良いのか?
>  (現状手付かずになってます)
上記と同じようにEM_GETLINEを送信することで一行だけ取得することができます。 > 2.EditBox1の内容を1行だけにして取り込んでみてもInternetReadFileの個所でエラーになってしまいます。
> 変数を使用したInternetReadFileは使えないのでしょうか?
> (過去ログ等では直接http://・・・と書いてありますし)
アドレスをダブルコーテーションで挟んでいるのがエラーの原因だと思います。

> 3."***"を含むと言った検索は文字列を検索しているのですが"***"を含む行をそのまま変数に取り込む様にするにはどうしたら良いのでしょうか?
効率が悪いかもしれませんけど、まずエディットボックスの行数を取得して、For文で0から行数まで各行の文字列を取得しながらInStr関数で"***"を含むかどうか検索したらどうでしょう。
"***"が見つかった時点でループを抜けると、カウンタ変数には見つかった行が、取得した行の文字列には"***"が含まれています。(意味不明な説明かも...) > 4. 3で取り込んだ1行をEditBox2に表示したいのですが、SendMessageの使い方が良くわかっていません。
SendMessage()関数を使うならWM_SETTEXTを送信するんですけど、SetWindowText()関数というのがあります。

コード: 全て選択

SetWindowText(ウィンドウのハンドル,設定したい文字列)
> 5.クリップボードへの取り込みは過去ログやサンプルからなんとか作れそうな気はするのですが、未だコードは入ってません。 エディットボックス1に

コード: 全て選択

a/file/
b/file/
c
d/file/
なんて自分で書いてコマンドボタンを押すとエディットボックス2に

コード: 全て選択

a/file/
b/file/
d/file/

と出力されます。
mako

Re: 御指導願えませんか?

#3 投稿記事 by mako »

> 初めまして。7と言います。
初めまして7さん。

早速の御指導有難う御座います。
しかも、一気に疑問点を解消して頂いて感激です。
(ソースの投稿方法も間違えてたみたいで・・・恥)

早速7さんのコードを参考に再挑戦してみたいと思います。
mako

Re: 御指導願えませんか?

#4 投稿記事 by mako »

7さんにお尋ねしたいのですが、クリップボードの関数で
ボタン2を追加してクリップボード関数を入れるとコンパイル時に1行目で "Function" の使い方が不正ですとエラーになってしまいます。
(2回エラーが表示されます)

コード: 全て選択


 Function SetClipboardText(ByVal hWnd As HWND,ByVal lpString As BytePtr) As BOOL
Dim hMem As HGLOBAL
Dim lpStr As BytePtr
    SetClipboardText=FALSE
    hMem=GlobalAlloc(GMEM_DDESHARE or GHND,lstrlen(lpString)+1)
    If hMem Then
        lpStr=GlobalLock(hMem)
        If lpStr Then
            lstrcpy(lpStr,lpString)
            GlobalUnlock(hMem)
            If OpenClipboard(hWnd) Then
                EmptyClipboard()
                SetClipboardData(CF_TEXT,hMem)
                CloseClipboard()
                SetClipboardText=TRUE
            End If
        End If
        GlobalFree(hMem)
    End If
End Function

'使い方
SetClipboardText(hMainWnd,"SetClipboardText()関数")
ABのバージョンは4.24です。

又、ボタンにビットマップの画像を使うにはどの様にしたら良いのでしょうか?
(ビットマップをクリックした時にxxxの動作でも良いのですが)
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

Re: 御指導願えませんか?

#5 投稿記事 by 7 »

> 7さんにお尋ねしたいのですが、クリップボードの関数で
> ボタン2を追加してクリップボード関数を入れるとコンパイル時に1行目で "Function" の使い方が不正ですとエラーになってしまいます。
> (2回エラーが表示されます)
ぅ~ん...。ソースを見たら原因が分かるかもしれません。 > 又、ボタンにビットマップの画像を使うにはどの様にしたら良いのでしょうか?
WM_PAINTを受信した時に描けばいいのかと思ったらダメで、サブクラス化して色々試したんですけど、面倒です。
動的サブクラス化、というのを参考にしようとしたんですけどよく分からず、ボタンが押され時、フォーカスを持った時などの描写も自分でしなければいけません...。

> (ビットマップをクリックした時にxxxの動作でも良いのですが)
ビットマップボタンじゃなくても良いなら簡単ですね。
ボタンを「オーナー描写」にしてビットマップを描写するか、イメージボックスを「通知」にして「タイプ」を「ビットマップ」、読み込みは「リソース」にすればオーケーです。
イメージボックスが一番簡単じゃないでしょうか。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#6 投稿記事 by イグトランス »

ボタンにビットマップを表示させるには、単にボタンへBM_SETIMAGEを送る方法はどうでしょう。
#私は使ったことありませんが。
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

#7 投稿記事 by 7 »

> ボタンにビットマップを表示させるには、単にボタンへBM_SETIMAGEを送る方法はどうでしょう。
単にBM_SETIMAGEを送信して出来ました。
コマンドボタンの「ビットマップ」にチェックを入れて下さい。 分かってみればすっごい簡単ですね。
サブクラスで随分と悩んでたのが馬鹿みたいです。(サブクラスの勉強にはなりましたけど)
mako

#8 投稿記事 by mako »

イグトランスさん、7さん有難うございます。

7さん・・・す、すいません。
クリップボード関数のエラーは
Sub MainWnd_CommandButton2_Click()の下にそのまま関数を書いてました。
エラーが出るのも当然ですよね。。。

SetClipboardText関数の使用方法なのですが
ボタン1クリックの際にEditBox2へ表示した内容(strBuf)をそのままボタン2クリック時に使う事は出来ないのでしょうか?
(再度EditBox2の内容を取り込んで・・・と言った作業が必要になるのですか?)

コード: 全て選択


Sub MainWnd_CommandButton1_Click()
'途中省略
    :
'EditBox2へ出力
    SetWindowText(GetDlgItem(hMainWnd,EditBox2),strBuf)
End Sub

Sub MainWnd_CommandButton2_Click()

SetClipboardText(hMainWnd,strBuf)

End Sub

> 単にBM_SETIMAGEを送信して出来ました。
> コマンドボタンの「ビットマップ」にチェックを入れて下さい。

コード: 全て選択


'HBITMAP型グローバル変数 hBitmap の宣言
Dim hBitmap As HBITMAP

'ウィンドウが作られた時
hBitmap=LoadImage(GetModuleHandle(0),IDB_BITMAP1,IMAGE_BITMAP,0,0,LR_DEFAULTSIZE)
SendDlgItemMessage(hMainWnd,CommandButton1,BM_SETIMAGE,IMAGE_BITMAP,hBitmap)

'ウィンドウが破棄される時
DeleteObject(hBitmap)
↑のコードなのですが、そのままでは使えないのでしょうか?!
IDB_BITMAP1を既に追加してるのにボタン1には変化が何もありません。
コードを書く場所を色々と変えてみましたが何も変わらずの状態です。
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

#9 投稿記事 by 7 »

> ボタン1クリックの際にEditBox2へ表示した内容(strBuf)をそのままボタン2クリック時に使う事は出来ないのでしょうか?
String型変数strBufをグローバル変数にしてしまえば楽かな、なんて思ってしまうんですけど、どれだけの関数がどういう風にグローバル変数を処理しているのか把握するのが面倒なので、再度EditBox2の内容を取り込んで、と言った作業の方が楽だと思います。

> IDB_BITMAP1を既に追加してるのにボタン1には変化が何もありません。
> コードを書く場所を色々と変えてみましたが何も変わらずの状態です。
「ウィンドウが作られた時」と書かれたコードはMainWnd_Createプロシージャ内に書いて下さい。
同様に「ウィンドウが破棄される時」と書かれたコードはMainWnd_Destroyプロシージャ内に書いて下さい。
mako

#10 投稿記事 by mako »

> String型変数strBufをグローバル変数にしてしまえば楽かな、なんて思ってしまうんですけど、どれだけの関数がどういう風にグローバル変数を処理しているのか把握するのが面倒なので、再度EditBox2の内容を取り込んで、と言った作業の方が楽だと思います。
仰ってる内容が???ですが、再度取り込んだ方が良いみたいなのでそうします。
素人考えで普通に使えるのではないかと思ってしまったもので。

> 「ウィンドウが作られた時」と書かれたコードはMainWnd_Createプロシージャ内に書いて下さい。
すみません、何処にMainWnd_Createプロシージャがあるのでしょうか?
追加するのでしょうか?

> 同様に「ウィンドウが破棄される時」と書かれたコードはMainWnd_Destroyプロシージャ内に書いて下さい。

コード: 全て選択


Sub MainWnd_Destroy()
	test_DestroyObjects()
	'ウィンドウが破棄される時
	DeleteObject(hBitmap)
	PostQuitMessage(0)
End Sub
MainWnd_Createプロシージャが無かったのでMainWnd_Destroyプロシージャの方だけ取り合えず追記したのですが、これで良いのでしょうか?

追伸
RADツール関連の事はどうやって調べたら良いのでしょうか?
ヘルプセンター内のRADツールのみでは全然わからないので・・・
お勧めのHP等があれば紹介して頂けると助かります。
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

#11 投稿記事 by 7 »

> すみません、何処にMainWnd_Createプロシージャがあるのでしょうか?
> 追加するのでしょうか?
RADツールでメインウィンドウを右クリックするとポップアップメニューが表示されるので「イベントコード」を選択して次に「ウィンドウ作成時」を選択するとMainWnd_Createプロシージャを生成してくれます。

> MainWnd_Createプロシージャが無かったのでMainWnd_Destroyプロシージャの方だけ取り合えず追記したのですが、これで良いのでしょうか?
それで構いません。

> RADツール関連の事はどうやって調べたら良いのでしょうか?
> ヘルプセンター内のRADツールのみでは全然わからないので・・・
RADツールでこれがしたいんだけど、って問題を提示して貰わないと使って覚える、としか言いようが無いですね...。

> お勧めのHP等があれば紹介して頂けると助かります。
古い記事ですがhttp://www.activebasic.com/article/rad.htmというのがあります。
ユーザーさんのサイトへのリンクが以前はトップページで紹介されていたんですが今は無いですね。
mako

#12 投稿記事 by mako »

7さん、深夜遅くにレス頂いてたのですね
有難う御座います。

> > RADツール関連の事はどうやって調べたら良いのでしょうか?
> > ヘルプセンター内のRADツールのみでは全然わからないので・・・
> RADツールでこれがしたいんだけど、って問題を提示して貰わないと使って覚える、としか言いようが無いですね...。
ちょっと言葉が思いつかないのですが、
例えばプログレスバーを追加したいと思った場合等
処理が完了するまでの表示方法をどうすれば動作するのか検討もつきません。

こちらに書き込みをさせて頂いて答えて頂く事で時間も掛らないし、何も苦労はないのですが、それだと進歩が無いと言うか・・・・
その都度皆さんの手を煩わしてしまうので。
(実際にお聞きしてるのに偉そうな事を書いてすいません)
それでRADツールについて説明してるHP等があればと思ってお尋ねしてみた次第です。

紹介して頂いたHPもちょっと簡単に書きすぎてて、私が希望する内容とは少し違っていました。

後から後から質問して申し訳無いのですが
引数の設定が同じAPIでも異なるのは何故なのでしょう?

コード: 全て選択


Declare Function InternetReadFile Lib "wininet" (
    ByVal hFile As HINTERNET,
    ByVal sBuffer As BytePtr,
    ByVal lNumBytesToRead As DWord,
    ByVal lNumberOfBytesRead As DWORD_PTR) As BOOL

		↑
		↓

Declare Function InternetReadFile Lib "wininet.dll" (
    ByVal hFile As Long,
    ByVal sBuffer As BytePtr,
    ByVal lNumBytesToRead As Long,
    lNumberOfBytesRead As Long) As Integer
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

#13 投稿記事 by 7 »

> 7さん、深夜遅くにレス頂いてたのですね
最近寝るのが随分と遅くなってしまいまして...。

> 例えばプログレスバーを追加したいと思った場合等
> 処理が完了するまでの表示方法をどうすれば動作するのか検討もつきません。
ActiveBasicのRADツールはウィンドウを作るだけ、っていう感じなのでそういう処理はユーザーが書きます。
「表示」「プロジェクトオプション」「Win32API」「コモンコントロールを使用する」にチェックを入れて、プログレスバーを配置したら、色んなイベント時にプログレスバーに対し、PBM_***をSendMessage()関数で送信します。
例えばプログレスバーの範囲を設定する場合は、PBM_SETRANGEを送信します。 処理を始める前にプログレスバーの位置と範囲と進行幅を設定し、処理が一つ終わる度に進行幅を増加させるといった感じです。
幅を 0,10、位置を 0、進行幅を 1、とした場合、ProgressBar_StepIt()関数を10回繰り返すとプログレスバーが満タンになります。
分かり辛い説明かもしれません...。

> 引数の設定が同じAPIでも異なるのは何故なのでしょう?
ActiveBasicの変数の型の書き方が以前と異なったから、引数の設定も異なるんじゃないでしょうか。
あと同じ関数名で引数の数や型が違う場合も引数の設定は異なります。
mako

#14 投稿記事 by mako »

> 最近寝るのが随分と遅くなってしまいまして...。
何だか申し訳無いです。。。

> ActiveBasicのRADツールはウィンドウを作るだけ、っていう感じなのでそういう処理はユーザーが書きます。
どうやらちょっと私はRADツールに対して過度な期待と勘違いをしてたみたいですね・・・。

> 「表示」「プロジェクトオプション」「Win32API」「コモンコントロールを使用する」にチェックを入れて、プログレスバーを配置したら、色んなイベント時にプログレスバーに対し、PBM_***をSendMessage()関数で送信します。
> 例えばプログレスバーの範囲を設定する場合は、PBM_SETRANGEを送信します。
例えで書いたつもりだったのですが、自作関数まで・・・
折角書いて頂いたのですが使用方法がよく理解出来ません。。。
先で理解出来る様になった時に参考にさせて頂きます。

> ActiveBasicの変数の型の書き方が以前と異なったから、引数の設定も異なるんじゃないでしょうか。
> あと同じ関数名で引数の数や型が違う場合も引数の設定は異なります。
ABのバージョンが変わると引数の設定まで変わるんですね!
勉強になりました。
mako

#15 投稿記事 by mako »

EditBox1にURLを入力後ボタン1でEditBox1の内容を取得し
EditBox2へ入力されたURLをそのまま出力しようと思ってるのですが、全て1行目のURLとなってしまいます。
1行のみの入力の場合は思った通りの動作を行うのですが複数行になると上手く動いてくれません。

※本来はそれぞれのURLへアクセス後、ソースから必要な個所だけ抜き出したいのですが簡略化しURLの表示としてあります。

①EditBox1に入力された文字がURL以外の場合のエラー処理のやり方
 (EditBox2にURLではありません と出力したい)
②EditBox_GetLineで取得したaddressのバイト数の取得方法
 (今は適当な数値を入力してます)
③希望する動作を行うにはどう修正したら良いのでしょうか?
 ②が原因とも思えないので・・・
 
度々お手数をお掛けしますが宜しくお願いします。

コード: 全て選択


'-----------------------------------------------------------------------------
'  イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd

'ネット関係
Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent As BytePtr,_
	ByVal lAccessType As Long, ByVal sProxyName As BytePtr,ByVal sProxyBypass As BytePtr,_
	ByVal lFlags As Long) As Long
Declare Function InternetOpenUrl Lib "wininet.dll" Alias "InternetOpenUrlA" (ByVal hInternetSession As Long,_
	ByVal sUrl As BytePtr,ByVal sHeaders As BytePtr, ByVal lHeadersLength As Long, _
	ByVal lFlags As Long, ByVal lContext As Long) As Long
Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, ByVal sBuffer As BytePtr,_
	ByVal lNumBytesToRead As Long,lNumberOfBytesRead As Long) As Integer
Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Integer

'行のカウント
Function EditBox_GetLineCount(ByVal hWnd As HWND)
    EditBox_GetLineCount=SendMessage(hWnd,EM_GETLINECOUNT,NULL,NULL)
End Function

'1行の取得
Function EditBox_GetLine(ByVal hWnd As HWND,ByVal nIndex As Long) As BytePtr
Dim length[2] As Long
    'nIndex が全体の何バイト目なのかを格納。
    length[0]=SendMessage(hWnd,EM_LINEINDEX,nIndex,NULL)

    If length[0]<>-1 Then
        'nIndex の次の行が全体の何バイト目なのかを格納。
        length[1]=SendMessage(hWnd,EM_LINEINDEX,nIndex+1,NULL)
        If length[1]<>-1 Then
            'nIndex のバイト数を格納。
            length[2]=length[1]-length[0]
        Else
            'nIndex のバイト数を格納。
            length[2]=GetWindowTextLength(hWnd)-length[0]
        End If
    End If

    EditBox_GetLine=calloc(length[2]+1)
    If length[2] Then
        SetWord(EditBox_GetLine,length[2]+1)
        EditBox_GetLine[SendMessage(hWnd,EM_GETLINE,nIndex,EditBox_GetLine)]=0
    End If
End Function


'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数

Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
	' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。

	' イベントプロシージャの呼び出しを行います。
	MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function


'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。

Sub MainWnd_Destroy()
	net_DestroyObjects()
	PostQuitMessage(0)
End Sub

'netの処理
Sub MainWnd_CommandButton1_Click()

	Dim hEdit As HWND
	Dim cnt As Long
	Dim address As BytePtr
	Dim buf As String
	Dim html As String
	Dim length As Long, open As Long, bufSize As Long, url As Long
	Dim strBuf As String
		
		 hEdit=GetDlgItem(hMainWnd,EditBox1)
		 For cnt=1 To EditBox_GetLineCount(hEdit)
	     address=EditBox_GetLine(hEdit,cnt)
		 length=48'Len(MakeStr(address))+1
	   	address=calloc(length+2)'+2はダブルコーテーションの為
    	GetWindowText(hEdit,address,length)

	buf=ZeroString(1001)
	open=InternetOpen(0,0,0,0,0)
	If open=NULL Then 
	Exit Function
	End If
	
	url=InternetOpenUrl(open,address,0,0,0,0)
	If url=NULL Then
		InternetCloseHandle(open)
		Exit Function
	End If
	bufSize=Len(buf)
'	free(address)

Do
	InternetReadFile(url,buf,1000,VarPtr(bufSize))
	html=html+Left$(buf,InStr(1,buf,Chr$(0))-1)
Loop While bufSize<>0
InternetCloseHandle(open)

	strBuf=strBuf+MakeStr(address)+Ex"\r\n"
	free(address)
	Next

SetWindowText(GetDlgItem(hMainWnd,EditBox2),strBuf)

End Sub
返信する