ここから本文です

Susie Plugin(axzip.spi)でのメモリ出力

knu********さん

2014/5/309:01:52

Susie Plugin(axzip.spi)でのメモリ出力

お世話になります。

Susie Plugin(axzip.spi)を使って、ファイルを出力する部分が巧くいかないので、質問させていただきます。

直接ファイルには出力できました。
SPI_GetFile = (GETFILE)GetProcAddress(hSPI, "GetFile");
(*SPI_GetFile)(filename, fi->position, outputDir, 0x0000, (FARPROC)SpiCallback, 0);
よって、fi->position(ファイル上での位置)はちゃんと取れていると思われます。

これを、理由あって自前でファイルに出力させたく、以下のように書き換えましたが、うまく出力されません。
HLOCAL buf;
SPI_GetFile = (GETFILE)GetProcAddress(hSPI, "GetFile");
(*SPI_GetFile)(filename, fi->position, (LPSTR)&buf, 0x0100, (FARPROC)SpiCallback, 0);

hFile = CreateFileA(outputFilename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(hFile, buf, fi->filesize, &writeSize, NULL);
CloseHandle(hFile);
LocalFree(buf);

ファイル自体は書き出されるので、outputFilename、fi->filesize(書庫内ファイルのサイズ)等は問題無いと思われるのですが、実際に出力されたファイルが、本来のファイルと内容がまったく異なっています。

他のソースを参考になんとか書いたもので、HLOCAL型(=HANDLE型?)の詳細などがわかっていないので、なにか大きな勘違いをしているかもしれませんが、わかる方がいらっしゃいましたら回答願います。

なにか足りない情報がありましたらご指摘願います。追記します。

閲覧数:
205
回答数:
1
お礼:
25枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

tre********さん

2014/5/615:14:28

knuth4kludgeさんへ

【要点】
WriteFile()には、データのポインタを渡さないといけないのに、
ローカルメモリオブジェクトハンドルを渡しているのでは?


【解析】
BOOL WriteFile(
HANDLE hFile, // ファイルのハンドル
LPCVOID lpBuffer, // データバッファ
DWORD nNumberOfBytesToWrite, // 書き込み対象のバイト数
LPDWORD lpNumberOfBytesWritten, // 書き込んだバイト数
LPOVERLAPPED lpOverlapped // オーバーラップ構造体のバッファ
);
のようにWriteFile APIは、第2引数にデータバッファのポインタを要求していますが、
記載されているプログラムでは、

HLOCAL buf;
WriteFile(hFile, buf, fi->filesize, &writeSize, NULL);

のようにローカルメモリオブジェクトハンドルが渡されています。


【対策】
・ローカルメモリオブジェクトハンドルをLocalLock()を用いてポインタに変換。
・取得したポインタを用いてWriteFileでデータをファイルに書き出し。
・ロックしたローカルメモリをLocalUnlock()を用いてロック解除。


※外してたらごめんなさい
m(_ _)m

質問した人からのコメント

2014/5/10 16:27:31

う~ん、できないあなぁ。SPIの規格書に
プラグインはLocalAllocによって必要なメモリーを確保し、そのハンドルを
返す。
アプリケーションはLocalFreeによってメモリーを開放する必要がある。
って書いてあるんですよね…。

というか、質問の後に色々調べたら、「質問」に書いたコードでファイル出力できるSPIも存在するんですよね…。でもまぁ、せっかく回答いただけたので、ベストアンサーにさせていただきました。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる