mfc-ml

2003年12月

30

[mfc 47351] Re: 自前のアプリからOutLook 呼び出し


西さん。
お世話になっております。 藤沢@酔っ払いです。

> 一個の添付ファイルはご指摘の通り送ることが出来るようになりました。

はい。私も。

> やはり、複数の任意のファイルを添付したいのでそのことで遅くなりました。
> 結果としてまだうまくいきませんが、複数のファイルを同時に送るには、
> 下記のようにすればうまくいきます。
> ただし、その下のようにリストから取得したファイルを元にフルパスを作成して
> セットすると最後にセットしたファイルがその数分送信されてしまいます。

そーですか?
よくよく考えてみれば実に単純でした。
私の提示したソースで申し訳ないのですが、これについて話を進めて
いきますと、
MapiFileDesc構造体の数を複数にすればよいです。
単一ファイルの場合は
MapiFileDesc AttachFile;
でしたが、これを
MapiFileDesc AttachFile[2];    // 複数おくっちゃうぞ!
にします。
で、MapMessage構造体のメンバnFileCountにはファイルの個数をお忘
れなくすればよろしいかと。

実際に汚いソースを記載してみます。 ↓^^;

 // 添付ファイル情報(複数の場合は配列にする)
 // 複数ファイル
 MapiFileDesc AttachFile[2];
 memset( &AttachFile[0], 0, (sizeof(AttachFile)*2));

 // 1つ目
 INT nCntAttach;
 nCntAttach = 0;
 AttachFile[nCntAttach].ulReserved
 = 0;
 AttachFile[nCntAttach].flFlags
 = 0;
 AttachFile[nCntAttach].nPosition
 = 0xffffffff;
 AttachFile[nCntAttach].lpszPathName
 = "C:\\Documents and Settings\\admin\\デスクトップ\\新規テキスト文書.txt";
 AttachFile[nCntAttach].lpszFileName
 = NULL;
 AttachFile[nCntAttach].lpFileType
 = NULL;
 nCntAttach++;

 // 2つ目
 AttachFile[nCntAttach].ulReserved
 = 0;
 AttachFile[nCntAttach].flFlags
 = 0;
 AttachFile[nCntAttach].nPosition
 = 0xffffffff;
 AttachFile[nCntAttach].lpszPathName
 = "C:\\Documents and Settings\\admin\\デスクトップ\\新規テキスト文書2.txt";
 AttachFile[nCntAttach].lpszFileName
 = NULL;
 AttachFile[nCntAttach].lpFileType
 = NULL;
 nCntAttach++;

 // MapMessage 構造体に送信パラメータを設定
 msg.lpszSubject
  = (char*)lpszSubject;
 msg.lpszNoteText
 = (char*)lpszData;
 msg.lpszMessageType
 = NULL;
 msg.flFlags
 = MAPI_RECEIPT_REQUESTED;
 msg.lpOriginator
 = &desSender;
 msg.lpFiles
 = &AttachFile[0];
 msg.nFileCount
 = 2;
 msg.lpRecips
 = desRcv;

これで私の環境(WinXP Pro VC++.NET)では正常に送られちゃってます。

> 上記のように書いたときはうまく送信できます。
> が、下記のようにリストにファイル名を表示して拡張子を付与しさらにパスを作成

> たとき
> 一番最後に取得したファイル名をその数分だけ送信してしまいます。
> おそらくパスの作成で何らかの不都合が起きているのでしょうが解りません。
> どなたかこの謎(僕だけの謎かも?)教えてください。

ん~
ちょっと分からないですが、不安であれば送信する前にMessageBoxなどで、
正しくパスが作成されているか目で見てみては如何でしょうか?
あと、パス関係は拡張子などを付与しているようなのでPathxxx系のAPIを使
用することをお勧めします。
Ex. PathAddExtension(・・・)

どうしてもうまくいかないようであれば、始めは2つなどでテストしてみて、やはり
目で
見て確かめるのがよろしいかと。。。

頑張って下さい。
必要であればプロジェクトごとアップしますよ。又はソース。
(VC++6.0だとコンパイルできませんが、、、苦笑)
28

[mfc 47349] Re: WM_LBUTTONDOWNのの動作不具合?

今回はLBUTTONDOWNをあきらめて、WM_COMMANDを使うことにしました。
WM_COMMANDの具体的な使用方法を教えていただきありがとうございました。
おかげさまで、所望の処理を実行することができました。
__________________________________________________
Do You Yahoo!?
Yahoo! BB is Broadband by Yahoo!
http://bb.yahoo.co.jp/
28

[mfc 47348] Re: WM_LBUTTONDOWNのの動作不具合?

高津戸です。

In Message-ID <2...@smb506.nifty.com>,
"Hiroaki SHIBUKI" <h...@mbi.nifty.com> wrote:

> HWND hwndMainFrame;  // 相手アプリのメインウィンドウのウィンドウハンドル
> HWND hwndButton;  // ボタンのウィンドウハンドル
> UINT nID = ::GetDlgCtrlID (hwndButton);
> ::PostMessage (hwndMainFrame, WM_COMMAND, nID, 0);

せっかくですので、LPARAMも設定しておいた方がいいと思います。

::PostMessage(hwndMainFrame, WM_COMMAND,
    MAKE_WPARAM(nID, BN_CLICKED), (LPARAM)hwndButton);

# BN_CLICKED は 0 なので、結果的には WPARAM の値は同じになります。

---
TAKATSUTO Atsushi ( t...@netfarm.ne.jp )
28

[mfc 47347] Re: 自前のアプリからOutLook 呼び出し

舞さん、藤沢さん、お世話になります。
返事が遅くなりすみません。
一個の添付ファイルはご指摘の通り送ることが出来るようになりました。
やはり、複数の任意のファイルを添付したいのでそのことで遅くなりました。
結果としてまだうまくいきませんが、複数のファイルを同時に送るには、
下記のようにすればうまくいきます。
ただし、その下のようにリストから取得したファイルを元にフルパスを作成して
セットすると最後にセットしたファイルがその数分送信されてしまいます。

コード、個別に直接ファイル名とフルパスをセットすると複数のファイルが添付でき
ます。
 msg.nFileCount = 0;
 msg.lpFiles = (MapiFileDesc *) realloc(msg.lpFiles, (msg.nFileCount + 1) *
sizeof(MapiFileDesc));
 memset(&msg.lpFiles[msg.nFileCount], 0, sizeof(MapiFileDesc));
 if(msg.lpFiles == (MapiFileDesc *) NULL) {
  return FALSE;
 }

 msg.lpFiles[msg.nFileCount].flFlags  = 0;   // Attachment Files
 msg.lpFiles[msg.nFileCount].lpFileType = 0;
 msg.lpFiles[msg.nFileCount].nPosition = 0;  //0xffffffff
 msg.lpFiles[msg.nFileCount].ulReserved = 0;
 msg.lpFiles[msg.nFileCount].lpszPathName =
(LPSTR)(LPCTSTR)"C:\\Adress.FIL"; 直接パスを書く
 msg.lpFiles[msg.nFileCount].lpszFileName = (LPSTR)(LPCTSTR)"Adress.FIL"; 
直接ファイル名を指定
 msg.nFileCount++;
 msg.lpFiles = (MapiFileDesc *) realloc(msg.lpFiles, (msg.nFileCount + 1) *
sizeof(MapiFileDesc));
 memset(&msg.lpFiles[msg.nFileCount], 0, sizeof(MapiFileDesc));
 msg.lpFiles[msg.nFileCount].flFlags  = 0;   // Attachment Files
 msg.lpFiles[msg.nFileCount].lpFileType = 0;
 msg.lpFiles[msg.nFileCount].nPosition = 0;  //0xffffffff
 msg.lpFiles[msg.nFileCount].ulReserved = 0;
 msg.lpFiles[msg.nFileCount].lpszPathName =
(LPSTR)(LPCTSTR)"C:\\ComboData.FIL";
 msg.lpFiles[msg.nFileCount].lpszFileName = (LPSTR)(LPCTSTR)"ComboData.FIL";
 msg.nFileCount++;
 msg.lpFiles = (MapiFileDesc *) realloc(msg.lpFiles, (msg.nFileCount + 1) *
sizeof(MapiFileDesc));
 memset(&msg.lpFiles[msg.nFileCount], 0, sizeof(MapiFileDesc));
 msg.lpFiles[msg.nFileCount].flFlags  = 0;   // Attachment Files
 msg.lpFiles[msg.nFileCount].lpFileType = 0;
 msg.lpFiles[msg.nFileCount].nPosition = 0;  //0xffffffff
 msg.lpFiles[msg.nFileCount].ulReserved = 0;
 msg.lpFiles[msg.nFileCount].lpszPathName = (LPSTR)(LPCTSTR)"C:\\Ginko.FIL";
 msg.lpFiles[msg.nFileCount].lpszFileName = (LPSTR)(LPCTSTR)"Ginko.FIL";
 msg.nFileCount++;

上記のように書いたときはうまく送信できます。
が、下記のようにリストにファイル名を表示して拡張子を付与しさらにパスを作成し
たとき
一番最後に取得したファイル名をその数分だけ送信してしまいます。
おそらくパスの作成で何らかの不都合が起きているのでしょうが解りません。
どなたかこの謎(僕だけの謎かも?)教えてください。

 for(int j=0 ; j < m_listctrl.GetItemCount() ; ++j) { // 添付する
  int chk = m_listctrl.GetCheck(j);
  if(chk) {
   stFileMei = m_listctrl.GetItemText(j, 0);
   if(nExtType == 1)
    stFileMei = stFileMei + ".FIL";
   if(nExtType == 2)
    stFileMei = stFileMei + ".BNK";
   if(nExtType == 3)
    stFileMei = stFileMei;
   stFullPath.Format("%s\\%s", stSendingAttachmentFolder, stFileMei);
   // MapiFileDesc 構造体に送信パラメータを設定
   msg.lpFiles = (MapiFileDesc *) realloc(msg.lpFiles, (msg.nFileCount + 1)
* sizeof(MapiFileDesc));
   memset(&msg.lpFiles[msg.nFileCount], 0, sizeof(MapiFileDesc));
   if(msg.lpFiles == (MapiFileDesc *) NULL) {
    //AfxMessageBox(MAPI_FAILATTACH);
    return FALSE;
   }
   msg.lpFiles[msg.nFileCount].flFlags  = 0;   // Attachment Files
   msg.lpFiles[msg.nFileCount].lpFileType = 0;
   msg.lpFiles[msg.nFileCount].nPosition = 0;  //0xffffffff
   msg.lpFiles[msg.nFileCount].ulReserved = 0;
  // msg.lpFiles[msg.nFileCount].lpszPathName = (LPTSTR)
malloc(strlen(stFullPath) + 1);
   msg.lpFiles[msg.nFileCount].lpszPathName = (LPSTR)(LPCTSTR)stFullPath;
  // msg.lpFiles[msg.nFileCount].lpszFileName = (LPTSTR)
malloc(strlen(stFileMei) + 1);
   msg.lpFiles[msg.nFileCount].lpszFileName = (LPSTR)(LPCTSTR)stFileMei;
   msg.nFileCount++;
  }
 }

WindowsME/XP MFC VC++6
27

[mfc 47346] RE: WM_LBUTTONDOWNのの動作不具合?

 渋木です。

> UP > DOWN > UP を今、試したのですがダメでした。

 そもそも、ボタンのハンドルはきちんと取れていますか?

 また、どうしてもダメなような、「ボタンをクリックしたこと」にするのでは
なく、「ボタンを押した結果、送信されるはずのコマンドを送信する」ようにし
てみるとか。

HWND hwndMainFrame;  // 相手アプリのメインウィンドウのウィンドウハンドル
HWND hwndButton;  // ボタンのウィンドウハンドル
UINT nID = ::GetDlgCtrlID (hwndButton);
::PostMessage (hwndMainFrame, WM_COMMAND, nID, 0);

--
// 渋木宏明 (Hiroaki SHIBUKI)
// http://www.hidori.jp/
// Microsoft MVP of Windows SDK since 2002
記事検索
Amazon.co.jp
  • ライブドアブログ