やすさんのUPしてくださったソースと比較して、日本語(マルチバイトの文字列)が混ざると、PDFを[保存]できない原因がわかりました。
[保存]できない現象に対しての、修正箇所は
[Common]-[modCDlg.bas]-[SaveFileDialog]
もともとこのモジュールではOPENFILENAMEに対して下記のようにセットしていますが。
オリジナル
- 50160 With ofn
- 50170 .nStructSize = Len(ofn)
- 50180 .hWndOwner = hwnd
- 50190 .sFilter = tFil
- 50200 .nFilterIndex = FilterIndex
- 50210 .sFile = InitFilename & Space$(1024) & vbNullChar & vbNullChar
- 50220 .nMaxFile = Len(.sFile)
- 50230 .sDefFileExt = DefaultFileExtension & vbNullChar & vbNullChar
- 50240 .sFileTitle = vbNullChar & Space$(512) & vbNullChar & vbNullChar
- 50250 .nMaxTitle = Len(ofn.sFileTitle)
- 50260 If InitDir = vbNullString Then
- 50270 .sInitialDir = GetPDFCreatorApplicationPath & vbNullChar & vbNullChar
- 50280 Else
- 50290 .sInitialDir = InitDir & vbNullChar & vbNullChar
- 50300 End If
- 50310 .sDialogTitle = DialogTitle
- 50320 .Flags = Flags
- 50330 End With
OPENFILENAME構造体は、
.nMaxFile :ファイル名のバッファのサイズを設定
.nMaxFileTitle :フルパス用のバッファのサイズを設定
ですので、オリジナルのようにLenで計算している(行番号07.、10.)と、マルチバイトの文字列が入るとおかしくなっちゃうんですねー。
というわけで、下記のようにLenBにあらためます。
修正後
- 50160 With ofn
- 50170 .nStructSize = Len(ofn)
- 50180 .hWndOwner = hwnd
- 50190 .sFilter = tFil
- 50200 .nFilterIndex = FilterIndex
- 50210 .sFile = InitFilename & Space$(1024) & vbNullChar & vbNullChar
- '50220 .nMaxFile = Len(.sFile)
- 50220 .nMaxFile = LenB(.sFile)
- 50230 .sDefFileExt = DefaultFileExtension & vbNullChar & vbNullChar
- 50240 .sFileTitle = vbNullChar & Space$(512) & vbNullChar & vbNullChar
- '50250 .nMaxTitle = Len(ofn.sFileTitle)
- 50250 .nMaxTitle = LenB(ofn.sFileTitle)
- 50260 If InitDir = vbNullString Then
- 50270 .sInitialDir = GetPDFCreatorApplicationPath & vbNullChar & vbNullChar
- 50280 Else
- 50290 .sInitialDir = InitDir & vbNullChar & vbNullChar
- 50300 End If
- 50310 .sDialogTitle = DialogTitle
- 50320 .Flags = Flags
- 50330 End With
この部分を修正すると無事、マルチバイトの文字列が入っていても、[保存]できるようになりますねぇ。
ちなみに[ReplaceEncodingChars]については、前回の16進変換の修正のみのモジュールのままでも、とりあえずのところは動きました(←そして8進変換の役割が、相変わらず、わかっていないじょにでした。[\XXX]の8進数を文字に置換しているのはわかっていても、「何故変換するのか。なにが入ってきて、どう変換すべきなのか」というそもそもの役割とかが見えきていないッス・泣)。
2 件のコメント:
こんばんわ。
すみません、まさか"modCDlg.bas"を修正していたとは・・・全く記憶にありませんでした。
なぜか今も思い出せません。
あと追加した8進変換ですが、例えばFirefoxでじょにさんのblogのコメント投稿のページを印刷(PDF化)すると、"Blogger: log book - \203R\203\201\203\223\203g\202\360\223\212\215e"といったデータが渡され、8進部分が文字化けしたので16進変換と同じ修正をしました。ただ、8進数で渡されるパターンが全くわかりません。
こんばんわ。
あああ、確かに8進数もどきでも、タイトル類の日本語が入ってきますね。
「\203R\203\201\203\223\203g\202\360\223\212\215e」を日本語にすると「コメントの投稿」。
たとえば「\203R」の「\数値3桁」を16進数に変換、アルファベットをASCIIの16進数に変換すると「83 54」。これはS-JISでの「コ」…。以下略。
まるで暗号の解読みたいな気分になってきました。ヽ(´ー`)ノ
コメントを投稿