6

Windows では、Evernoteをインストールすると API もインストールされ、vba 経由でアクセスできます (たとえば)。

各メモはその「リソース」(添付ファイルと画像) を表示でき、実際のリソースはバイト配列として取得できます。

バイト配列を実際のファイルに書き込むのに問題があります。

変数の宣言:

Dim fileByte() As Byte
Dim nt As enapiLib.Note

データを取得します:

fileByte = nt.Resources.Item(i).Data

バイト配列をファイルに書き込みます:

Function WriteByteArray(vData As Variant, sFileName As String, Optional bAppendToFile As Boolean = False) As Boolean
Dim iFileNum As Integer, lWritePos As Long

Debug.Print " --> Entering WriteByteArray function with " & sFileName & " file to write."
On Error GoTo ErrFailed
If bAppendToFile = False Then
    If Len(Dir$(sFileName)) > 0 And Len(sFileName) > 0 Then
        'Delete the existing file
        VBA.Kill sFileName
    End If
End If

iFileNum = FreeFile
Debug.Print "iFileNum = " & iFileNum
'Open sFileName For Binary Access Write As #iFileNum
Open sFileName For Binary Lock Read Write As #iFileNum

If bAppendToFile = False Then
    'Write to first byte
    lWritePos = 1
Else
    'Write to last byte + 1
    lWritePos = LOF(iFileNum) + 1
End If

Put #iFileNum, lWritePos, vData
Close #iFileNum

WriteByteArray = True
Exit Function

ErrFailed:
Debug.Print "################################"
Debug.Print "Error handling of WriteByteArray"
Debug.Print "################################"
FileWriteBinary = False
Close iFileNum
Debug.Print Err.Description & "(" & Err.Number & ")"
End Function

exeファイルでやってみた

各バイト値を debug.printing することにより、バイト配列が他のすべての exe ファイルと同様に 4D 5A で始まることがわかります

Resource (1) : 
ClickToSetup.0.9.8.1416.exe
application/x-msdownload
Le fichier C:\Dropbox\TestEvernote\ClickToSetup.0.9.8.1416.exe doit être créé.
Lbound(fileByte) = 0
Ubound(fileByte) = 5551919
i = 0
filebyte(i) = 4D
i = 1
filebyte(i) = 5A

バイト配列に作成されたexeファイルを読み返すことで、新しく作成された配列が必要に応じてバイト4D 5Aで始まることがわかります

しかし、ハード ドライブに存在する exe ファイルは_破損_しており、_正しいバイト数で_開始されません_:

ハードドライブに保存されたファイルの最初のバイナリ値は次のとおりです: (VBinDiff ツールから取得) (画像を投稿できません。ここでは初心者です...): exe の VBinDiff 出力

実際のデータの前にこれらの 12 バイトがあるのはなぜですか??

4

2 に答える 2

12

私は同じ問題を抱えていました - 書き込まれたすべてのファイルの先頭に12バイトのヘッダーがスローされました。PUT コマンドは、Variant 型のデータの処理方法を完全には認識していないことがわかりました。正確な原因はわかりませんが、私の回避策は単に PUT 行を置き換えることでした:

    Put #iFileNum, lWritePos, vData

これとともに:

    Dim buffer() As Byte
    buffer = vData
    Put #iFileNum, lWritePos, buffer

問題が解決しました。

于 2012-12-18T19:40:12.717 に答える
1

VB6では、保存されるコンテンツの前に追加された不思議な 12 バイトがあります。なんで?Variant 構造と Variant のコンテンツを保存したためです。

Variant コンテンツを Byte 配列に「コピー」する必要があります。次に例を示します。

ReDim arrByte(0 To UBound(varBuffer) - LBound(varBuffer))

For i = 0 To UBound(varBuffer) - LBound(varBuffer)
  arrByte = varBuffer(i + LBound(varBuffer))
Next i
于 2014-06-19T15:10:25.097 に答える