最近またプログラムを組み始めて、思ってもいないエラーに遭遇しました。
Invalid Address specified to RtlFreeHeap
Heap block at 01150DA8 modified at 01150DB1 past requested size of 1
???なぬ?これは何だ・・・
コンパイルは一応通りますが、実行中にエラーで落ちます。
でも、何ゆえか、リリースコンパイルではなく、デバッグモードでは落ちません。
この英語はどういう意味なんですか?
エラーで実行中落ちる
エラーで実行中落ちる
===============================
MyHomePage;; raiden.no.land.to/
===============================
MyHomePage;; raiden.no.land.to/
===============================
問題のコード [ここをクリックすると内容が表示されます]
オープンソースなのですが、最後の、End Subでエラーです。コード: 全て選択
Dim NowUnitNum As Long '現在のユニット数
Sub MainWnd_IDM_OPEN_MenuClick()
Dim ofn As OPENFILENAME
Dim FileName[MAX_PATH-1] As Byte
Dim i As Long
Dim i2 As Long
Dim buffer As String
Dim lpstrBuffer[254] As Byte
Dim lpstrBuffer2[254] As Byte
Dim lc As LVITEM
'OPENFILENAME構造体の初期化
FillMemory(VarPtr(ofn),Len(ofn),0)
ofn.lStructSize=Len(ofn)
ofn.hwndOwner=hMainWnd
ofn.lpstrFilter=Ex"SubAppendMission\0*.sam\0AppendMissionFiles\0*.apm\0テキストファイル\0*.txt\0すべてのファイル(*.*)\0*\0\0"
ofn.nFilterIndex=1
ofn.lpstrFile=FileName
ofn.nMaxFile=MAX_PATH
ofn.lpstrTitle="ファイルを開く"
ofn.Flags=OFN_FILEMUSTEXIST or OFN_HIDEREADONLY or OFN_PATHMUSTEXIST or OFN_EXPLORER or OFN_NOCHANGEDIR
ofn.lpstrDefExt="*"
'「ファイルを開く」ダイアログボックスを表示
If GetOpenFileName(ofn)=0 Then Exit Sub
'INIファイルからユニット数を読み込む
NowUnitNum=GetPrivateProfileInt("UnitSettings", "NumOfUnit", 0,FileName)
If NowUnitNum=0 Then
MessageBox(hMainWnd,"正常に読み込むことが出来ませんでした。","UnitAttachmenter",MB_OK)
Exit Sub
Else
i2=0
For i = 1 To NowUnitNum-1
wsprintf(buffer, "UnitSet%d", i)
GetPrivateProfileString(buffer,"UnitName", "", lpstrBuffer, 255,FileName)
GetPrivateProfileString(buffer,"Num","",lpstrBuffer2,255,FileName)
If lstrlen(lpstrBuffer) and lstrlen(lpstrBuffer2) Then
AddListItem(lpstrBuffer,GetDlgItem(hMainWnd,ListView1),i2)
SetListItem(lpstrBuffer2,GetDlgItem(hMainWnd,ListView1),i2,1)
i2=i2+1
End If
Next
End If
End Sub
hiraさんの、サンプルコードを使用させていただいています。(AddListItem,SetListItem)
おかしなコードを書いてしまっているでしょうか?
===============================
MyHomePage;; raiden.no.land.to/
===============================
MyHomePage;; raiden.no.land.to/
===============================
こちらでも確認できましたが、確保されたサイズは (requested size of)5 バイトでした。xss0423 さんが書きました:#console
Dim a As String
wsprintf(a,"UnitSet%d",5)
これを試しに実行したらヒープエラー吐きました
やっぱりbufferが原因のようです
考えてみれば確かに 長さ情報 (4 bytes) + 終端ヌルキャラクタ で計算上は合うのですが、はて。
Byte 配列で代用するという手もありますが、AB5から文字型の扱いが拡張されることから、避けておいた方が無難です。
String 型のままバッファを拡げたい場合は ZeroString() が使えます。これも非公式関数なので怪しいところですが。
追記 2007/4/21 4:19
非公式とおもったら、ありました、ZeroString 関数。
wsprintf(buffer, "UnitSet%d", i)
この直前に一応ZeroString関数で25byte確保してデバッグしてみると、
Thread.abの140行目でアクセス違反が起こってしまいました。
Forの直前にするとまたもヒープエラーです。
どうしたものでしょう?
追記:
buffer[20] As Byte
で、代用したところ、
wsprintf(buffer, "UnitSet%d", i)
この直後でアクセス違反が起こります。
この直前に一応ZeroString関数で25byte確保してデバッグしてみると、
Thread.abの140行目でアクセス違反が起こってしまいました。
Forの直前にするとまたもヒープエラーです。
どうしたものでしょう?
追記:
buffer[20] As Byte
で、代用したところ、
wsprintf(buffer, "UnitSet%d", i)
この直後でアクセス違反が起こります。
===============================
MyHomePage;; raiden.no.land.to/
===============================
MyHomePage;; raiden.no.land.to/
===============================