定期受信に関する質問No.36157
緒方聡 さん 09/05/08 23:11
 
定期受信のタイミングや仕様で質問があります。

前提:定期受信の間隔は1分

Q1
最初の定期受信を行って、その際に100通受信します。
すべて受信するのに2分かかるとすると、
受信中に次の定期受信は発動しません。
正しいでしょうか?

Q2
定期受信の間隔は、前回の受信から数えて1分なのか
前回の定期受信から数えて1分なのかどちらでしょうか?

Q3
受信後のタイミングに自動起動マクロを設定した場合
次の定期受信はマクロ開始時刻から数えて1分なのか
マクロ終了時刻から数えて1分なのかどちらでしょうか?

Q4
定期受信の間隔や設定をマクロで変更するのは可能でしょうか?


以上です。
現在秀丸メールがない環境なので、調べられずに
質問させてもらいました。

[ ]
RE:36157 定期受信に関する質問No.36158
秀まるお2 さん 09/05/09 20:46
 
 ソースコードを調べてみた所でお返事させていただきますと…

 定期受信の間隔が1分と指定してあった場合、例えば秀丸メールが起動してか
ら1分程度経過すると受信が始まりまして、その受信が一段落すると、その時点
からもう一度定期受信用のタイマーがスタートします。結果として、受信が終わ
ってから次の定期受信が始まるまでの間隔が1分程度になります。

> Q1
> 最初の定期受信を行って、その際に100通受信します。
> すべて受信するのに2分かかるとすると、
> 受信中に次の定期受信は発動しません。
> 正しいでしょうか?

 100通受信するのが完全に終わってからさらに1分経過すると定期受信が発
動します。

> Q2
> 定期受信の間隔は、前回の受信から数えて1分なのか
> 前回の定期受信から数えて1分なのかどちらでしょうか?

 「前回の受信」が終わってから1分になってます。

 例えば何か受信したりというだけではなくて、「全般的な設定」を実行してOK
した場合にもタイマーが再起動します。

 定期受信の条件が「最小化中/常駐秀丸メールだけの時のみ」がONになってる
場合、秀丸メールが最小化する等のタイミングで定期受信のタイマーが起動する
ようです。

 あと、定期受信のタイミングになった時にたまたま何らかのダイアログボック
スう出してるような状態だったとすると、そこからさらに10秒遅延して定期受
信しようとします。そのタイミングでまたダイアログボックスが出てたりすると、
また10秒延期になる、というようなことが発生します。

 なので、定期受信の間隔指定はある程度ぶれるというか、だいたいの目安くら
いにして欲しい所です。

> Q3
> 受信後のタイミングに自動起動マクロを設定した場合
> 次の定期受信はマクロ開始時刻から数えて1分なのか
> マクロ終了時刻から数えて1分なのかどちらでしょうか?

 マクロは、実は定期受信のタイマーが起動した後に実行されるようです。
 (実際にテストした訳じゃなくて、あくまでソースコードを調べた結果なので
100%間違いなくそうとは断言出来ませんけど)

> Q4
> 定期受信の間隔や設定をマクロで変更するのは可能でしょうか?

 レジストリを書き換えてEnvChanged関数呼び出しすれば可能ですけど、詳細は、
実際に「全般的な設定」をいろいろ書き換えてレジストリの値がどう変化するの
かを調べてやって欲しいです。

 定期受信をON/OFFすると、"AutoDown"のDWORD値が負の数/正の数を行き来す
るような動作になってるはずだと思います。

 関係するレジストリ値は、

static char szKey_fAutoDownOnline[] = "AutoDownOnline";
static char szKey_fAutoDownIcon[] = "AutoDownIcon";
static char szKey_fAutoDownRemoteMail[] = "AutoDownList";
static char szKey_fAutoDownSend[] = "AutoDownSend";
static char szKey_cAutoDownInterval[] = "AutoDown";
static char szKey_fAutoDownIntervalSecond[] = "AutoDownSec";

 この辺だと思います。

 あと、定期受信の対象アカウントは、アカウント毎の設定の方にあります。
GetAccountProp関数のヘルプを見ると掲載されてると思います。

[ ]
RE:36158 定期受信に関する質問No.36166
緒方聡 さん 09/05/12 16:06
 
いろいろとありがとうございます。

この質問の結果、何がしたかったかというと、

1. 送信前に定期受信をオフにする
2. 送信完了時に定期受信を元に戻す

という風にして、大きなメール(3 分ぐらいはかかる)
を送信中に定期受信が起動して、定期受信による
自動起動マクロと今すぐ送信の自動起動マクロが
衝突しないようにしたかったのですが、残念ながら
「送信後」というタイミングで自動起動マクロが
呼び出せないので定期受信の設定を元に戻せない、
ということがわかりました。


[ ]
RE:36166 定期受信に関する質問No.36167
秀まるお2 さん 09/05/12 16:29
 
 自動起動マクロの衝突については以前からもいろいろご指摘を受けてなんとか
したい思ってはいるんですが、根本的な解決をするためには、マクロを複数並行
して動作させるしかありません。

 アイデアの1つとしてですが、現状の秀丸エディタのマクロの仕組みとは別に、
独自のマクロインタープリタDLLのような物を用意して、それの上でマクロを実
行させる、という手はあるかもしれません。

 実行出来る命令および呼び出し可能なtkinfo.dllには制限が付くと思いますけ
ど。例えばEnvChanged関数とかエディタ・ウィンドウを起動するような物は一切
ダメですが。

[ ]
RE:36167 定期受信に関する質問No.36168
秀まるお2 さん 09/05/12 16:40
 
 ということで、参考までに、マクロで何をされてるのか教えて欲しい所です。

[ ]
RE:36168 定期受信に関する質問No.36169
秀まるお2 さん 09/05/12 17:38
 
 追加ですみません。

 いっそのこと、マクロの自動起動とは別に、「DLLの自動起動」なんて機能を
用意したら、そっちの方が簡単に解決したりしませんでしょうか。

 つまり、マクロでやっておられる内容を、VC++とかを使ってDLLにしてしまっ
て、そこでやってしまうということで、そうしていただければ、秀丸メール側と
しては、マクロの代わりにDLLをロードして関数呼び出しするだけという、簡単
な対応で可能です。

 マクロでやっておられる内容が、例えばメール内容の中身をいろいろいじって
ってことであるなら無理ですけど、tkinfo.dllの関数を呼び出して得られた情報
の加工などをするだけでしたら、ユーザー様作成のDLLも同じことが出来ると思
います。

[ ]
RE:36166 定期受信に関する質問No.36170
秀まるお2 さん 09/05/12 18:02
 
 何度もすみません。以前から言われているマクロの並行動作とは別の解決策が
思いついたので、別スレッド的に書かせていただきます。

 そもそもですが、エディタ・ウィンドウ上で「今すぐ送信」をやってる最中は
定期受信を止めてほしいということでしたら、それは技術的には簡単に対応でき
ます。

 もしそういうことで良ければオプション追加してもいいです。

 それか、「全般的な設定・定期受信」の「メール編集用のエディタが居ない時
のみ」というのが今既にあるんですが、それをONにしていても、結果として「今
すぐ送信」の最中は定期受信が動作しなくなります。

 それを使っていただくことで解決可能なら助かりますけど、別に「今すぐ送信
中は定期受信しない」というオプション追加ということでもいいです。

 オプションじゃなくて、標準でそういう動作にした方がいいかもしれません。

 ということでご意見お願いします。

[ ]
RE:36170 定期受信に関する質問No.36173
秀まるお2 さん 09/05/13 08:54
 
>  オプションじゃなくて、標準でそういう動作にした方がいいかもしれません。

 次のバージョンで、エディタ上で「今すぐ送信」をしている最中は、それが終
わってから(10秒くらい遅延させて)定期受信するように修正してみます。

 オプションじゃなくて標準でそういう動作にしてしまいます。

[ ]
RE:36173 定期受信に関する質問No.36184
緒方聡 さん 09/05/13 14:29
 
いろいろとありがとうございます。

少し長くなります、また多少脱線しますがお付き合いください。

僕の現在の秀丸の設定は 8 年ぐらいこつこつと積み重ねてきたものでして、デフォ
ルトの状態から実にいろいろな変更が加わっています。最たるものはキー割り当てで
して、Home や Enter 単体にもマクロが仕込んであります。

たとえば Home の場合、マクロによって Visual Studio のような動作をします。Ent
er の場合、プログラミング言語によって異なる自動インデントを実現しています。
そのほかにも Ctrl + Shift + 方向キーや Ctrl + S などにもマクロを仕込んでいま
す。

これらマクロは秀丸エディタでは非常に便利で、かつ問題になることはほとんどあり
ませんが、秀丸メールだとメール編集中に自動起動マクロととてもよく衝突してしま
います。

ここまでは以前お話したことがあると思います。

秀丸メールでは、メールを書くだけなので Home や Enter などの機能は必要ないの
ですが、秀丸メールのエディタと秀丸エディタで、個別にキー割り当てを設定するこ
とはできないため、今のところ Home や Enter などに割り当てているマクロは解除
しています。一部のキー割り当てマクロはそのまま残していますが、Home と Enter
のキー割り当てマクロを解除したので、自動起動マクロと衝突する確率はかなり減り
ました。

ただ、もうひとつ頻繁に衝突するのは送信中の定期受信です。僕の環境では、以下の
タイミングに自動起動マクロを仕込んでいます。

・秀丸メール終了時
・受信が一段落した時
・後で送信/今すぐ送信時
・送受信の開始直前

たぶん衝突しているのは「送受信の開始直前」だと思います。こんな感じです。

1. 大きな添付ファイルのメールを今すぐ送信する
2. 送信に 3 分かかる(プログレスバーが進捗している)
3. 定期受信が動作してしまう
4. 『他のウィンドウ上での送受信が終わるまで待機しています。』と出る
5. このダイアログは放置しておく
6. メール送信のプログレスが 100% になる
7. 『秀丸メール本体側がマクロ実行中なので、このウィンドウ上での処理が続行で
きません。マクロが終了するのを待ってからOKボタンを押すか、マクロを中断させて
からOKボタンを押してください。または、「キャンセル」ボタンを押すと、マクロの
終了を待たずに無理矢理処理を続行します。(非常用)』と出る

ここで、本体側はエディタ側の終了を待って、エディタ側は本体側が待っているから
終われない、というデッドロックが発生してしまっているように思えます。

8. 本体側をキャンセルする
9. 『tkinfo.dll: 送受信している最中にEnvChanged関数が呼ばれました。EnvChange
d関数は失敗しました。』と出るが OK で閉じる
10. プログレスのメッセージが「エラーによる中断」となることがあり、『秀丸メー
ル本体側がマクロ実行中なので・・・』というダイアログの OK を押しても、メール
が送信されない

こうなると、送信を最初からやり直さなければなりません。この際、定期受信を一時
的に OFF にするのですが、ON に戻すのを忘れて、半日メールが来ないのでおかしい
な、なんてことがよくあります。エラーによる中断は、なるときとならないときがあ
り、条件はよくわかりません。

とりあえずこれを解決したかったので、定期受信に関する質問をさせていただきまし
た。次期バージョンで今すぐ送信中に定期受信が行われないような動作になるなら、
上記のような衝突は発生しなくなるのではないかと思います。

ここからは脱線しますが・・・、

メールエディタがあるときは定期受信しない、というオプションを紆余曲折ありつつ
作っていただいたのですが、現在このオプションは僕自身使用していません。僕の
メールの使い方は、受信したメールはすぐに目を通して、返信が必要なメールは返信
用のメールエディタをとりあえず開きます。たとえば朝 10 通メールを受信していて、
そのうち 5 通に返信が必要なら、返信用メールエディタは 5 画面開いておきます。
そして、順番に返信メールを書いて返信します。メールによっては、添付ファイルを
作成しなければならなかったりして、また質問に対する調査を行わなければならなか
ったりして、1 通返信するのに数時間かかることもあります。その間メールが受信で
きないのはかなり痛いです。ということで、せっかく作っていただいたオプションで
すが、うまく使いこなせていません。


> いっそのこと、マクロの自動起動とは別に、「DLLの自動起動」なんて機能を
> 用意したら、そっちの方が簡単に解決したりしませんでしょうか。

これはすごくいいですね。

今自動起動マクロでやっていることはこんな感じです。

・秀丸メール終了時
   - filterlog.txt の設定を元に戻す(必要があれば)
   - filterlog.txt を削除する
・受信が一段落した時
   - filterlog.txt の設定を元に戻す
   - 独自の実行ファイルを起動する
    + 秀丸メールの受信ログをまさぐる
    + filterlog.txt をまさぐる
    + 受信したメールをトーストでお知らせ
・後で送信/今すぐ送信時
   - 誤爆(間違って別の人にメールを送る)をチェック
・送受信の開始直前
   - filterlog.txt が作成されるように設定を変更する(EnvChanged)
   - 受信ログが作成されるように設定を変更する(SetAccountProp)
   - 独自の実行ファイルを起動する
    + マクロの INI ファイルを更新する

送受信の開始直前で filterlog.txt を作成するために EnvChanged を呼び出してい
るのですが、これは秀丸メール起動時に処理を移せば問題ないかも知れません。一時
的な設定を秀丸メール起動中ずっと反映させておくのはちょっとだけ気持ち悪いです
けど。

秀丸メールを使用する前は Becky! を使用していました。Becky! のプラグインはイ
ベントをフックする形になっていて、かつ API も提供されていてやりたい放題なの
で、かなり便利でした。

DLL を作ってまで動作をアレンジしたいマクロ製作者は少数だと思いますが、僕はも
しイベントを DLL でフックできるのであれば、是非使用したいと思います。

さらに話は脱線するのですが・・・

秀丸では HTML メールの IE コンポーネント等による表示はサポートしていないのは
理解しています。僕自身 HTML メールというものは受信することはあっても送信する
ことはありません。ですが、最近では受信するメールの約半数が HTML メールです。
これまでは添付されている HTML メールをダブルクリックして内容を確認することが
多かったのですが、この HTML には charset の指定がなく、たとえば GB2312 の
メールなどはダブルクリックで表示させると確実に文字化けします。charset はメー
ルのヘッダに持っていて、HTML パートだけでは完結していないためです。どのよう
に表示させるのが一番よいかというと、今のところ Outlook Express で表示させる
ことです。ただ、Outlook Express で表示させるのは結構手間がかかるので、専用プ
ログラムを開発してそれで表示させたいと考えています。

考えている動作はこんな感じです。

1. 秀丸メール本体で表示しているメールが切り替わったら
2. そのメールが HTML パートを持つか持たないかを判断し
3. もし HTML パートを持つなら、専用ビューアで表示させる

最初の障害が 1 のメールが切り替わったら、という部分ですが、現時点ではこのタ
イミングをマクロないし専用プログラムで検知する方法がありません。次は、2 の表
示されているメールが受信ログのどのファイルのどこを表示しているかがわかりませ
ん。以前、秀丸メール本体でメールを選択させるためには、起動引数に受信ログのパ
スとインデックスを渡せばよいと教えてもらったのですが、今回のケースでは選択さ
れているメールのファイルパスとインデックスを何らかの方法で知りたい、という具
合です。

上記が解決できれば、後はビューアを作るだけ(といっても大変ですが)なので、な
んとかなります。


内容が四散してしまい申し訳ありません。必要があれば別スレッドを作成します。

[ ]
RE:36184 定期受信に関する質問No.36185
秀まるお2 さん 09/05/13 15:07
 
 実はお返事をいただく前に勝手に作業を進めていました。

 まず、マクロの代わりにDLLを呼び出す機能を作ってしまいました。

 それで、とりあえずサンプルとして何かDLLを作ろうと思って、緒方聡さんの
ハンドル名で検索してみたら、hidebiffが見つかりました。なのできっとこのマ
クロをDLLで実現出来ればいいのだと思って中身を調べさせていただきましたが、
簡単でないことが分かりました。

 マクロでやられている内容で一番難しいのが、まず、EnvChangedを呼び出され
ているという点でした。これはマクロのデッドロックの問題とも関係しますが、
秀丸メールにとってはかなりつらいというか、送受信系の動作とは排他的に実行
しないとダメな関数です。なので、これを使わないでなんとかしてほしいと思い
ました。

 それと、hidebiff.exeさんの方でやられてるのだと思いますが、振り分けログ
からメール用ファイルを直接アクセスされて、それでメール本文を取得されてる
のだろうと思います。これを僕がサンプルプログラムとして作るのは至難の業で
す。

 なので、ちょっと卑怯な作戦になりますが、tkinfo.dllに

   GetLastRecvMailBodyTop

 という関数を追加してしまいました。これと、他のGetLastRecvMailXXXX系関
数を使えば、直前に受信したメールのおおよその内容を、メール用ファイルにア
クセスしなくても簡単に取得出来ます。

 あとは、それで取得した情報を使ってToastNotifyを呼び出してやればいいと
思いました。

 ということで、今そのサンプルプログラムを作ってる最中です。

 それが出来ればソースコードごと見ていただきたいと思います。

 もしかして上記のような作戦でダメな点があればご指摘いただきたいと思いま
す。

 (ちなみに現状分かっている問題点として、欧文や中国語のメールは化けてし
まってたりします)

----------------------------------------------------------------------

 それと、HTMLメールの表示についてですが…。

 とりあえず思いつくこととしては、今回追加したようなDLL自動呼び出しみた
いなことを、例えばメールを表示した直後のタイミングで呼び出すような仕組み
があったらいいのかもしれません。

 DLL側では、tkinfo.dllをLoadLibraryして、MailFilePathやMailFileOffset関
数を呼び出せば、それでメール用ファイルへ直接アクセスすることも出来ます。
HTMLファイルのファイルも、HomeDir, CurrentAccountおよびCurrentHeaderでX-
Html:ヘッダの内容を取得して加工するなどすればいいかと思います。

 ということで、そういう自動起動の仕組みも対応してもいいと思います。

 緒方聡さんのような優れたプログラマーの方が使っていただけるということで
あれば、僕もやりがいがあります。

 とりあえずは定期受信のマクロ自動実行代替の自動実行DLLについて作ってみ
て、それがうまくいくようなら次のテーマとして対応したいと思います。

[ ]
RE:36185 定期受信に関する質問No.36186
秀まるお2 さん 09/05/13 18:21
 
 ということでサンプルDLLと、DLL呼び出し対応のV5.16β33をアップロードし
ました。

 お時間のある時にでも一回見てみてほしいです。

  http://hide.maruo.co.jp/software/tk.html

 上記ページの下の方にV5.16β33とサンプルDLLがあります。

 あと、この辺の機能追加について、秀丸メール側の修正量は非常に小さいです。
なので、とりあえずこの辺の機能を将来どうするかは別として、秀丸メールは
近々正式版にしようと思います。

 (長らくβテストばっかりやってて正式版出して無いので)

[ ]
RE:36186 定期受信に関する質問No.36187
秀まるお2 さん 09/05/13 18:30
 
 それと、説明不足だったのでまた追加で書かせていただきますと…

 DLLをマクロの代わりに呼び出すには、マクロファイル名を指定する所で、

 DLL:ファイル名

 のように書けばいいです。「マクロ・マクロ実行...」の所でもこの指定が使
えるようにしています。

 関数名も指定したい場合は、

 DLL:ファイル名,エントリー名

 となります。

 例えばサンプルの例だと、

 DLL:AfterRecvSample.dll,Clear

 のようにすると、バッファにたまった通知情報をクリアしたりします。

[ ]
RE:36187 定期受信に関する質問No.36189
秀まるお2 さん 09/05/14 10:07
 
 すみません。次の正式版でちょっと仕様変更します。

>  DLL:ファイル名

 「DLL:」じゃなくて、「DLL|」にします。

 「DLL:xxxx」だと、副ストリームという形式のファイル名の指定と解釈出来な
くもないということで、いまいち都合が悪いという秀丸担当の話です。

参考:hidesoft.2:26018| 副ストリームとgrep結果画面に関して

[ ]
RE:36189 定期受信に関する質問No.36190
秀まるお2 さん 09/05/14 11:22
 
 それとまた追加ですが…

 V5.16β33で、「DLL:ファイル名,エントリー名」の指定はうまく機能してませ
んでした。エントリー名を指定しても"Entry"が呼ばれてしまってました。

 これまた次の正式版で直します。

[ ]
RE:36184 定期受信に関する質問No.36194
秀まるお2 さん 09/05/15 16:23
 
 V5.16正式版をアップロードした落ち着いたのでちょっと検討してみました。

> これまでは添付されている HTML メールをダブルクリックして内容を確認することが
> 多かったのですが、この HTML には charset の指定がなく、たとえば GB2312 の
> メールなどはダブルクリックで表示させると確実に文字化けします。charset はメー
> ルのヘッダに持っていて、HTML パートだけでは完結していないためです。

 とりあえず、秀丸メールがhtmlパート用ファイルを生成する時に、Content-
Type:ヘッダにあるcharset=の指定からmetaタグを生成して、それをhtmlパート
に埋め込む、という作戦を考えました。

 それをやってみます。

 HTMLメール中にmetaタグが入ってない場合に限って自動的に埋め込むようにす
ればいいのだろなぁと思います。

 それと、htmlメールを表示する用のプラグインみたいな物も考えてみます。具
体的には、

 1.特定送り主+特定発信元IPアドレスとか、それなりの条件にマッチした
   物に限って自動でhtml形式表示することが出来るような、安心設計にする。
 2.万が一のためもあるので、秀丸メールとは別プロセスで表示する。
 3.出来れば(仕組み的に可能ならば)htmlメールを表示するプロセスが
   ハードディスクのファイルへ書き込みアクセスやレジストリの書き換え等
   が出来ないようにする。
   (どうやったらそういうことが可能なのかはよく分からないけど、
    その辺調べてみたい)

 ってな具合です。IEコンポーネントを使えば簡単に出来るんじゃないかとは思
いますけども、全然知識が無いので、その辺の勉強からやろうと思います。

[ ]
RE:36194 定期受信に関する質問No.36210
緒方聡 さん 09/05/18 10:58
 
お世話になります。

> とりあえず、秀丸メールがhtmlパート用ファイルを生成する時に、Content-
>Type:ヘッダにあるcharset=の指定からmetaタグを生成して、それをhtmlパート
>に埋め込む、という作戦を考えました。
>
> それをやってみます。

これは僕がやろうとしていた内容と同じですね。


> それと、htmlメールを表示する用のプラグインみたいな物も考えてみます。具体
>的には、
>
> 1.特定送り主+特定発信元IPアドレスとか、それなりの条件にマッチした
>   物に限って自動でhtml形式表示することが出来るような、安心設計にする。

なるほど。
僕のところにはいわゆる迷惑メールという類のものが
届いたことが無いので、もし僕が作ったら、この辺の
考慮はされなかったでしょうね。
環境が変わったら僕も必要になる機能なので、これは
大切なことだと思います。


> 2.万が一のためもあるので、秀丸メールとは別プロセスで表示する。

これは僕もそうなりますね。
僕が作ったら、たぶん常駐させると思います。


> 3.出来れば(仕組み的に可能ならば)htmlメールを表示するプロセスが
>   ハードディスクのファイルへ書き込みアクセスやレジストリの書き換え等
>   が出来ないようにする。
>   (どうやったらそういうことが可能なのかはよく分からないけど、
>    その辺調べてみたい)
> ってな具合です。IEコンポーネントを使えば簡単に出来るんじゃないかとは思
>いますけども、全然知識が無いので、その辺の勉強からやろうと思います。

僕が HTML メールを表示させるマクロ(というかプログラム)を
作ろうと思ったのは、ひとつは自分の利便性のためですが、
もうひとつは WebKit を勉強したいからです。かなり前に
一度取り組んだのですが、そのときはエンジンのビルドは
できたけど、なぜか API 仕様がどこにも見つからず、
みんなどうやってコーディングしてるんだろう、と不思議に
思いつつ時間がなくなって中座しました。

僕は僕でやってみようかなぁ、とも思いますが、本家の正式版が
用意されるのなら、どうしようかなぁ、とも思います。
もし秀まるおさんが WebKit を使われるのであれば、協力して
開発したいです。

[ ]
RE:36210 定期受信に関する質問No.36211
秀まるお2 さん 09/05/18 12:19
 
 HTMLメールのmetaタグ埋め込みについては次のβ版で対応しますので、もしよ
かったらそれを使っていただいて、状況を教えていただけると助かります。

 HTMLメール表示用のプラグインは、しいて一般ユーザーさんに使っていただけ
るレベルの物を提供するならば、サイトー企画で責任を持って作った方がいいか
なぁと思います。ということで自分でやろうと思います。ただし、可能ならば
ソースコード公開はしようと思います。

 それよりも、hidebiffのDLL版作ってほしい所です。僕のサンプルプログラム
を参考にすればなんとか作っていただけるのではないかと思います。

http://hide.maruo.co.jp/software/bin3/afterrecvsample1.lzh

[ ]
RE:36211 定期受信に関する質問No.36216
緒方聡 さん 09/05/19 11:58
 
> それよりも、hidebiffのDLL版作ってほしい所です。僕のサンプルプログラム
>を参考にすればなんとか作っていただけるのではないかと思います。
>
>http://hide.maruo.co.jp/software/bin3/afterrecvsample1.lzh

コードを拝見させていただきました。
私もDLL版を作成するタイミングでコードを公開しようと思います。

[ ]
RE:36211 定期受信に関する質問No.36217
緒方聡 さん 09/05/19 17:36
 
> HTMLメールのmetaタグ埋め込みについては次のβ版で対応しますので、もしよ
>かったらそれを使っていただいて、状況を教えていただけると助かります。

5.16 正式版で HTML メールを受信したので、HTML を確認して
みましたが、meta タグは含まれていませんでした。
現在は以下の
  <body>(ここ)</body>
(ここ)という箇所しか HTML には含まれていないのですが、やるなら
  <header><meta ...></header>
  <body>
  (ここ)
  </body>
という風になるんでしょうか。
送り元は Gmail なので、僕が御社にテストメールを送ることは可能です。

[ ]
RE:36217 定期受信に関する質問No.36218
秀まるお2 さん 09/05/19 18:02
 
 metaタグを自動的に埋め込むようにするのは、次のβ版からです。

 V5.16正式版には間に合いませんでした。

 手元では動いているので明日にでもアップロードさせていただきます。

>   (ここ)
>   </body>
> という風になるんでしょうか。

 <head>タグも無い場合は<head>〜</head>も入れるようにしました。

 <html>自体が無い場合は問題外にしますけど。あと、一応

 <!-- HidemaruMail inserted -->

 というこコメントも埋め込むようにしました。

[ ]
RE:36190 定期受信に関する質問No.36754
緒方聡 さん 09/08/05 21:51
 
お世話になってます。

ようやく時間が取れたので、
マクロの DLL 化を行っています。

ふたつ質問があります。

■ SetAccountProp について
DLL 内部からこの関数を使用したいのですが、
プロトタイプがわかりません。
今のところ以下のようにしていますが、
正しいですか?

  int (_cdecl * SetAccountProp)(const char *propName, void *value); // これ
でいいのか?

TKInfo.chm を見て、文字列を渡す場合は const char * を、
数値を渡す場合は int にしていますが、SetAccountProp は
どちらもアリなので void * なのかなぁ、と思いました。
呼び出し方はこんな感じですか?

  SetAccountProp("fRecvLog", (void *)1);

いただいたサンプルでは char * でしたが、const char *
なんじゃないかと勝手に思っていますが、正しいでしょうか?

以前以下で関数コードを教えていただいたのですが:
  http://www.maruo.co.jp/hidesoft/4/x05619_.html#5619
プロトタイプもこのように並べられていると大変ありがたいです。


■ GetTransmitCommandCode について
DLL は「送受信の開始直前」から呼び出していますが、
DLL 内ではこの関数が 0 を返すため、
処理の振り分けができずに困っています。
今の動作はある意味仕様通りなのかなぁ、と思いますが
だとすると、どのようにすればよいでしょうか?


[ ]
RE:36754 定期受信に関する質問No.36758
秀まるお2 さん 09/08/06 10:33
 
 SetAccountPropですが、僕のソースコード上では、

extern "C" int SetAccountProp( char* pszName, int nValue );

 のように宣言されてます。ただし、nValueの所には実際には文字列が入ること
もあるので、そういう場合は、

    char*   pszValue = (char*)nValue;
    if( IsBadString( pszValue ) ) {
        return FALSE;
    }

 みたいな感じでキャストして使ってます。


 void*と宣言してもいいし、とにかく4バイトの物なら何でもいいです。

 ちなみに将来64bit版対応させるためにはINT_PTRとすべきかもしれませんけど、
今のところそういうことはまったくやってないです。


 それと、「const」もほとんど使ってません。本当は、
「const char* pszName」のように宣言すべきですけども、僕は古いプログラ
マーなので、あんまりconstキーワードは使ってないです。ですが、渡された文
字列パラメータの中をtkinfo.dll側で勝手に書き換えるようなことは無いはずで
す。

> ■ GetTransmitCommandCode について
> DLL は「送受信の開始直前」から呼び出していますが、
> DLL 内ではこの関数が 0 を返すため、
> 処理の振り分けができずに困っています。

 すみません。調べてみたらバグでした。コマンドコードの値をセットする前に
DLLを呼び出してしまってました。

 次のβ版で修正させていただきます。

[ ]
RE:36758 定期受信に関する質問No.36764
秀まるお2 さん 09/08/06 13:44
 
 バグ修正してアップロードしました。

http://hide.maruo.co.jp/software/bin2/hmmail521b6_signed.exe

 ということでまたお願いします。

[ ]
RE:36764 定期受信に関する質問No.36766
秀まるお2 さん 09/08/06 17:28
 
 ちなみについでなんで、僕がconstキーワードをあんまり使わない理由の1つ
として、例えば

    char* SkipTab( char* pch ) {
        while( *pch == '\t' ) {
            pch ++;
        }
        return pch;
    }

 のようなタブをスキップする関数があったとして、それを、

 char* pchV = "....";
 pchV = SkipTab( pchV );

 のように使う分にはいいんですが、

 const char* pchC = "....";
 pchC = SkipTab( pchC );

 のように使うとコンパイルエラーになってしまう、という不便な問題がありま
す。

  const char* SkipTab( const char* pch ) { return (const char*)SkipTab( (cha
r*)pch ); };

 みたいなオーバーライド関数も用意すればうまくコンパイルが通るようですけ
ど、そんな関数1つ1つ全部用意するの面倒なので、結局全部「char*」にしち
ゃったりします。

 何かいい宣言方法って知りませんか?(誰か)

 (もしかして僕はC++初心者級?)

[ ]
RE:36766 定期受信に関する質問No.36767
アルビレオ さん 09/08/06 18:37
 
アルビレオです。

一応、「アドレスは変更するけどアドレスが指しているデータの方は変更しな
い」という場合は
  char const* str
という宣言を使えます。以下のような感じで。

    char const* SkipTab( char const* pch ) {
        while( *pch == '\t' ) {
            pch ++;
        }
        return pch;
    }

としておけば、SkipTab()に const char* の変数を渡してもエラーになりません。
SkipTab() 側で pch のアドレスを変更しても、元の const char* 変数には影響
がないので。

ただし、この場合返り値も char const* 型にする必要があるため、返されたポ
インタが指しているデータを変更したい場合は使えません。
また SkipTab() 内部で別の関数の引数として pch を渡したい場合に、その関数
の引数が char* 型だとダメですね。

const キーワードは「変更するつもりのなかった変数をうっかり変更しようとし
た」場合などにコンパイラがエラーを出してくれるので便利ではありますが、余
分な作業を増やしてまで積極的に使うほどのものではないと思います。

ちょうど秀まるおさんが例にあげた
>  const char* SkipTab( const char* pch ) { return (const char*)SkipTab( (cha
r*)pch ); };
みたいなことができてしまうことも、コンパイラから見れば「const 型であれば
変更されないという前提による最適化」ができないわけなのでちょっと const
の価値を下げています。

たとえば
    int SkipTab( const char* pch ) {
        int idx;
        while( pch[idx] == '\t' ) {
            idx ++;
        }
        return idx;
    }
みたいに、「constオブジェクトを使っている範囲をコンパイラが完全に把握で
きる」場合なら積極的に最適化してくれるんでしょうけど。

[ ]