はじめまして
会社ではVBを使っておりプライベートではVC++を初心者ながら
勉強しております
今現在メールソフトを作っていましてテキストファイルの送受信は
うまくいったのですがいざバイナリファイルを添付しようとすると
エラーは出ないものの受信後にファイルの容量が変わっていました
原因を突き止めようとしましてバイナリエディタで送信前と送信後の
ファイルの差を見比べますと00があるとそこでファイルの読み込みを終えている
ようです
00を読み込むようにするにはどうすればよろしいでしょうか?
ご教授お願い致します
hFile = CreateFile(lpszFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);
dwFSize = GetFileSize(hFile, NULL);
hMem = GlobalAlloc(GHND, dwFSize);
lpszBuf = (char *)GlobalLock(hMem);
ReadFile(hFile, lpszBuf, dwFSize, &dwReadSize, NULL);
CloseHandle(hFile);
GlobalUnlock(hMem);
GlobalFree(hMem);
windowXPで開発環境はVC.NETです
よろしくお願い致します
> 原因を突き止めようとしましてバイナリエディタで送信前と送信後の
> ファイルの差を見比べますと00があるとそこでファイルの読み込みを終えている
> ようです
最初に確認しますが…
どのようにバイナリファイル送っていますか?
メールソフトって普通にインターネットで使えるもの…ですか?
返信ありがとうございます
バイナリファイルの送り方ですが上記では省略しておりますが
Content-Type: Application/Octet-stream; name="filepass"\r\n
Content-Disposition: attachment; filename="filename"\r\n
などをsend関数で送った後に上記にてバイナリファイルを取得し
Base64でエンコードした上で送っております
>メールソフトって普通にインターネットで使えるもの…ですか?
普通にというのはどういうことでしょうか?
文章の送受信やテキストファイルの送受信などは問題なく
送受信できておりますが…
> バイナリファイルの送り方ですが上記では省略しておりますが
> Content-Type: Application/Octet-stream; name="filepass"\r\n
> Content-Disposition: attachment; filename="filename"\r\n
> などをsend関数で送った後に上記にてバイナリファイルを取得し
> Base64でエンコードした上で送っております
> 普通にというのはどういうことでしょうか?
省略されていたので確認したかっただけですが、
BASE64でエンコードしているそうなので問題ないでしょう。
送信した物を他のメーラーで受信して、正しくバイナリが受信できるのであれば、
送信処理側に問題はないと判断できると思われます。
逆に他のメーラーで送信した物を受信してみて、正しく受信できれば
受信処理も正しいと診断できるでしょう。
可能性としてBASE64へのエンコードかデコードに失敗しているのが考えられます。
エンコード時の元データのサイズ取得にstrlen()等を使っていないか、
デコード後のデータ書きだし時にstrlen()等を使っていないか確認してみてはどうでしょう?
0x00以降が消えるとすると、上記の可能性が高いと思われますので。
# あとマルチポストは歓迎されませんよ。
> 省略されていたので確認したかっただけですが、
> BASE64でエンコードしているそうなので問題ないでしょう。
申し訳ありません
問題点がエンコード前に問題があるのかと判断してしまったので
省略してしまいました
省略したことによる影響で説明不足だったのですが
HANDLE hFile;
DWORD dwFSize;
HGLOBAL hMem;
char *lpszBuf;
hFile = CreateFile(lpszFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);
dwFSize = GetFileSize(hFile, NULL);
hMem = GlobalAlloc(GHND, dwFSize);
lpszBuf = (char *)GlobalLock(hMem);
ReadFile(hFile, lpszBuf, dwFSize, &dwReadSize, NULL);
//ここでエンコード処理
ということを行っているのですがreadfileが終わった状態(エンコード直前)ですでにlpszBufには0x00以降が入っておりませんでした
またstrlenはバイナリファイルに対しては使っておりません(まったく別の処理では使っておりませすが)
今現在GetLastError()を使って詳しく調べております
> # あとマルチポストは歓迎されませんよ。
これは本当に申し訳ありません
マルチポスト(瀬戸っぷさんが見つけられたサイトとこのサイト)をした
後にいろいろ巡回していますとこのサイトの過去ログにメール関連の質問
でマルチポストをされている方がいらっしゃいました
そこで初めてやってはいけないことをやってしまったんだと気づきました
いつも掲示板は見るばかりで書き込みは初めてでしたので失礼なことを
したと思っております
以後気をつけます
申し訳ありません
> そこで初めてやってはいけないことをやってしまったんだと気づきました
ここと
http://www.mtakahashi.com/
の10683を「まとめ」、「両方に」過程・結果を「報告」すればいいと思います。
リンクをそれぞれに張れば親切でしょう。
# こんな事やっていると、結局大変なのは自分ですよね。
# 技術的な事に関しては私も勉強させてもらいます。
> lpszBufには0x00以降が入っておりませんでした
というのは,どうやって確認したのですか?
Riskさんありがとうございます
マルチポストをしたときはどちらか一方にまとめればいいのですね
そして片方にリンクを張ればということですね
ただわからなかったのが
http://www.mtakahashi.com/
に書き込んだもののどこにその文章が載っているのかわからなかったので…
新規登録と過去ログしかなかったものですからこちらに再度投稿してしまい
ました
YuOさんもありがとうございます
> lpszBufには0x00以降が入っておりませんでした
こちらはバイナリエディタにて確認しました
まず送信前のファイルをバイナリエディタで開き確認します
そしてそのファイルを自作のメーラーで送信しOutlookExpressにて
受信します
そして添付ファイルをPCに保存し再度バイナリエディタで開き、送信前
と送信後のファイルを見比べますと送信後のファイルは0x00があるところ
までしか送信できていませんでした
これはいくつかバイナリファイルを試したのですが全て同じでした
例
送信前:D0 CF 11 E0 A1 B1 aA E1 00 00 00 00 00 00 00
送信後:D0 CF 11 E0 A1 B1 aA E1
> マルチポストをしたときはどちらか一方にまとめればいいのですね
> そして片方にリンクを張ればということですね
うーん…。どのようにしたら「いい」のかは人によって違うと思います。
ただ、後から見る人(過去ログから必要な情報を探す人)が困らないようにした方がいいと思います。
そういう意味で「両方に」って言いました。
> 新規登録と過去ログしかなかったものですからこちらに再度投稿してしまいました
JavaScript がオフになっているか、対応していないブラウザであると思われます。
セキュリティ関連の項目をチェックしてください。
# 私も経験有り
JavaScript を有効にすれば各スレッドが表示されると思います。
> ReadFile(hFile, lpszBuf, dwFSize, &dwReadSize, NULL);
dwFSize は本当に添付したいファイルと同じサイズありますか?
dwReadSize は ReadFile() 呼び出し後、dwFSize と同じ値ですか?
> こちらはバイナリエディタにて確認しました
これでは ReadFile() の直後と同じか分からないのでは?
つまり、書き出したときに問題がある可能性があります。
そもそも、マルチポストは"しない"ものです。
# なんか曲解されていそうなので…
# まあ、各掲示板の決まり次第ではありますが
「したときは、どうすればいいか」なんてのは例外的な話だってことを理解して下さい。
で、この手の掲示板は、過去ログ等によって、Q&Aのデータベースという役割があります。
なので、あとで検索をして、あなたが立てたスレッドを見た時に、正しく回答へとたどり着ける
ように、リンクを張れと言っているわけです。
Riskさん、とおりすがりさん返信ありがとうございます
> マルチポストをしたときはどちらか一方にまとめればいいのですね
> そして片方にリンクを張ればということですね
これは
マルチポストをしてしまったときはどちらか一方にまとめればいいのですね
そして片方にリンクを張ればということですね
ですね。日本語は難しいですね…
曲解はしていないつもりです。もうマルチポストはしないように
気をつけます。
ありがとうございました
ただjavascriptを有効にしてもやはり表示がされません…
> dwFSize は本当に添付したいファイルと同じサイズありますか?
> dwReadSize は ReadFile() 呼び出し後、dwFSize と同じ値ですか?
はい、同じです。確認しました。
またファイルサイズとも一致しておりますのでファイルサイズも
正確に読み取っています
> これでは ReadFile() の直後と同じか分からないのでは?
> つまり、書き出したときに問題がある可能性があります。
デバックでブレークポイントを設けて実行しますとReadFile()の直後
にlpszBufに何が格納されているのかを見ますと0x00までしか
格納されていませんでした
一度Riskさんのおっしゃるとおり書き出し時をチェックしてみます
> デバックでブレークポイントを設けて実行しますとReadFile()の直後
> にlpszBufに何が格納されているのかを見ますと0x00までしか
> 格納されていませんでした
lspzBufはchar *なので,デバッガはナル終端する文字列とみなして表示しているのでしょう。
ウォッチではなく,メモリウィンドウを使って確認してみるとよいです。
#バイト列に対してlpszというプリフィックスはどうかと……。
YuOさんありがとうございます!!
>ウォッチではなく,メモリウィンドウを使って確認してみるとよいです。
メモリウィンドウというのをはじめて使いました
目からウロコといいますかとにかく便利な機能だなと思いました
で結論から言いますとメモリウィンドウで確認しましたらreadfileで
全バイナリファイルを読み込めていました
ということはやはり皆さんからご指摘があったとおり書き込み(送信時)
に問題があるものと思われます
>#バイト列に対してlpszというプリフィックスはどうかと……。
ごもっともです(>_<)
これはもともとテキストファイル送信用に使っていた関数でしたので
プリフィックスがおかしかったのです
細かいけれど大事な部分だと思います
ご指摘ありがとうございます
いつもウォッチを使っていましたのでメモリウィンドウも併用しようと
思います
本当にありがとうございました
メモリウィンドウを知ったことがすごい収穫でした
解決にチェックを入れるのを忘れていました
ツイート | ![]() |