添付ファイルをメールから取り外すには?

解決


みけにゃん  2005-02-15 18:01:43  No: 56410

今まで開発をとめていたメールソフト(nMail.dllを使用)の
開発を再開して、止まっていた保存したメールから添付ファイルを
取り外す部分の作成に取り掛かったのですが、コンパイルとかは警告も出さずに
成功するのにもかかわらず、実行してみると不正な処理で落ちてしまいます。
いろいろ試してみたですが、状態が改善できませんでした。

どうすれば良いか教えてください。
関数はすべてnMail.dllのヘルプの関数を使用しています。
ソースはhttp://angelteatime.punyu.net/knot/mview.htmlに置いてあります

該当する場所は以下の場所です。
// 添付ファイルを展開して保存ダイアログ
LRESULT CALLBACK AttachFileProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
  HWND hList, hFDEdit, hFBtn, hFDBtn;
  
  BROWSEINFO bi;
  ITEMIDLIST *lpid;
  HRESULT hr;
  LPMALLOC pMalloc = NULL;  // IMallocへのポインタ
  BOOL bDir = FALSE;

  HANDLE hFile;        // ファイルハンドル
  HGLOBAL hMem;        // グローバルハンドル
  DWORD dwFSizeHigh, dwFSize, dwAccBytes;  // バイト数
  char *lpszBuf;        // ファイルバッファ
  char *f_id, *PertId;    // 分割メールのID
  int no;            // 添付ファイルの個数
  int ret;          // 戻り値

  // 添付メール展開用変数
  char subject[TEMP_MAX], date[TEMP_MAX], from[TEMP_MAX], header[TEMP_MAX];
  char FileName[TEMP_MAX], Temp[NMAIL_ATTACHMENT_TEMP_SIZE];

  switch(msg){
    case WM_INITDIALOG:
      CenterWindow(hDlg, hParent);
      hList = GetDlgItem(hDlg, IDC_LIST1);
      hFDEdit = GetDlgItem(hDlg, IDC_EDIT1);
      hFDBtn = GetDlgItem(hDlg, IDC_FILEBTN);
      hFBtn = GetDlgItem(hDlg, IDC_BUTTON1);
      return TRUE;
    case WM_COMMAND:
      switch(LOWORD(wParam)){
      case IDC_BUTTON1:
        MessageBox(hDlg, "添付ファイルの展開は実装されていません", "Mail Viewer", MB_OK | MB_ICONINFORMATION);
        AttachFileOpen(hDlg, szAtFile, szAtFileName);

        // ファイルを開く
        hFile = CreateFile(szAtFile, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        
        if(hFile == INVALID_HANDLE_VALUE){
          MessageBox(hDlg, "ファイルをオープンできません", "Error", MB_OK);
          return FALSE;
        }
        
        // ファイルサイズを調べる
        dwFSize = GetFileSize(hFile, &dwFSizeHigh);
        
        if(dwFSizeHigh != 0){
          MessageBox(hDlg, "ファイルが大きすぎます", "Error", MB_OK);
          CloseHandle(hFile);
          return FALSE;
        }

        // ファイルを読み込むためのメモリ領域を確保
        hMem = GlobalAlloc(GHND, dwFSize + 1);
        
        if(hMem == NULL){
          MessageBox(hDlg, "メモリを確保できません", "Error", MB_OK);
          CloseHandle(hFile);
          return FALSE;
        }
        
        // メモリ領域をロックしてファイルを読み込む
        lpszBuf = (char *)GlobalLock(hMem);
        ReadFile(hFile, lpszBuf, dwFSize, &dwAccBytes, NULL);
        lpszBuf[dwFSize] = '\0';
        
        // メールファイルの中身をコピーする
        strcpy((char *)szAtFileData, lpszBuf);
        
        // ファイルを閉じる
        CloseHandle(hFile);
        GlobalUnlock(hMem);
        GlobalFree(hMem);
        
        // ファイルが添付されているかを確認する
        if((no = NMailAttachmentFileStatus(szAtFileData, f_id, TEMP_MAX)) != NMAIL_NO_ATTACHMENT_FILE){
          // 添付ファイルが存在するのでリストボックスにファイル名を出力する
          // MessageBox(hDlg, "添付ファイルがありました!!", "添付ファイルあり", MB_OK |MB_ICONINFORMATION);
          if(no == 1){
            PertId = f_id;
          }
          hList = GetDlgItem(hDlg, IDC_LIST1);
          if(no == 0 || PertId == f_id){
            SendMessage(hList, LB_INSERTSTRING, (WPARAM)0, (LPARAM)szAtFile);
            SendMessage(hList, LB_SETCURSEL, (WPARAM)0, 0L);
            EnableWindow(GetDlgItem(hDlg, IDOK), TRUE);
          }
        }
        else{
          // 添付ファイルがないのでメッセージを出して終了
          MessageBox(hDlg, "このメールに、添付ファイルはありません", "添付ファイルなし", MB_OK |MB_ICONINFORMATION);
        }

        return TRUE;
      case IDC_FILEBTN:
        MessageBox(hDlg, "添付ファイルの展開は実装されていません", "Mail Viewer", MB_OK | MB_ICONINFORMATION);
        memset(&bi, 0, sizeof(BROWSEINFO));
        bi.hwndOwner = hDlg;
        bi.lpfn = SHMyProc;
        bi.ulFlags = BIF_EDITBOX | BIF_STATUSTEXT | BIF_VALIDATE;
        bi.lpszTitle = "展開先ディレクトリ指定";
        lpid = SHBrowseForFolder(&bi);
        
        if(lpid == NULL){
          return FALSE;
        }
        else{
          hr = SHGetMalloc(&pMalloc);
          if(hr == E_FAIL){
            MessageBox(hDlg, "SHGetMalloc Error", "Error", MB_OK);
            return FALSE;
          }
          SHGetPathFromIDList(lpid, szDir);
          if(szDir[strlen(szDir) - 1] != '\\'){
            strcat(szDir, "\\");
          }

          // うまくいかないのでエディットハンドル再取得
          hFDEdit = GetDlgItem(hDlg, IDC_EDIT1);

          // 展開先フォルダをセットする
          SetWindowText(hFDEdit, szDir);

          pMalloc->Free(lpid);
          pMalloc->Release();
          bDir = TRUE;
        }
        return TRUE;
        case IDOK:
          // 添付ファイルの展開
          ret = NMailAttachmentFileFirst(Temp, subject, date, from, header, body, szDir, FileName, szAtFileData, NULL);
          if(ret == NMAIL_SUCCESS){
            NMailAttachmentFileClose(Temp);
            wsprintf(strMsg, "%sに%sを展開しました。", szDir, FileName);
            MessageBox(hDlg, strMsg, "Mail Viewer", MB_OK | MB_ICONINFORMATION);
          }
          EndDialog(hDlg, IDOK);
          return TRUE;
        case IDCANCEL:
          EndDialog(hDlg, IDOK);
          return TRUE;
        default:
          return FALSE;
      }
      default:
        return FALSE;
  }
  return TRUE;
}


瀬戸っぷ  2005-02-16 07:20:53  No: 56411

> 取り外す部分の作成に取り掛かったのですが、コンパイルとかは警告も出さずに
> 成功するのにもかかわらず、実行してみると不正な処理で落ちてしまいます。

本当に警告出ません?
mview004c_r1.lzhをDLしてコンパイルしたら、
「mailviewer.cpp(728) : warning C4700: 値が割り当てられていないローカルな変数 'f_id' に対して参照が行われました。」
という警告が。

さて、ツッコミどころがたくさんある気がしますが、DLしたソースを検証する前に、
まずはココに書かれている分だけで。

> char *f_id, *PertId;        // 分割メールのID

f_idはドコのメモリを指しているのでしょうか?
NMailAttachmentFileStatus()のヘルプを読む限りでは、
そもそも使い方を間違えているとしか思えませんが。
予めバッファを用意し、その先頭アドレスを第2引数で、
確保したバッファのサイズを第3引数で渡す仕様のようですが。
(というコトでそのように変更してみたがナニも入ってこなかった)

> ret = NMailAttachmentFileFirst(Temp, subject, date, from, header, body, szDir, FileName, szAtFileData, NULL);

操作手順によってはbodyの値が不定です。
(起動直後にやったらNULLになってて落ちました。)

>         case WM_INITDIALOG:
>             CenterWindow(hDlg, hParent);
>             hList = GetDlgItem(hDlg, IDC_LIST1);
>             hFDEdit = GetDlgItem(hDlg, IDC_EDIT1);
>             hFDBtn = GetDlgItem(hDlg, IDC_FILEBTN);
>             hFBtn = GetDlgItem(hDlg, IDC_BUTTON1);
>             return TRUE;

各ウィンドウハンドルを取得しているようですが、
次にAttachFileProc()が呼ばれた時(=次のメッセージを処理する時)には、
これらの値は無効(不定値)になっています。
故に、
>                     // うまくいかないのでエディットハンドル再取得
>                     hFDEdit = GetDlgItem(hDlg, IDC_EDIT1);
となっているのだと思いますが。
ローカル変数の寿命について調べてみましょう。
ローカル変数の寿命について理解していないとすると、
関数全域について不安が……


みけにゃん  2005-02-17 00:24:49  No: 56412

>本当に警告出ません?
>mview004c_r1.lzhをDLしてコンパイルしたら、
>「mailviewer.cpp(728) : warning C4700: 値が割り当てられていないローカル>な変数 'f_id' に対して参照が行われました。」という警告が。

ごめんなさい。
そのワーニングは出ます。(>_<)

> f_idはドコのメモリを指しているのでしょうか?

ヘルプのQ&Aの添付ファイルについて書かれているサンプルを
そのまま使ってしまったのでどこを指してるのか分かりません。(T_T)

>ローカル変数の寿命について調べてみましょう。
>ローカル変数の寿命について理解していないとすると、
>関数全域について不安が……

これに関してはグローバル変数で取れば大丈夫でしょうか?


瀬戸っぷ  2005-02-17 05:59:01  No: 56413

> > f_idはドコのメモリを指しているのでしょうか?
> ヘルプのQ&Aの添付ファイルについて書かれているサンプルを
> そのまま使ってしまったのでどこを指してるのか分かりません。(T_T)

初期化すらしていないので不定なアドレス指しています。
ポインタ変数使う時には注意しましょう。

んで、掲示されたヤツは…

> char w_header[TEMP_MAX];     // ファイルからヘッダを読み込むバッファ
> char id1[TEMP_MAX];          // 分割メールの ID
> NMailAttachmentFileStatus(w_header, id1, TEMP_MAX)

となっていますが。
id1にTEMP_MAXバイト分確保済みで、NMailAttachmentFileStatus()に
「第2引数で渡されたアドレスから第3引数で指定したサイズ分」のバッファがあることを伝えています。
ポインタだけではその先のバッファサイズを知ることは出来ませんので、
サイズも渡しているワケです。(Win32APIにもそのようなものがある)

> >ローカル変数の寿命について調べてみましょう。
> >ローカル変数の寿命について理解していないとすると、
> >関数全域について不安が……
> これに関してはグローバル変数で取れば大丈夫でしょうか?

大丈夫ではありますが、安易にグローバル変数にすることは避けるべきです。
グローバル変数にしなくてもstatic変数にすれば回避は可能ですが、
その場合にも別のデメリットが発生したりします。
ローカル変数の寿命に関しての理解は必要ですし、
今回の場合はWM_INITDIALOGでハンドルを取得しておく必要もないでしょう。
必要な時に取得して使えばイイだけのハナシです。


みけにゃん  2005-02-21 18:12:06  No: 56414

>初期化すらしていないので不定なアドレス指しています。
>ポインタ変数使う時には注意しましょう。

初期化はmemsetとかで0クリアするという感じでしょうか?
まだまだ本とかいろんなページのサンプルや意見を参考にして
作ってるんです。

>id1にTEMP_MAXバイト分確保済みで、NMailAttachmentFileStatus()に
>「第2引数で渡されたアドレスから第3引数で指定したサイズ分」の
>バッファがあることを伝えています。
>ポインタだけではその先のバッファサイズを知ることは出来ませんので、
>サイズも渡しているワケです。(Win32APIにもそのようなものがある)

でもここは添付ファイルがあるかないかを調べるnMailの関数ですが
その下につけたNMailAttachmentFileFirst側はどうすれば良いのですか?
できればコードを書いてもらえるとうれしいです。(>_<)

>今回の場合はWM_INITDIALOGでハンドルを取得しておく必要もないでしょう。
>必要な時に取得して使えばイイだけのハナシです。

今までのプログラムでは特に気にしていなかったのですが
今回の部分でこんな落とし穴があったということに気づきました。
ありがとうございます。


瀬戸っぷ  2005-02-23 06:47:55  No: 56415

> 初期化はmemsetとかで0クリアするという感じでしょうか?

バッファなどで0クリアが必要と思われる場合は…ですね。
構造体なんかも0クリアしているコトがありますが。
ポインタの場合は必要なアドレスを指すようにします。
明示的に無効なポインタとしたい場合はNULLを入れておくのがパターンでしょうか。

> でもここは添付ファイルがあるかないかを調べるnMailの関数ですが
> その下につけたNMailAttachmentFileFirst側はどうすれば良いのですか?
> できればコードを書いてもらえるとうれしいです。(>_<)

微妙に忙しい(というかプログラムいじっているヒマがない)ので、
検証は出来ませんが……
ヘルプを軽く見た限りでは渡すバッファのサイズの指定がないですね。
予め必要サイズが仕様として決められているのか他の方法で通達するのか…
ちょっと不明です。

> 今までのプログラムでは特に気にしていなかったのですが

ローカル変数の寿命についてはキチンと把握しておいた方がいいです。
前回の関数呼び出しで設定した値を使うコトは(普通は)出来ません。
もし、それで「今まで動いていた」としたら、それはたまたまです。
関数呼び出しの順番が変わったりすると内容が保証できないですから。

http://www.google.co.jp/search?hl=ja&q=%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E5%A4%89%E6%95%B0+%E5%AF%BF%E5%91%BD&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja
とかでいろいろ見つかりますが。


みけにゃん  2005-02-25 17:34:34  No: 56416

一応変数の寿命に関しては勉強になりました。
なお、添付の所に関してはまだ解決していない状態で
軟式さんのサポートにも問い合わせをしている所です。


瀬戸っぷ  2005-03-02 03:49:59  No: 56417

微妙に時間が出来たので試してみました。
添付ファイルの書き出し部分のみのテストで、コンソールアプリとして。
エラー処理も入れていないですが。
で、mview004c_r1.lzhでファイルに保存したモノが対象です。

まずはソースを

#include <windows.h>
#include <nMail.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TEMP_MAX  65536

int main(int argc, char* argv[])
{
  FILE *InFile = NULL;
  LPSTR lpMailData = NULL;
  char WorkArea[NMAIL_ATTACHMENT_TEMP_SIZE], Subject[TEMP_MAX] = {0}, DateStr[TEMP_MAX] = {0};
  char From[TEMP_MAX] = {0}, Header[TEMP_MAX] = {0}, Body[TEMP_MAX] = {0}, FileName[TEMP_MAX] = {0};
  size_t FSize = 0;

  InFile = fopen(argv[1], "rb");
  fseek(InFile, 0, SEEK_END);    /* ファイル終端へ移動して */
  FSize = ftell(InFile);         /* サイズ取得 */
  rewind(InFile);
  lpMailData = (LPSTR)calloc(sizeof(char), (FSize + 1));  /* メモリ確保して */
  fread(lpMailData, sizeof(char), FSize, InFile);         /* 読み込み */
  fclose(InFile);

  NMailSetOption(NMAIL_OPTION_HEADER_MAX, TEMP_MAX);  /* テンポラリのサイズを指定して */
  NMailAttachmentFileFirst(WorkArea, Subject, DateStr, From, Header, Body, argv[2], FileName, lpMailData, NULL);

  free(lpMailData);  /* 解放 */

  return 0;
}

起動時の第1引数で保存したファイル名(〜.mvf)を、第2引数で出力先パスを指定します。
で、普通に成功しています。

となると、NMailAttachmentFileFirst()呼び出し時に渡しているパラメータ(と、その中身)に
問題がないか確認してはどうでしょうか?
以前(2005/02/15(火) 22:20:53)にも書きましたが、操作手順によっては落ちますけど。
szDirの内容に問題がないか…とか、szAtFileDataの内容やバッファオーバーランしていないかとか。
(メールのサイズが64k(TEMP_MAXバイト)越えているとオーバーランしますな。)

http://bbs.nanshiki.co.jp/guest/support/ でも内容の確認は求められていますね。
## NMailAttachmentFileStatus()についてはよく判らないので試していないですが。


みけにゃん  2005-03-03 04:34:00  No: 56418

今デバッグモードで追ってみたのですが
szAtFileDataとszDir以外の変数は"フフフフフフフフフフフ"で
埋められていていました。(初期化すると""にはなる)
でも相変わらずアクセス違反で落ちます。

szDirは"C:\"でszAtFileDataは展開直前にMessageBoxで
出力してみましたが、問題のないメールデータが出ました。


みけにゃん  2005-03-03 04:48:24  No: 56419

瀬戸っぷさんのプログラムを入力してテストで使用している
添付付きメールは正常にファイルが取り外せました。
でも、依然私のプログラム上行うとアクセス違反で落ちます。


瀬戸っぷ  2005-03-03 08:12:19  No: 56420

また、時間がとれなくなりつつあるのですが…。(通勤に往復5時間前後わ)

> 今デバッグモードで追ってみたのですが
> szAtFileDataとszDir以外の変数は"フフフフフフフフフフフ"で
> 埋められていていました。(初期化すると""にはなる)

デバッグ版ではコンパイラがそのように初期化するコードを埋め込むようです。
私のソースでも、「= {0}」とやっている部分を外せばそうなるでしょう。
今回の場合、正常等処理されればNMailAttachmentFileFirst()が
内容を設定して返してくれるので必ずしも0クリアなどが必要なわけではないですか。

> でも、依然私のプログラム上行うとアクセス違反で落ちます。

デバッグする際には、再現性(というか再現手順)を突き詰める必要がありますが、
そのヘンはどうなんでしょうか?

とりあえず、「2005/02/15(火) 22:20:53」でbodyの値が問題であると書きましたがどうですか?
メールの受信処理をしていない場合、ポインタ変数のbodyはNULLが入ったままになっていると思われます。
仮に受信処理をしたあとだったとしても、
添付ファイル付きのメールの本文部分が処理済みのサイズより大きかった場合は
バッファオーバーランで後からエラーで落ちるかと。


みけにゃん  2005-03-03 09:35:51  No: 56421

私が実験している手順は・・・。
MailViewer起動→[ファイル(F)]-[添付ファイルの展開]→ダイアログ表示
展開先フォルダ指定→添付付きメールを指定→展開ボタンを押すです。

>メールの受信処理をしていない場合、ポインタ変数のbodyはNULLが
>入ったままになっていると思われます。

添付ファイル付きのメールファイル(保存済み)を展開するので
受信処理はないです。でも0クリア処理を入れたのであれば
NULLは入らないかと思うのですが・・・・。


瀬戸っぷ  2005-03-05 08:47:08  No: 56422

> MailViewer起動→[ファイル(F)]-[添付ファイルの展開]→ダイアログ表示
> 展開先フォルダ指定→添付付きメールを指定→展開ボタンを押すです。

ええ、私もソレで落ちました。
「本文」を格納する場所を指定しているbodyがNULLで、
書き込みが出来ないからです。

> 添付ファイル付きのメールファイル(保存済み)を展開するので
> 受信処理はないです。でも0クリア処理を入れたのであれば
> NULLは入らないかと思うのですが・・・・。

添付ファイルをファイル化するだけでも、本文を格納する領域は必要。
という仕様なのでしょう。
ファイル化して書き出すだけならば、
ヘッダ+書き出し前の本文+パスだけで充分だったりしますが、
Subject等の出力用領域を必要としていることから、
そういう仕様なのではないかとしか言えません。

メールの仕様的に添付ファイルも「本文の一部」ですので、
添付ファイルを除いた人間がイミするところの本文を取得するために
必要なのだと思いますが。

なお、グローバル変数は特別に初期値を設定しない限り、0で埋められるかと。
言語仕様を確認したわけではないですが。

と、いうワケで、NMailAttachmentFileFirst()の第6引数で
有効なバッファへのアドレスを渡すようにして下さい。

# 時間無くてあまり詳しくかけていないけど。


みけにゃん  2005-03-05 22:10:10  No: 56423

変数をよく見たらbody変数は別の所にあるbodyを使ってたようで
このプロシージャ内にbody変数がないことに気づき、それを
修正することでファイルの取り出しに成功しました。

瀬戸っぷさんありがとうございました。
また問題が発生した時に書かさせていただきます。

以下が修正後のコードです。

// 添付ファイルを展開して保存ダイアログ
LRESULT CALLBACK AttachFileProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
  HWND hList, hFDEdit, hFBtn, hFDBtn;
  
  BROWSEINFO bi;
  ITEMIDLIST *lpid;
  HRESULT hr;
  LPMALLOC pMalloc = NULL;  // IMallocへのポインタ
  BOOL bDir = FALSE;

  HANDLE hFile;        // ファイルハンドル
  HGLOBAL hMem;        // グローバルハンドル
  DWORD dwFSizeHigh, dwFSize, dwAccBytes;  // バイト数
  char *lpszBuf;        // ファイルバッファ
  char *f_id, *PertId;    // 分割メールのID
  int no;            // 添付ファイルの個数
  int ret;          // 戻り値

  // 添付メール展開用変数
  char subject[TEMP_MAX], date[TEMP_MAX], from[TEMP_MAX], header[TEMP_MAX], body[TEMP_MAX];
  char FileName[TEMP_MAX], Temp[NMAIL_ATTACHMENT_TEMP_SIZE];

  switch(msg){
    case WM_INITDIALOG:
      CenterWindow(hDlg, hParent);
      hList = GetDlgItem(hDlg, IDC_LIST1);
      hFDBtn = GetDlgItem(hDlg, IDC_FILEBTN);
      hFBtn = GetDlgItem(hDlg, IDC_BUTTON1);
      return TRUE;
    case WM_COMMAND:
      switch(LOWORD(wParam)){
      case IDC_BUTTON1:
        MessageBox(hDlg, "添付ファイルの展開は実装されていません", "Mail Viewer", MB_OK | MB_ICONINFORMATION);
        AttachFileOpen(hDlg, szAtFile, szAtFileName);

        // ファイルを開く
        hFile = CreateFile(szAtFile, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        
        if(hFile == INVALID_HANDLE_VALUE){
          MessageBox(hDlg, "ファイルをオープンできません", "Error", MB_OK);
          return FALSE;
        }
        
        // ファイルサイズを調べる
        dwFSize = GetFileSize(hFile, &dwFSizeHigh);
        
        if(dwFSizeHigh != 0){
          MessageBox(hDlg, "ファイルが大きすぎます", "Error", MB_OK);
          CloseHandle(hFile);
          return FALSE;
        }

        // ファイルを読み込むためのメモリ領域を確保
        hMem = GlobalAlloc(GHND, dwFSize + 1);
        
        if(hMem == NULL){
          MessageBox(hDlg, "メモリを確保できません", "Error", MB_OK);
          CloseHandle(hFile);
          return FALSE;
        }
        
        // メモリ領域をロックしてファイルを読み込む
        lpszBuf = (char *)GlobalLock(hMem);
        ReadFile(hFile, lpszBuf, dwFSize, &dwAccBytes, NULL);
        lpszBuf[dwFSize] = '\0';
        
        // メールファイルの中身をコピーする
        strcpy((char *)szAtFileData, lpszBuf);
        
        // ファイルを閉じる
        CloseHandle(hFile);
        GlobalUnlock(hMem);
        GlobalFree(hMem);
        
        // ファイルが添付されているかを確認する
        if((no = NMailAttachmentFileStatus(szAtFileData, f_id, TEMP_MAX)) != NMAIL_NO_ATTACHMENT_FILE){
          if(no == 1){
            PertId = f_id;
          }
          hList = GetDlgItem(hDlg, IDC_LIST1);
          if(no == 0 || PertId == f_id){
            SendMessage(hList, LB_INSERTSTRING, (WPARAM)0, (LPARAM)szAtFile);
            SendMessage(hList, LB_SETCURSEL, (WPARAM)0, 0L);
            EnableWindow(GetDlgItem(hDlg, IDOK), TRUE);
          }
        }
        else{
          // 添付ファイルがないのでメッセージを出して終了
          MessageBox(hDlg, "このメールに、添付ファイルはありません", "添付ファイルなし", MB_OK |MB_ICONINFORMATION);
        }

        return TRUE;

      case IDC_FILEBTN:
        MessageBox(hDlg, "添付ファイルの展開は実装されていません", "Mail Viewer", MB_OK | MB_ICONINFORMATION);
        memset(&bi, 0, sizeof(BROWSEINFO));
        bi.hwndOwner = hDlg;
        bi.lpfn = SHMyProc;
        bi.ulFlags = BIF_EDITBOX | BIF_STATUSTEXT | BIF_VALIDATE;
        bi.lpszTitle = "展開先ディレクトリ指定";
        lpid = SHBrowseForFolder(&bi);
        
        if(lpid == NULL){
          return FALSE;
        }
        else{
          hr = SHGetMalloc(&pMalloc);
          if(hr == E_FAIL){
            MessageBox(hDlg, "SHGetMalloc Error", "Error", MB_OK);
            return FALSE;
          }
          SHGetPathFromIDList(lpid, szDir);
          if(szDir[strlen(szDir) - 1] != '\\'){
            strcat(szDir, "\\");
          }

          hFDEdit = GetDlgItem(hDlg, IDC_EDIT1);

          // 展開先フォルダをセットする
          SetWindowText(hFDEdit, szDir);

          pMalloc->Free(lpid);
          pMalloc->Release();
          bDir = TRUE;
        }
        return TRUE;

        case IDOK:
          // 添付ファイルの展開
          ret = NMailAttachmentFileFirst(Temp, subject, date, from, header, body, szDir, FileName, szAtFileData, NULL);
          if(ret == NMAIL_SUCCESS){
            NMailAttachmentFileClose(Temp);
            wsprintf(strMsg, "%sに%sを展開しました。", szDir, FileName);
            MessageBox(hDlg, strMsg, "Mail Viewer", MB_OK | MB_ICONINFORMATION);
          }
          EndDialog(hDlg, IDOK);
          return TRUE;
        case IDCANCEL:
          EndDialog(hDlg, IDOK);
          return TRUE;
        default:
          return FALSE;
      }
      default:
        return FALSE;
  }
  return TRUE;
}


瀬戸っぷ  2005-03-08 08:19:09  No: 56424

一応、解決なんですよね?
(バッファオーザーフローとかの問題は残ったままのような気もしますが)

とりあえず、
http://bbs.nanshiki.co.jp/guest/support/
の方にも報告すべきと思いますが、どうでしょうか?


みけにゃん  2005-03-08 18:15:52  No: 56425

>とりあえず、http://bbs.nanshiki.co.jp/guest/support/
>の方にも報告すべきと思いますが、どうでしょうか?

動作の報告をしておきました。
とりあえずの部分での動作ができたので次は
バッファオーバーフローについての問題で質問したいと思います。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加