プロが教える店舗&オフィスのセキュリティ対策術

ActiveBasic 4.23.00 を使用しています。

今回、ファイルの暗号化ソフトを作成しようと思い、手段を考えていたところ、ON ERROR RESUME NEXT様のリソースの追加/読み込みの項目を見つけ、
これでやってみようと作成を始めました。

Declare Function BeginUpdateResource Lib "kernel32" Alias "BeginUpdateResourceA" (pFileName As BytePtr,bDeleteExistingResources As Long) As Long
Declare Function UpdateResource Lib "kernel32" Alias "UpdateResourceA" (hUpdate As Long,lpType As BytePtr,lpName As BytePtr,wLanguage As Long,lpData As VoidPtr,cbData As Long) As Long
Declare Function EndUpdateResource Lib "kernel32" Alias "EndUpdateResourceA" (hUpdate As Long,fDiscard As Long) As Long


'定数
Const RT_MANIFESTID=1
Const RT_MANIFEST="BINTYPE"

Sub MainWnd_CommandButton1_Click()
Dim IsUpdate As Long
Dim Update As Long
Dim temp As String

'EditBoxをチェック
Dim Ed1 As Long
Dim Ed2 As Long
Dim buf1 As BytePtr
Dim buf2 As BytePtr

Ed1=GetWindowTextLength(GetDlgItem(hMainWnd,EditBox1))
Ed2=GetWindowTextLength(GetDlgItem(hMainWnd,EditBox2))

If Ed1=0 Then
MessageBox(hMainWnd,"埋め込み用物質が選択されていません","Error 1",MB_OK or MB_ICONHAND)
Exit Sub
End If

If Ed2=0 Then
MessageBox(hMainWnd,"埋め込み先物質が選択されていません","Error 2",MB_OK or MB_ICONHAND)
Exit Sub
End If

buf1=malloc(Ed1+1)
buf2=malloc(Ed2+1)

GetDlgItemText(hMainWnd,EditBox1,buf1,Ed1)
GetDlgItemText(hMainWnd,EditBox2,buf2,Ed2)

temp=MakeStr(buf2)
IsUpdate=BeginUpdateResource(buf1,TRUE)'FileName はターゲットファイルのフルパス。Ex:"C:\test.exe" にリソースを埋め込む場合、FileName="C:\test.exe"

If IsUpdate=0 Then'エラー
free(buf1)
free(buf2)
MessageBox(hMainWnd,"リソースの埋め込み先に異常あり","Error 3",MB_OK or MB_ICONHAND)
Exit Sub
EndIf

Update=UpdateResource(IsUpdate,RT_MANIFEST,RT_MANIFESTID,MAKELANGID(LANG_JAPANESE,SUBLANG_SYS_DEFAULT),temp,Len(temp))
If Update=0 Then'エラー
EndUpdateResource(IsUpdate,TRUE)
free(buf1)
free(buf2)
MessageBox(hMainWnd,"リソースの埋め込み時に異常事態発生","Error 4",MB_OK or MB_ICONHAND)
Exit Sub
End If

EndUpdateResource(IsUpdate,FALSE)
free(buf1)
free(buf2)

MessageBox(hMainWnd,"たぶんエラーなく書き込みを完了しました。","Success!!",MB_OK or MB_ICONINFORMATION)
End Sub

このように書いてみたのですが、IsUpdate=0でいつもエラーが返ってきます。
何故かが分かりません。
すみませんが、ご存知の方がいらっしゃいましたら、ご教授の方をお願いします。

A 回答 (1件)

buf1に読み込んだファイル名が完全でないのではありませんか?



BytePtr型へ読み込まずにString型へ読み込んだほうがいいかもしれませんよ

dim ss as String
GetDlgItemText( hMainWnd, EditBox1, ss, 256 )
といった具合で

APIに渡すときも String型ならそのままでいいようです
IsUpdate = BeginUpdateResource( ss, TRUE )
といった具合で

どうしても BytePtr型がいいのであれば
GetDlgItemText( hMainWnd, EditBox1, buf1, Ed+1 )
として 文字列の終端記号のNull文字の分まで読み込むようにしましょう
    • good
    • 0
この回答へのお礼

出来ました!
ありがとうございました

お礼日時:2009/05/23 20:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!