by mako » 2006年5月08日(月) 15:19
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
EditBox1にURLを入力後ボタン1でEditBox1の内容を取得し
EditBox2へ入力されたURLをそのまま出力しようと思ってるのですが、全て1行目のURLとなってしまいます。
1行のみの入力の場合は思った通りの動作を行うのですが複数行になると上手く動いてくれません。
※本来はそれぞれのURLへアクセス後、ソースから必要な個所だけ抜き出したいのですが簡略化しURLの表示としてあります。
①EditBox1に入力された文字がURL以外の場合のエラー処理のやり方
(EditBox2にURLではありません と出力したい)
②EditBox_GetLineで取得したaddressのバイト数の取得方法
(今は適当な数値を入力してます)
③希望する動作を行うにはどう修正したら良いのでしょうか?
②が原因とも思えないので・・・
度々お手数をお掛けしますが宜しくお願いします。
[code]
'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [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
[/code]