unit nkf; (*------------------------------------------------------------------------- NKF32.DLLを使用するためのUnit for Delphi 2.0 NKF32PAS.PAS Ver.1.0 (c)1996 A.Nakata (anakata@mix.or.jp, SGR03043@niftyserve.or.jp) 基本的に著作者財産権主張せず。 (ほとんどnkf32.dll付属のnkf32.hをコンバートするだけだから) 転載および他プログラムでの使用を歓迎。 これ単独での販売を除き商利用(Shareware含む)も可、ただし連絡希望。 各API個別の使用方法についてはnkf32.dllに付属のnkfdll.txtを参照されたし。 本Unitで独自に付加したインターフェースとして ・function NkfEnabled : boolean; nkf32.dllのロードに成功している場合true,さもなくばfalseを返す ・function NkfConvertStr(ins, option : string) : string; delphiのPascal形式文字列をnkf.dllで変換して返す がある。 USE_EXCEPTION を定義してコンパイルした場合には、nkf32.dllのロード に失敗した状態でAPIを呼び出そうとすると例外を発生するようになっている。 定義しない場合にはエラーは単にmessageboxで表示する。 コード記述例: --------^ procedure TForm1.Button1Click(Sender : TObject); var buff : string; begin buff.setlength(memo1.gettextlen + 1); memo1.gettextbuf(buff, buff.length); memo1.settextbuf(NkfConvertStr(buff, '-s')); end; --------$ Sept-30-'96 Ver.1.0 最初のバージョン 元にしたヘッダファイルはnkf32.h version 1.00のものである。 独り言: 単純作業三度(^^; -------------------------------------------------------------------------*) //{$DEFINE USE_EXCEPTION} interface uses types; (* Added by Fumio Kawamata. July 26, 2009. *) var (* ドキュメント上の呼出規約はPASCALとなっているが、実際にはSTDCALL *) GetNkfVersion : procedure(var version : pchar); stdcall; SetNkfOption : function(option : pchar) : integer; stdcall; NkfConvert : procedure(outs, ins : pchar); stdcall; NkfConvertSafe: function(outStr: pchar; OutBufferLength: Dword; var BytesReturned: Dword; inStr: pchar; InBufferLength: Dword): integer; stdcall; function NkfEnabled : boolean; function NkfConvertStr(ins, option : string) : string; function NkfConvertStrSafe(ins: string; var outs: string; option: string): integer; (* NkfConvertSafe function was added by Fumio Kawamata. July 26, 2009 *) implementation uses windows, sysutils; const nkfdll = 'nkf32.dll'; procedure ShowError(Func : string); var s : string; begin s := Func + ': LHA.DLL not loaded'; s := s + '.'; {$IFDEF USE_EXCEPTION} raise Exception.Create(s); {$ELSE} messagebox(0, pchar(s), 'PANIC!!', MB_ICONSTOP); {$ENDIF} end; var hNkf : THandle; p : TFarProc; Enabled : Boolean; procedure FaultGetNkfVersion(var version : pchar); stdcall; begin version := ''; ShowError('GetNkfVersion'); end; function FaultSetNkfOption(option : pchar) : integer; stdcall; begin result := 0; ShowError('SetNkfOption'); end; procedure FaultNkfConvert(outs, ins : pchar); stdcall; begin ShowError('NkfConvert'); end; function FaultNkfConvertSafe(outStr: pchar; OutBufferLength: Dword; var BytesReturned: Dword; inStr: pchar; InBufferLength: Dword): integer; stdcall; begin result:=0; ShowError('NkfConvertSafe'); end; function NkfEnabled : boolean; begin result := Enabled; end; function NkfConvertStr(ins, option : string) : string; begin SetNkfOption(pchar(option)); result := ''; setlength(result, length(ins) * 6); (* worst case in SJIS to JIS convert *) NkfConvert(pchar(result), pchar(ins)); setlength(result, strlen(pchar(result))); end; function NkfConvertStrSafe(ins: string; var outs: string; option: string): integer; (* Added by Fumio Kawamata. July 26, 2009 *) var OutBufferLength: DWord; BytesReturned: DWord; InBufferLength: Dword; begin SetNkfOption(pchar(option)); outs := ''; OutBufferlength:=length(ins)*6; (* worst case in SJIS to JIS convert *) setlength(outs, OutBufferLength); InBufferLength:=strlen(pchar(ins)); Result:=NkfConvertSafe(pchar(outs), OutBufferLength, BytesReturned, pchar(ins), InBufferLength); setlength(outs, strlen(pchar(outs))); end; procedure initialize; begin hNkf := 0; Enabled := false; GetNkfVersion := FaultGetNkfVersion; SetNkfOption := FaultSetNkfOption; NkfConvert := FaultNkfConvert; NkfConvertSafe:=FaultNkfConvertSafe; (* Added by Fumio Kawamata. July 26, 2009 *) hNkf := Loadlibrary('NKF32.DLL'); if hNkf >= 32 then begin p := GetProcAddress(hNkf, 'GetNkfVersion'); if p <> nil then @GetNkfVersion := p; p := GetProcAddress(hNkf, 'SetNkfOption'); if p <> nil then @SetNkfOption := p; p := GetProcAddress(hNkf, 'NkfConvert'); if p <> nil then @NkfConvert := p; p:=GetProcAddress(hNkf, 'NkfConvertSafe'); (* Added by Fumio Kawamata. July 26, 2009 *) if p <> nil then @NkfConvertSafe := p; (* Added by Fumio Kawamata. July 26, 2009 *) Enabled := true; end; end; procedure finalize; begin if hNkf >= 32 then FreeLibrary(hNkf); end; initialization initialize; finalization finalize; end.