秀丸メールマクロのSaveStringToFile関数No.48988
ママラッチ さん 15/12/25 18:28
 
お世話になります。初めて投稿させていただきます。

特定のメールアドレスからの受信メールの本文をローカルにテキストファイルで自動
で保存する方法がないかと調べていたところ、秀丸メールの存在を知り、現在ヘルプ
を見ながらマクロ作成に挑戦しているのですが、メール本文を取り出すところまでは
なんとか出来たのですが、テキストファイルに保存するところでつまづいてしまいま
した。

ヘルプによると、SaveStringToFile関数を使えば文字列型変数をテキストファイルに
保存できそうだったので試してみたところ、マクロ実行するとエラーは出ずに一応終
了はするのですが、テキストファイルは作成されませんでした。dllfuncstrとdllfun
cのどちらを使うべきかわからなかったので、両方試してみましたが、両方とも戻り
値以外は同じ挙動でした。
(ちなみに戻り値はdllfuncstrの時は""で、dllfuncの時は0でした)

※実行例
loaddll "TKInfo.dll";
$s = dllfuncstr("SaveStringToFile", "C:\\abc.txt", "本文", 0, 0);
#n = dllfunc("SaveStringToFile", "C:\\abc.txt", "本文", 0, 0);

上記以外にもパラメータやファイルパスなどをいろいろ変えてみたのですが、どうし
ても自力では間違いを見つけられませんでした。

基本的な質問で大変恐縮ですが、ご教示のほどよろしくお願いします。

[ ]
RE:48988 秀丸メールマクロのSaveStringToNo.48989
秀まるお2 さん 15/12/26 10:00
 
 SaveStringToFile関数について説明不足ですみません。

 まず、SaveStingToFile関数は、dllfuncで呼び出す形になります。(サンプル
が1つも書いてないのでわかりにくかったですが)

 あと、返り値は数値型で、成功したら1、失敗したら0が返ります。

 呼び方の例は、

    #n = dllfunc("SaveStringToFile", "C:\\abc.txt", "本文", 0, 0);

 みたいになります。

 これが失敗する理由ですが、実はWindows Vista以降から、Cドライブのルート
には管理者権限が無いと書き込みアクセスが出来なくなってまして、C:\に書き
込む処理は失敗してしまいます。

 ちなみにエラーコードを取得する用のBypass_GetLastErrorって関数もありま
して、例えば

    #n = dllfunc("SaveStringToFile", "C:\\abc.txt", "本文", 0, 0);
    if( #n == 0 ) {
        #n = dllfunc("Bypass_GetLastError");
        message str(#n);
    }

 って書くと、エラーコードが5と出てきまして、それをネットで調べると、
ERROR_ACCESS_DENIEDということが分かります。

    http://ir9.jp/prog/ayu/win32err.htm

 ということで、保存先を他のフォルダ、例えばC:\に「test」ってフォルダを
作ってそこを指定するとうまくいきます。

 といいう作戦で大丈夫だと思います。

 ヘルプの方は修正させていただきます。

[ ]
RE:48989 秀丸メールマクロのSaveStringToNo.48993
秀まるお2 さん 15/12/26 11:29
 
 問い合わせいただいた内容とは別になりますが、テストしてたら1つバグを見
つけてしまいました。SaveStringToFile関数の第4パラメータに1を指定すれば
UTF-16形式て保存できると書いてありまが、うまく動いてませんでした。

 ファイルの前半半分しか保存されてませんでした。

 次のV6.50β7で修正させていただきます。

 Shift-JIS形式で保存する方はうまく動くと思います。

[ ]
RE:48989 秀丸メールマクロのSaveStringToNo.48994
ママラッチ さん 15/12/26 17:42
 
ご確認いただきありがとうございます。

先ほどお教え頂いた通りに確認してみたところ、ファイル作成できず失敗してしまい、
Bypass_GetLastErrorにて127が返ってきました。
これはもしかすると私の動作環境に何か問題があるということでしょうか?
ちなみにOSはWindows8.1で、試しに別のWindows7のPCでも確認してみましたが同様に
Error127でした。

以上、度々お手数をお掛けしますが、ご確認のほどよろしくお願いします。

[ ]
RE:48994 秀丸メールマクロのSaveStringToNo.48996
秀まるお2 さん 15/12/28 09:24
 
 エラーコード127は、すみませんが原因がよく分かりません。

 例えば、

    loaddll "tkinfo.dll";
    $home = dllfuncstr("HomeDir");
    $file = $home + "temp.txt";
    #n = dllfunc("SaveStringToFile", $file, "本文", 0, 0);
    if( #n == 0 ) {
        #n = dllfunc("Bypass_GetLastError");
        message str(#n);
    } else {
        message $file + " への保存に成功しました。";
    }
    #n = dllfunc("Bypass_DeleteFile", $file );

 のマクロを実行してもやはりエラーが出るでしょうか。

 もし上記のマクロでエラーが出ないなら、エラーの出るマクロの中身を教えて
いただければ、何がおかしいかお返事できると思います。

[ ]
RE:48996 秀丸メールマクロのSaveStringToNo.48997
ママラッチ さん 15/12/28 13:50
 
ご確認ありがとうございます。

さっそく記載していただいたコードを実行してみましたが、残念ながらこちらでもダ
メでした。
もし原因調査が難しいようでしたら、SaveStringToFile関数の使用は諦めますので、
何か別の方法がありましたらお教えいただけないでしょうか?
(例えば秀丸エディタのマクロを使って秀丸メールマクロを実行するなど、秀丸メー
ルマクロ内で完結する方法以外でも全然構いません。)

以上、度々お手数をお掛けして申し訳ありませんが、よろしくお願いします。

[ ]
RE:48997 秀丸メールマクロのSaveStringToNo.48998
秀まるお2 さん 15/12/28 14:11
 
 すみません。こちらでも、別のマシンでテストしたら127のエラーが出ました。

 調べてみたら、なんと、僕の手元にあるデバッグバージョンでしか
SaveStringToFile関数がうまく動かないようになってしまってました。

 大変失礼しました。

 次のVersion 6.50β7にて修正させていただきますので、すみませんがそれま
でちょっと待って欲しいです。今日か明日にアップロードできると思いますので。

[ ]
RE:48998 秀丸メールマクロのSaveStringToNo.48999
ママラッチ さん 15/12/28 14:24
 
ありがとうございます。原因が判明してよかったです。修正版お待ちしております。

[ ]
RE:48998 秀丸メールマクロのSaveStringToNo.49004
ママラッチ さん 15/12/29 16:22
 
いつもお世話になっております。

hmmail650b7_signedにて正常にファイル保存できることを確認しました。(Windows7
 64bit及びwindows8.1 64bitにて実施)

ただ動作確認中に気になった点があるのですが、UTF-16にて追記する際に半角スペー
スが追記文字列の先頭や中に紛れ込んで書き込まれていました。(新規作成は特に問
題なし。またShif-JISは新規/追記ともに問題なし。)

以前UTF-16の書き込みにバグがあるとおっしゃっていたので、その問題が未修整なだ
けなのかもしれませんが、一応ご報告しておきます。
(ちなみに私個人的にはShift-JISしか使いませんので、今回の修正版で全く問題は
ありません。)

以上、この度は迅速なご対応ありがとうございました。

[ ]
RE:49004 秀丸メールマクロのSaveStringToNo.49005
秀まるお2 さん 15/12/29 16:50
 
> ただ動作確認中に気になった点があるのですが、UTF-16にて追記する際に半角スペー
> スが追記文字列の先頭や中に紛れ込んで書き込まれていました。

 すみません。これまたバグのようでした。テスト漏れでした。

 UTF-16で保存する時に、ファイルの先頭に「BOM」と呼ばれる2バイトの
データを書き込む必要があるんですが、追記の場合でも間違ってこのBOMを書き
込んでしまってました。

 また修正させていただきます。

[ ]