|
分類:[.NET 全般]
いつもお世話になります。
現在、VB6で作られたプログラムを.Netに置き換える作業を行っているのですが、 そのプログラムの中でInternetReadFileメソッドを使用したプログラムが あるのですが、InternetReadFileメソッドにてSystem.AccessViolationExceptionが 起こる原因として考えられるものはどういったものがあるでしょうか? AccessViolationExceptionの詳細な情報を得ることが出来ずに 作業が難航しています。
●環境
■InternetReadFileメソッドを使用しているプログラム側 ・OS :Windows Server2012 R2 Standard(64Bit) ・開発環境:Visual Studio 2015 ・ビルド環境 .Net Framework4.6 .Any CPUでビルド
■要求先 ・OS :Windows Server2012 R2 Standard(64Bit) ・IIS :Version 8.5.9600
●エラー詳細 System.AccessViolationException はハンドルされませんでした。 Message: 型 'System.AccessViolationException' のハンドルされていない例外が mscorlib.dll で発生しました 追加情報:保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。
●プログラム抜粋
Dim lngInetHandle As Integer 'インターネットハンドルを格納 Dim lngUrlHandle As Integer 'URLハンドルを格納 Dim lngArraySize As Integer 'データを受け取るバッファ bytRecvData のサイズ Dim intRet As Short 'InternetReadFile の戻り値を格納 Dim lngTotalRead As Integer '受信したデータの総サイズ 兼 バッファへのポインタ Dim lngReadSize As Integer '受信したデータのサイズ Dim lngRet AS Integer 'バイト数
'インターネットハンドルを作成 lngInetHandle = InternetOpen("WinInet Test", INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)
'URLハンドルを作成 lngUrlHandle = InternetOpenUrl(lngInetHandle, 該当のURL, vbNullString, 0, &H80000000, 0)
lngArraySize = WI_INITBUFSIZE - 1 ReDim bytRecvData(lngArraySize) 'バッファの初期サイズを確保する
Do '次回受信時、バッファのサイズをオーバーしてしまう危険性がある場合 If (lngTotalRead + 1024) > lngArraySize Then 'バッファサイズを 32767 バイト増やす lngArraySize = lngArraySize + 32767 ReDim Preserve bytRecvData(lngArraySize) End If
'インターネット上のデータを読み込む intRet = InternetReadFile(lngUrlHandle, bytRecvData(lngTotalRead), 1024, lngReadSize) ' ↑↑↑↑↑↑↑↑↑AccessViolationExceptionが発生している箇所↑↑↑↑↑↑↑↑↑
lngTotalRead = lngTotalRead + lngReadSize '読み込んだ総サイズを計算 '受信サイズが0、または読み込み失敗の場合、ループを抜ける If (lngReadSize = 0) Or (intRet = 0) Then Exit Do Loop
If lngTotalRead Then '実際にデータが読み込まれた場合 '配列サイズを実サイズに削る ReDim Preserve bytRecvData(lngTotalRead - 1) lngRet = lngTotalRead '読み込んだバイト数を返す Else Erase bytRecvData '総受信サイズが 0 の場合、配列を消去 End If
Call InternetCloseHandle(lngUrlHandle) 'URLハンドルを閉じる
●該当のURLでやっていること
・ASP(Classic)をリクエスト ・ASPではServer.CreateObjectでDLLを呼び出している。 ・DLLではリクエストパラメータからの値をキーにOracleからデータを取得 ・取得したデータを元にCSVファイルを作成 ・CSVファイルを元にサードパーティ製の帳票作成ツールを使用して帳票を作成
●その他
・該当のURLを直接ブラウザから要求した場合は、問題なく動作する。(帳票が作成される)
|