変換モジュール(〜.hmf)についてNo.05108
kiki さん 06/03/22 16:58
 
サイトー企画御中

一般ユーザのkikiです。
いつもお世話になります。

表題の件、マクロじゃないけど・・・。
発言させていただきます。(大丈夫かな?)

質問1:GlobalAllocされた領域の開放

モジュール開発キットを読むと、リターンがHGLOBALなのですが、
当方で作成したモジュールでGlobalAllocしてリターンして、
秀丸エディタ殿は画面へ張りつけた後、開放はしていただいている
と考えて大丈夫でしょうか。

添付のTXT、会議室の発言検索は見たつもりですが分りませんでした。
※また、GlobalAllocの仕様を当方が満足に理解していなくて、
  「mallocと違って、平気」という落とし穴も気になったのです
  が「聞くは一時の恥」と思って書きこませていただきました。

当方の変換モジュール呼ぶと「メモリリークする」とか言われたく
ありませんですです。^^;ガハハ。

質問2:

当方、VC++6.0なのですが、MFC(libリンクするつもり)での開発は
問題無いでしょうか。(推奨はVC5.0?)
(問題無いとは思うのですが・・・。念のため。)
・・・、とリリースできたらREADMEに入れればいいかな?

閑話休題

マクロと違って、変換モジュールはソースが見れませんね。
検証は・・・。ってマクロでもDLL呼べるか。失礼しました。

よろしくお願いいたします。

以上です。

[ ]
RE:05108 変換モジュール(〜.hmf)についNo.05110
秀丸担当 さん 06/03/23 10:25
 

>質問1:GlobalAllocされた領域の開放
>
>モジュール開発キットを読むと、リターンがHGLOBALなのですが、
>当方で作成したモジュールでGlobalAllocしてリターンして、
>秀丸エディタ殿は画面へ張りつけた後、開放はしていただいている
>と考えて大丈夫でしょうか。

変換モジュールが返したHGLOBALのハンドルは、秀丸エディタで貼り付けをした
後、解放しています。
変換モジュールが解放の処理を行う必要は無いです。

>質問2:
>
>当方、VC++6.0なのですが、MFC(libリンクするつもり)での開発は
>問題無いでしょうか。(推奨はVC5.0?)
>(問題無いとは思うのですが・・・。念のため。)
>・・・、とリリースできたらREADMEに入れればいいかな?

たぶん大丈夫だと思いますが、MFCでDLLを作ったことが無いので何か予測してい
ないことがあるかどうかわかりません。
秀丸エディタとしては、LoadLibraryしてGetProcAddressで得られる関数を呼び
出しているというただそれだけです。
マルチスレッドかどうかの区別があるとしたら、いまのところ秀丸エディタはシ
ングルスレッドです。

試しに作ってみたところ動きました。
CStringで操作するようなものは特に何も気にせず動きました。
メッセージボックスを使ってみたら、AFX_MANAGE_STATE みたいなことをしない
と動きませんでした。

[ ]
RE:05110 変換モジュール(〜.hmf)についNo.05111
kiki さん 06/03/23 15:13
 
秀丸担当殿
いつもお世話になります。

情報、ありがとうございました。

特にMFCについては、実験までしていただいたご様子。
お忙しい中、お手数をお掛けしました。m(_"_)m

※CStringが使えるみたいで、ホッ。8^.^8
  当方、UNIX-Cはやってたのですが、WindowsはMFC
  パーペキオンリーなので、助かりました。

また、今後もお世話になるかもしれませんが、
よろしくお願いいたします。

以上です。

[ ]
RE:05110 変換モジュール(〜.hmf)についNo.05112
kiki さん 06/04/03 15:44
 
一般ユーザのkikiです。
いつもお世話になります。

今、変換モジュールをアップしました。
アップした後に少し気になったのですが・・・。

「MFCについて」
>メッセージボックスを使ってみたら、AFX_MANAGE_STATE みたいなことをしない
>と動きませんでした。

当方、MFCをスタティックリンクして作成しました。

上記アドバイスをコロっと忘れて動かしていたのですが、大丈夫でしょうか?
※大丈夫だとは思うのですが・・・。
  見た目は、問題無く動いています。

以前、VBから呼び出すDLLを作成する時は必要だった経験はあります。
^^;

検証に必要でしたら、ソースもお送りいたします。

よろしくお願いいたします。

[ ]
RE:05110 変換モジュール(〜.hmf)についNo.05113
kiki さん 06/04/03 16:01
 
一般ユーザのkikiです。
いつもお世話になります。

以下、変換モジュールを作っての要望というか・・・。
ちょっと情報が少なかったので、当方で気づいた点を。

1.先に要望(過去形)
    変換モジュールでエラーなどで上位関数へのリターンする時、
    毎回GlobalAllocして、入力文字列を複写して返さなければ
    いけない。
    可能なら、処理正常か失敗かのフラグを返すだけにさせて
    もらえると楽だった・・・。
    (インタフェースの変更は難しいですね。)

2.次も要望(現在進行形)
    秀丸エディタへのメッセージが、TAB関連しか分からない。
    (HIDEMARUINFO_GETTABWIDTHなど。)

    可能なら、他の秀丸エディタの設定値を取得するメッセージ
    や、タブ→空白変換の処理を呼ぶメッセージが知りたかった。

3.文字コード
    プログラム自体はS-JISで開発だったのですね・・・。
    コンパイルオプションを、_MBCSから_UNICODEへ変更して
    「楽チン〜」って喜んでたら、処理後にリターンして落ち
    ました。T.T
    (歴史があるのだから、そらそーか。)

4._cdeclが必要・・・?

などなど。

「マクロ→DLLへ文字列を渡す引数ってどうなっているのだろう」
と思っていて、調べもしなかった私なのですが・・・。^^;

ありがとうございました。

以上です。

[ ]
RE:05112 変換モジュール(〜.hmf)についNo.05114
秀丸担当 さん 06/04/03 18:30
 

>「MFCについて」
>>メッセージボックスを使ってみたら、AFX_MANAGE_STATE みたいなことをしない
>>と動きませんでした。
>
>当方、MFCをスタティックリンクして作成しました。
>
>上記アドバイスをコロっと忘れて動かしていたのですが、大丈夫でしょうか?
>※大丈夫だとは思うのですが・・・。
>  見た目は、問題無く動いています。

動いているのならば大丈夫なのではないかと思います。
AFX_MANAGE_STATEはMFCのDLLを使っているときだけっぽいので、大丈夫なのでし
ょう。
私も今回初めてさわったくらいなので。

[ ]
RE:05113 変換モジュール(〜.hmf)についNo.05115
秀丸担当 さん 06/04/03 18:51
 

>1.先に要望(過去形)
>    変換モジュールでエラーなどで上位関数へのリターンする時、
>    毎回GlobalAllocして、入力文字列を複写して返さなければ
>    いけない。
>    可能なら、処理正常か失敗かのフラグを返すだけにさせて
>    もらえると楽だった・・・。
>    (インタフェースの変更は難しいですね。)

NULLを返すと何もしないはずです。
どうでしょうか。


>2.次も要望(現在進行形)
>    秀丸エディタへのメッセージが、TAB関連しか分からない。
>    (HIDEMARUINFO_GETTABWIDTHなど。)
>
>    可能なら、他の秀丸エディタの設定値を取得するメッセージ
>    や、タブ→空白変換の処理を呼ぶメッセージが知りたかった。

もともとあった変換のタブ→空白変換のためにそれら関係のだけがあります。
変換モジュールだけのために全ての設定の取得をサポートするのは大変なので、
要望があれば要望の対応と、もし汎用的なものがあったほうがよさそうであれば
変換モジュールだけのためでなく、他の方法も考えたほうがいいかもしれません。

>3.文字コード
>    プログラム自体はS-JISで開発だったのですね・・・。
>    コンパイルオプションを、_MBCSから_UNICODEへ変更して
>    「楽チン〜」って喜んでたら、処理後にリターンして落ち
>    ました。T.T
>    (歴史があるのだから、そらそーか。)

Unicodeでもできるはずです。
というか変換の関数はUnicodeでの入力で、出力もUnicodeでないとまずいと思う
のですが、どこか問題でしょうか。
試しに作ってみたところ、いちおうできました。
いろいろ見てみたら、pszExportName, pszNameJapan, pszNameUs はUnicodeでは
なかったです。ここが問題でしょうか?

>4._cdeclが必要・・・?

コンパイルオプションで_cdeclになっていればいいですが、_cdeclです。

[ ]
RE:05114 変換モジュール(〜.hmf)についNo.05116
kiki さん 06/04/03 22:23
 
一般ユーザのkikiです。
いつもお世話になります。

>
>>「MFCについて」
 :
>動いているのならば大丈夫なのではないかと思います。
>AFX_MANAGE_STATEはMFCのDLLを使っているときだけっぽいので、大丈夫なのでしょう。

了解しました。

以上です。

[ ]
RE:05115 変換モジュール(〜.hmf)についNo.05117
kiki さん 06/04/03 23:00
 
一般ユーザのkikiです。
いつもお世話になります。

>
>>1.先に要望(過去形)
>>    変換モジュールでエラーなどで上位関数へのリターンする時、
>>    毎回GlobalAllocして、入力文字列を複写して返さなければ
>>    いけない。
>>    可能なら、処理正常か失敗かのフラグを返すだけにさせて
>>    もらえると楽だった・・・。
>>    (インタフェースの変更は難しいですね。)
>
>NULLを返すと何もしないはずです。
>どうでしょうか。

そうだったんですか・・・。^^;

||if( hmemConv == NULL ) {
|| return NULL;
||}

おおっ! ^^;

>
>
>>2.次も要望(現在進行形)
>>    秀丸エディタへのメッセージが、TAB関連しか分からない。
>>    (HIDEMARUINFO_GETTABWIDTHなど。)
>>
>>    可能なら、他の秀丸エディタの設定値を取得するメッセージ
>>    や、タブ→空白変換の処理を呼ぶメッセージが知りたかった。
>
>もともとあった変換のタブ→空白変換のためにそれら関係のだけがあります。
>変換モジュールだけのために全ての設定の取得をサポートするのは大変なので、
>要望があれば要望の対応と、もし汎用的なものがあったほうがよさそうであれば
>変換モジュールだけのためでなく、他の方法も考えたほうがいいかもしれません。
>

これはもう、「かなぁ〜?」とか思っていたので、了解しました。
「おお、秀丸エディタがメッセージを受け取ってくれる!」と
ちょっと踊ってしましました。

厳密にはメッセージ自体じゃなくて、パラメータのフラグですね。
メッセージのヘッダが見れると嬉しいけど、無茶言いません。^^;
(既に言いまくりでした。m(_ _)m)

>>3.文字コード
>>    プログラム自体はS-JISで開発だったのですね・・・。
>>    コンパイルオプションを、_MBCSから_UNICODEへ変更して
>>    「楽チン〜」って喜んでたら、処理後にリターンして落ち
>>    ました。T.T
>>    (歴史があるのだから、そらそーか。)
>
>Unicodeでもできるはずです。
>というか変換の関数はUnicodeでの入力で、出力もUnicodeでないと
>まずいと思うのですが、どこか問題でしょうか。

これもう、完全に「まずい」ですね。^^;

I/OともにUNICODEで扱って無いと、バケバケでした。
(改行とかも0x0D,0x0Aと別々になっていたし・・・。^^;)

コンパイルオプションは_MBCSのまま、以下の対応しています。

(文字列取得時)

||// 文字列変換 ワイドバイトを取得
||CString  strDispString;
||// ↓ これ、大丈夫だと思うけど。^^;
||//    0x0D,0x0Aは別々に確保されるです。
||strDispString = pwszIn;

  :

(文字列返却時)

||// 変換桁取得
||iLen = strDispString.GetLength();
||// リターン用の領域確保
||hmemConv = AllocMemSub( (iLen + 1)*2, hwndHidemaru );
||if( hmemConv == NULL ) {
|| return NULL;
||}
||// メモリ操作開始
||pwchDest = (WCHAR*)GlobalLock( hmemConv );
||
||// 文字列変換 ワイドバイトへ返す。
||_mbstowcsz( pwchDest, (LPCTSTR)strDispString, iLen + 1 );
||// メモリ操作終了
||GlobalUnlock( hmemConv );
||// RETURN.
||return hmemConv;

>試しに作ってみたところ、いちおうできました。
>いろいろ見てみたら、pszExportName, pszNameJapan, pszNameUs はUnicodeでは
>なかったです。ここが問題でしょうか?

どうも、コンパイルオプションを_MBCSから_UNICODEにすると、

struct HIDEMARUFILTERINFO aFilterInfo[14] = {
 { sizeof(HIDEMARUFILTERINFO), "HanZenConv", "半角/全角変換...", "Hankaku/Ze
nkaku convert...", 'H', 0, 0, 0 },
 { 0, NULL, NULL, NULL, NULL, 0, 0, 0 }
};

この辺が怪しくなるような気が・・・。
(ん? って同じこと言っていますね?  ^^;)

最初、DEBUG実行すると落ちる。T.T
で、上記を""とかってしたらOKでした。
やってみてのお話なので、本当に大丈夫かは全然怪しいですが。

>
>>4._cdeclが必要・・・?
>
>コンパイルオプションで_cdeclになっていればいいですが、_cdeclです。

了解しました。

以上です。



PS.
げげっ!
タブの空白対応忘れてた。
(その内・・・。)

[ ]
RE:05117 変換モジュール(〜.hmf)についNo.05118
アルビレオ さん 06/04/04 01:18
 
アルビレオです。

>どうも、コンパイルオプションを_MBCSから_UNICODEにすると、
>
>struct HIDEMARUFILTERINFO aFilterInfo[14] = {
> { sizeof(HIDEMARUFILTERINFO), "HanZenConv", "半角/全角変換...", "Hankaku/Ze
>nkaku convert...", 'H', 0, 0, 0 },
> { 0, NULL, NULL, NULL, NULL, 0, 0, 0 }
>};
>
>この辺が怪しくなるような気が・・・。
>(ん? って同じこと言っていますね?  ^^;)

あまり文字コードがらみのプログラムをいじったことはないので未確認ですが、
コンパイルオプションを_UNICODEにしても文字列リテラルの文字コードは変化し
ないらしいです。

 L"半角/全角変換..." //強制的にUnicodeにする
あるいは
 _T("半角/全角変換...") //コンパイルオプションに合わせる

と書くのが正しいやり方のようですね。

[ ]
RE:05118 変換モジュール(〜.hmf)についNo.05119
kiki さん 06/04/04 03:20
 
kikiです。

>>この辺が怪しくなるような気が・・・。
>>(ん? って同じこと言っていますね?  ^^;)
>
>あまり文字コードがらみのプログラムをいじったことはないので未確認ですが、
>コンパイルオプションを_UNICODEにしても文字列リテラルの文字コードは変化し
>ないらしいです。
>
> L"半角/全角変換..." //強制的にUnicodeにする
>あるいは
> _T("半角/全角変換...") //コンパイルオプションに合わせる
>
>と書くのが正しいやり方のようですね。

簡単なプロジェクト起して、確認しました。

文字列リテラルの文字コードは変化しないみたいです。
ポインタ取って、メモリ見ました。

これを、CStringに入れると内部でUNICODEで保持していました。

_MBCSコンパイルオプションでは、ワイドバイトをCStringに詰める
とS-JISになっていました。

この辺の操作がおかしかったかもしれません。

以上です。

[ ]
RE:05119 変換モジュール(〜.hmf)についNo.05120
秀丸担当 さん 06/04/04 14:59
 

>> L"半角/全角変換..." //強制的にUnicodeにする
>>あるいは
>> _T("半角/全角変換...") //コンパイルオプションに合わせる

たぶんこの通りだと思いますので、
"半角/全角変換..."
というように記述すると、Unicode にならないと思うので、問題無いのではない
かと思います。
CStringの操作で何か別の誤りがあったのかもしれないですね。
実際そのときの問題が起きていたときのソースを見てみないとわからないことで
すが。

[ ]
RE:05120 変換モジュール(〜.hmf)についNo.05121
kiki さん 06/04/05 12:34
 
kikiです。
いつもお世話になります。

>
>>> L"半角/全角変換..." //強制的にUnicodeにする
>>>あるいは
>>> _T("半角/全角変換...") //コンパイルオプションに合わせる
>
>たぶんこの通りだと思いますので、
>"半角/全角変換..."
>というように記述すると、Unicode にならないと思うので、問題無いのではない
>かと思います。
>CStringの操作で何か別の誤りがあったのかもしれないですね。
>実際そのときの問題が起きていたときのソースを見てみないとわからないことで
>すが。

了解しました。
何か問題が持ち寄られましたら、ご連絡をお願いいたします。

以上です。

[ ]