CHNCONV.DLL の API 解説


針谷 壮一



   この文書は C 言語または C++ 言語での使用を前提に書かれています。他の言語からも呼び出すことができますが、 DLL 呼び出しの方法については、各種参考書をご覧ください。


   目次


DLL の呼び出しについて



   このファイルは CHNCONV.DLL の関数について説明しています。アプリケーションから CHNCONV.DLL を呼び出せば、リッチテキストフォーマットやテキストファイルの各種中国語コードの変換が可能になります。
   CHNCONV.DLL の呼び出しの方法は、次の二つがあります。(2) の方法をお勧めします。

   (1) リンカによってリンクする方法
   ソースファイルにヘッダーファイル chnconv.h をインクルードし、リンカのオプションに chnconv.lib を追加して、コンパイル+リンクを行ってください。この方法は、簡単ではありますが、実行ファイルは実行時に CHNCONV.DLL がみつからない場合、起動さえ出来なくなります。また、添付した chnconv.lib は Microsoft社製のリンカに対応したファイル形式となっています。

   (2) Windows API の LoadLibrary によって呼び出す方法
   ;ソースファイルににヘッダーファイル chnconv.h をインクルードし、LoadLibrary により CHNCONV.DLL をロードして、さらに GetProcAddress により各関数のアドレスを取得します。関数実行後は、FreeLibrary により CHNCONV.DLL をアンロードします。この方法では、ソースファイルの記述が複雑になりますが、実行時に CHNCONV.DLL が見つからない場合に、適切なエラーメッセージを出すなどの処理を行うことができます。また、Windows API を使うため、chnconv.lib の互換性が問題になることもありません。


   このファイルで紹介する使用例は、いずれも上記 (2) の方法を用いています。





関数の解説



   CHNCONV.DLL は、マルチスレッド環境での使用に対応しています。このファイルで紹介する関数は、いずれもスレッドセーフとなるよう設計されています。(このファイルに掲載されていない古い関数はスレッドセーフではありません。)


  int WINAPI ChnconvEx (
      LPCTSTR               pSrcFileName,
      LPCTSTR               pDstFileName,
      int                   nSrcCodePage,
      int                   nDstCodePage,
      const CHNCONVEXINFO * pChnconvExInfo
  ) ;

   ChnconvEx は、リッチテキストフォーマットおよびテキストファイルの中国語文字コードを変換します。CHNCONV.DLL の中心的な役割を担う関数です。Unicode 版関数 ChnconvExW と ANSI 版関数の ChnconvExA が実装されています。マクロ UNICODE が指定してあれば、マクロ ChnconvEx は関数 ChnconvExW に展開され、そうでなければ関数 ChnconvExA に展開されます。

   /**** 引き数 ****/

  LPCTSTR pSrcFileName    入力ファイルのファイル名を指定
  LPCTSTR pSrcFileName    出力ファイルのファイル名を指定
   入力ファイル名と出力ファイル名は、絶対パス名でも相対パス名でもかまいません。UNC でもかまいません。ファイル名に NULL を指定すると 標準入出力(stdin または stdout)を指定したものとみなします。入力ファイルと出力ファイルに同一のファイルを指定した場合の動作は未定義です。入力ファイルのサイズに制限はありません(ディスクのファイルシステムの制限に依存します)。

   対応しているファイル形式は、リッチテキストフォーマットとテキストファイルです。リッチテキストはリッチテキストに変換されます。テキストはテキストに変換されます。リッチテキスト←→テキスト間のファイル形式の変換はできません。入力コードにKOA-TechnoMate中国語またはフロント文華を指定したときは、テキストファイルまたはワープロファイル(拡張子は.tec)を入力ファイルに指定できます。出力ファイルの形式は必ずリッチテキストフォーマットになります。

  int nSrcCodePage      入力ファイルのコードページ
  int nDstCodePage      出力ファイルのコードページ
   入出力ファイルの文字コードを指定します。文字コードの番号は以下のとおりです。
        GB2312/GBK              936
        BIG5                    950
        Chinese Writer          932 + 0x10000
        Nihao                   932 + 0x20000
        cWnn                    932 + 0x30000
        中文起稿                932 + 0x40000
        CX                      932 + 0x50000
        KOA-TechnoMate中国語    932 + 0x60000
        卓絶                    932 + 0x70000
        フロント文華            932 + 0x80000
        HZ                      52936
   これらの番号は、chnconv.h で以下のような定数で定義されています。
        GB2312/GBK              CP_CHINESE_SIMPLIFIED
        BIG5                    CP_CHINESE_TRADITIONAL
        Chinese Writer          CP_CHINESE_CW
        Nihao                   CP_CHINESE_NH
        cWnn                    CP_CHINESE_CWN
        中文起稿                CP_CHINESE_ZQ
        CX                      CP_CHINESE_CX
        KOA-TechnoMate中国語    CP_CHINESE_TM
        卓絶                    CP_CHINESE_ZJ
        フロント文華            CP_CHINESE_FW
        HZ                      CP_HZ_CHINESE_SIMPLIFIED
   このうち KOA-TechnoMate中国語・フロント文華・HZ は入力のみです。出力には指定できません。入力と出力に同じ文字コードを指定することはできません。これらの定数は chnconv.h に定義されています。

  const CHNCONVEXINFO * pChnconvExInfo      変換オプション
   構造体
CHNCONVEXINFO のアドレスを指定します。この構造体により、変換を制御するための各種オプションを指定することができます。必要でなければ NULL を指定します。

   /**** 戻り値 ****/

   ChnconvEx の戻り値には、以下の定数が定められています。

CHNCONV_SUCCESS
変換が成功した

CHNCONV_ERROR_UNKNOWN
原因不明のエラーが発生した

CHNCONV_ERROR_READ
読み込みに失敗した

CHNCONV_ERROR_WRITE
書き込みに失敗した

CHNCONV_ERROR_RTFFORMAT
リッチテキストフォーマットの形式にエラーがあった

CHNCONV_ERROR_RTFBRACE
リッチテキストフォーマットのカッコが対応していない

CHNCONV_ERROR_MEMORY
必要なメモリーが確保できなかった

CHNCONV_ERROR_CODEPAGE
無効なコードページを指定した

CHNCONV_ERROR_ABORTED
変換中に AbortChnconv により中断された

CHNCONV_ERROR_PARAM
引き数の指定に誤りがあった

これらの戻り値は、関数 GetChnconvLastError によっても取得することができます。






  intptr_t WINAPI ChnconvStringEx (
      const char *          pSrcBuffer,
      char *                pDstBuffer,
      int                   nSrcCodePage,
      int                   nDstCodePage,
      const CHNCONVEXINFO * pChnconvExInfo,
      size_t                nMaxLen
  ) ;

   ChnconvStringEx は、文字列を特定の文字コードの文字列に変換します。リッチテキスト形式の文字列にも対応しています。

   /**** 引き数 ****/

  const char * pSrcBuffer    変換する文字列のポインタを指定
  char * pDstBuffer          出力するバッファのポインタを指定
  int nSrcCodePage                        元の文字列のコードページ
  int nDstCodePage                        出力する文字列のコードページ
  const CHNCONVEXINFO * pChnconvExInfo    変換オプション
  size_t nMaxLen            出力するバッファの最大サイズ(バイト)を指定
   引き数 nSrcCodePage, nDstCodePage, pChnconvExInfo は、
ChnconvEx で使われるものと同じなので、そちらを参照してください。

   引き数 pSrcBuffer, pDstBuffer は、char* と wchar_t* のどちらの文字列バッファでもキャストなして指定できるよう、void* で宣言してあります。出力する文字列が nMaxLen を超過しそうなときは、途中で変換を中止し、-1 を返します。pDstBuffer(出力先)に NULL を指定したら、変換を行わず、出力に必要なバッファの長さ(バイト)を返して終了します。pSrcBuffer(入力元)と pDstBuffer(出力先)のメモリが重複している場合の動作は未定義です。

   pSrcBuffer(入力元)は、文字列の終端がヌル文字で終わっていなければいけません。C言語以外の言語で、文字列がヌル文字で終わらない場合は、前もって終端にヌル文字を加えておかなければいけません。

   pSrcBuffer(入力元)にKOA-TechnoMate中国語のワープロ形式の文字列を指定することはできません。(文字列中にヌル文字が含まれるため、終端と誤認識してしまうため。)


   /**** 戻り値 ****/

   出力した文字列の長さ(終端のヌル文字を含む、単位はバイト)を返す。変換に失敗したら、-1 を返す。pDstBuffer が NULL の場合は、変換を行わず、出力に必要なバッファの長さ(終端のヌル文字を含む、単位はバイト)を返します。

   ChnconvStringEx のエラーの原因は、関数 GetChnconvLastError で取得することができます。

   戻り値の型が intptr_t となっていますが、32ビット環境では intptr_t は int と等価です。






  int WINAPI ChnconvCharEx (
      int                   C,
      int                   nSrcCodePage,
      int                   nDstCodePage,
      const CHNCONVEXINFO * pChnconvExInfo
  ) ;

   ChnconvCharEx は、一つの文字を特定の文字コードに変換します。モードのあるコードページ(HZ)には対応していません。

   /**** 引き数 ****/
  int C                                   変換する文字を指定
  int nSrcCodePage                        元の文字列のコードページ
  int nDstCodePage                        出力する文字列のコードページ
  const CHNCONVEXINFO * pChnconvExInfo    変換オプション
   引き数 nSrcCodePage, nDstCodePage, pChnconvExInfo は、
ChnconvEx で使われるものと同じなので、そちらを参照してください。モードのあるコードページ(HZ)を指定することはできません。


   /**** 戻り値 ****/

   変換した文字を返す。
   失敗したら -1 を返す

   ChnconvChar のエラーの原因は、GetChnconvLastError で取得することができます。
   戻り値が -1 で、GetChnconvLastError の戻り値が CHNCONV_SUCCESS なら、変換先のコードページに適切な文字が見つからなかったことを表します。

   Unicode のサロゲートペアを返す場合は、たとえば変換結果が "D800-DC00" のワード列ならば、(int) 0xD800DC00 を返します。GB18030 の4バイト文字を返す場合は、たとえば変換結果が "81-30-82-31" のバイト列ならば、(int) 0x81308231 を返します。
  





  int WINAPI IsChnconvValidCodePage (
      int nSrcCodePage,
      int nDstCodePage
  ) ;

   現在の環境で CHNCONV.DLL が変換可能なコードページかどうかを返します。入力文字コードと出力文字コードを指定してください。


   /**** 戻り値 ****/

   変換可能なら 0 以外を、不可能なら 0 を返す。






  int WINAPI GetChnconvLastError (
      void
  ) ;

   直前に呼び出された
ChnconvEx, ChnconvStringEx, ChnconvCharEx のエラー値を取得します。
   このエラー値はスレッドごとに管理されています。

   /**** 戻り値 ****/

   以下の定数を返します。

CHNCONV_SUCCESS
変換が成功した

CHNCONV_ERROR_UNKNOWN
原因不明のエラーが発生した

CHNCONV_ERROR_READ
読み込みに失敗した

CHNCONV_ERROR_WRITE
書き込みに失敗した

CHNCONV_ERROR_RTFFORMAT
リッチテキストフォーマットの形式にエラーがあった

CHNCONV_ERROR_RTFBRACE
リッチテキストフォーマットのカッコが対応していない

CHNCONV_ERROR_MEMORY
必要なメモリーが確保できなかった

CHNCONV_ERROR_CODEPAGE
無効なコードページを指定した

CHNCONV_ERROR_ABORTED
変換中に AbortChnconv により中断された

CHNCONV_ERROR_PARAM
引き数の指定に誤りがあった







  int WINAPI AbortChnconv (
      void
  ) ;

   AbortChnconv を呼ぶと、同じプロセス内で実行されている全ての
ChnconvEx および ChnconvStringEx は、変換を途中で中止し、CHNCONV_ERROR_ABORTED を返して戻ります。ユーザが巨大ファイルの変換を途中で中止したい場合に、この関数を使用します。

   ウィンドウプログラムでは、ウィンドウプロシージャの中で、中止を指示するボタン等を押したときに、AbortChnconv を呼び出すようにします。(この場合、CHNCONVEXINFO 構造体 の dwConversionMode に CONVMODE_PEEKMESSAGE を指定するか、ChnconvEx または ChnconvStringEx を別スレッドで起動するなどして、メッセージループをまわしておく必要があります。)

   コンソールプログラムでは、signal 関数により Ctrl+C をフックし、捕捉時に呼び出される関数から AbortChnconv を呼び出すようにします。


   /**** 戻り値 ****/

   常に 0 を返す。






  int WINAPI GetDllVersion (
      void
  ) ;

   CHNCONV.DLL のバージョンを取得します。

   /**** 戻り値 ****/

   CHNCONV.DLL のバージョンを返します。バージョン 4.31 ならば、431 が返ります。





構造体の解説



  typedef struct {
        size_t                  cbSize ;
        unsigned long           dwConversionMode ;
        unsigned long           dwAdditionalMode ;
        const CHNFONTINFO *     pFontInfo ;
        const CHNCONV_USERDEF * pSrcToDst ;
        size_t                  nNumberOfSrcToDst ;
        const CHNCONV_USERDEF * pSrcToUc ;
        size_t                  nNumberOfSrcToUc ;
        int                     nFontSize ;
        const void *            pReserved ;
  } CHNCONVEXINFO ;

   /**** 各メンバーの解説 ****/

cbSize
この構造体のサイズをバイト単位で指定します。

dwConversionMode
変換オプションを指定します。以下のような定数が定められています。必要でなければ 0 を指定してください。複数の定数を指定したい場合は、ビットの和で指定してください。

CONVMODE_PEEKMESSAGE
変換中にメッセージループをまわす。

CONVMODE_OUTPUT_CODE_NUMBER
出力時に、変換できない文字はコード番号を出力する。形式は各入力コードに応じて、"[文字コード名:番号]"となります。デフォルト(これを指定しない)では、変換できない文字は、半角文字なら ? に、全角文字なら ?? に変換されます。

CONVMODE_INPUT_CODE_NUMBER
テキストファイル入力時に、CONVMODE_OUTPUT_CODE_NUMBER で出力された形式のコード番号を文字として認識する。

CONVMODE_ONE_QUESTION_MARK
出力時に、変換できない文字は、全角・半角にかかわらず、一つの ? を出力する。デフォルト(これを指定しない)では、変換できない文字は、半角文字なら ? に、全角文字なら ?? に変換されます。

CONVMODE_CONVERT_TXT
強制的にテキストファイルとして変換する。デフォルト(これを指定しない)では、ファイル先頭の内容を見て、テキストファイルとリッチテキストフォーマットを自動的に判別します。この自動判別を無効にして、必ずテキストファイルとして処理したい場合は CONVMODE_CONVERT_TXT を指定してください。

CONVMODE_CONVERT_RTF
強制的にリッチテキストフォーマット(またはKOA-TechnoMate中国語のワープロファイル)として変換する。デフォルト(これを指定しない)では、ファイル先頭の内容を見て、テキストファイルとリッチテキストフォーマットを自動的に判別します。この自動判別を無効にして、必ずリッチテキストフォーマットとして処理したい場合は CONVMODE_CONVERT_RTF を指定してください。

CONVMODE_CHNCONV_NO_VARIANT
Big5 <-> GB(およびCW/NH/CWN/ZQ/CX/ZJ/HZ/TM/FW)の変換で、できるだけ同じ形の漢字に変換する。このオプションは OS に中国語サポートがインストールされている必要があります。

CONVMODE_CHNCONV_NO_GBK
GB で入出力するとき、B2312の範囲の文字のみで入出力をおこなう。

CONVMODE_PINYIN_BY_ASCII
GB/BIG5のリッチテキストフォーマットを出力するとき、ピンインをヨーロッパの文字のフォント(Times New Romanなど)で出力。デフォルト(これを指定しない)では漢字と同じフォントで出力します。

CONVMODE_OUTPUT_NEW_FONT
Chinese Writer のリッチテキストを出力するとき、Version 7 以降のフォント名で出力し、古いフォント名でも表示できるよう Version 6 までのフォント名を「代替フォント」として出力する。デフォルト(これを指定しない)では Version 6 までのフォント名で出力し、新しいフォント名でも表示できるよう Version 7 以降のフォント名を「代替フォント」として出力します。

CONVMODE_SENSE_CW_FANTIZI
リッチテキストの入力で、CW/CWN の繁体字フォントを認識します。

CONVMODE_CW_TXT_FANTIZI
テキストファイルの入力で、CW/CWのテキストを繁体字として変換します。

CONVMODE_NO_USE_UNICODE
内部で OS による Unicode 経由の変換を一切行わないようにします。このオプションを指定すると、CONVMODE_CHNCONV_NO_VARIANT は自動的に無効になります。

dwAdditionalMode
付加的な変換オプションを指定します。現バージョンでは指定できるフラグはありません。0 を指定してください。

pFontInfo
リッチテキスト出力時のフォント名を指定します。
CHNFONTINFO 構造体のアドレスを指定してください。必要でなければ NULL を指定してください。

pSrcToDst
ユーザ定義の文字変換を指定します。
CHNCONV_USERDEF 構造体の配列のアドレスを指定してください。必要でなければ NULL を指定してください。

nNumberOfSrcToDst
pSrcToDst で指定した CHNCONV_USERDEF 構造体の配列のサイズ(要素数)を指定してください。必要でなければ 0 を指定してください。

pSrcToUc
リッチテキストを変換するときに Unicode で出力する際の、ユーザ定義の文字変換を指定します。
CHNCONV_USERDEF 構造体の配列のアドレスを指定してください。必要でなければ NULL を指定してください。

nNumberOfSrcToUc
pSrcToUc で指定した CHNCONV_USERDEF 構造体の配列のサイズ(要素数)を指定してください。必要でなければ 0 を指定してください。

nFontSize
KOA-TechnoMate中国語・フロント文華をリッチテキストに変換するとき、出力するフォントサイズ(ポイント数×2)を指定します。0 を指定すると、デフォルトのサイズ(21)で出力します。負数を指定すると、サイズ 0 で出力します。必要でなければ 0 を指定してください。

pReserved
予約されています。NULL を指定してください。






  typedef struct {
        size_t cbSize ;
        const char *pGbFont ;
        const char *pGbGothicFont ;
        const char *pBig5Font ;
        const char *pBig5GothicFont ;
        const char *pPinyinFont ;
        const char *pPinyinGothicFont ;
  } CHNFONTINFO ;

   /**** 各メンバーの解説 ****/

cbSize
この構造体のサイズをバイト単位で指定します。

pGbFont
中国語簡体字のフォント名を指定します。必要でなければ NULL を指定してください。

pGbGothicFont
中国語簡体字のゴシック体のフォント名を指定します。必要でなければ NULL を指定してください。

pBig5Font
中国語繁体字のフォント名を指定します。必要でなければ NULL を指定してください。

pBig5GothicFont
中国語簡体字のゴシック体のフォント名を指定します。必要でなければ NULL を指定してください。

pPinyinFont
ピンインアルファベット用の文字のフォント名を指定します。このフォント名を有効にするには、CHNCONVEXINFO 構造体の
dwConversionMode に CONVMODE_PINYIN_BY_ASCII フラグを指定しなければなりません。必要でなければ NULL を指定してください。

pPinyinGothicFont
ピンインアルファベット用の文字のゴシック体のフォント名を指定します。このフォント名を有効にするには、CHNCONVEXINFO 構造体の dwConversionMode に CONVMODE_PINYIN_BY_ASCII フラグを指定しなければなりません。必要でなければ NULL を指定してください。






  typedef struct {
        int   nSrc ;
        int   nDst ;
  } CHNCONV_USERDEF ;

   /**** 各メンバーの解説 ****/

nSrc
ユーザ定義の文字変換の指定で、変換元の文字を指定します。入力する文字コードで文字を指定します。

nDst
ユーザ定義の文字変換の指定で、変換先の文字を指定します。
pSrcToDst に指定したときは、出力する文字コードで文字を指定します。pSrcToUc に指定したときは、Unicode のスカラー値で文字を指定します。





サンプルコード



/**** 使用例 1 ****/

/* Chinese Writerのファイル "c:\foo.rtf" を GBに変換し、"c:\poo.rtf" に出力す */
/* る。                                                                       */

#include <windows.h>
#include "chnconv.h"

typedef int (WINAPI *CHNCONVEX) ( LPCTSTR pSrcFileName, LPCTSTR pDstFileName,
     int nSrcCodePage, int nDstCodePage, const CHNCONVEXINFO *pChnconvExInfo ) ;


int main () {

    /* DLL */
    HINSTANCE hChnconv ;
    CHNCONVEX pChnconvEx ;

    /* Reading DLL */
    hChnconv = LoadLibrary( TEXT("chnconv.dll") ) ;
    if ( hChnconv == NULL ) {
        return 1 ;
    }

#ifdef UNICODE
    pChnconvEx = (CHNCONVEX) GetProcAddress( hChnconv, "ChnconvExW" ) ;
#else
    pChnconvEx = (CHNCONVEX) GetProcAddress( hChnconv, "ChnconvExA" ) ;
#endif
    if ( pChnconvEx == NULL ) {
        FreeLibrary( hChnconv ) ;
        return 1 ;
    }

    /* Conversion */
    pChnconvEx ( TEXT("c:\\foo.rtf"), TEXT("c:\\poo.rtf"), CP_CHINESE_CW, CP_CHINESE_SIMPLIFIED, NULL ) ;

    /* Finalization */
    FreeLibrary( hChnconv ) ;
    return 0 ;
}




/**** 使用例 2 ****/

/* cWnn の文字列 "中国" を GB に変換して szGbBuffer に出力し、さらに Unicode に */
/* 変換して szUcBuffer に出力し、メッセージボックスで表示する。                 */

#include <windows.h>
#include "chnconv.h"

typedef intptr_t (WINAPI *CHNCONVSTRINGEX) ( const void *pSrcBuffer, void *pDstBuffer,
      int nSrcCodePage, int nDstCodePage, const CHNCONVEXINFO *pChnconvExInfo,
      size_t nMaxLen ) ;


int main () {

    char szGbBuffer [ 0x100 ] ;
    wchar_t szUcBuffer [ 0x100 ] ;

    /* DLL */
    HINSTANCE hChnconv ;
    CHNCONVSTRINGEX pChnconvStringEx ;

    /* Reading DLL */
    hChnconv = LoadLibrary( TEXT("chnconv.dll") ) ;
    if ( hChnconv == NULL ) {
        return 1 ;
    }

    pChnconvStringEx = (CHNCONVSTRINGEX) GetProcAddress( hChnconv, "ChnconvStringEx" ) ;
    if ( pChnconvStringEx == NULL ) {
        FreeLibrary( hChnconv ) ;
        return 1 ;
    }

    /* Convert to GB */
    pChnconvStringEx( "嶄忽", szGbBuffer, CP_CHINESE_CWN, CP_CHINESE_SIMPLIFIED, 0, sizeof(szGbBuffer) );

    /* Convert to UNICODE */
    MultiByteToWideChar ( CP_CHINESE_SIMPLIFIED, 0, szGbBuffer, -1, szUcBuffer, sizeof(szUcBuffer)/sizeof(wchar_t) ) ;

    /* Display */
    MessageBoxW( NULL, szUcBuffer, L"test", MB_OK ) ;

    /* Finalization */
    FreeLibrary( hChnconv ) ;
    return 0 ;
}




/**** 使用例 3 ****/

/* cWnn の文字 '中' (0x9BCE) を GB に変換して標準出力に出力する例 */

#include <windows.h>
#include <stdio.h>
#include "chnconv.h"

typedef intptr_t (WINAPI *CHNCONVCHAREX) ( int C, int nSrcCodePage, int nDstCodePage,
      int nSrcCodePage, int nDstCodePage, const CHNCONVEXINFO *pChnconvExInfo ) ;


int main () {

    int C ;

    /* DLL */
    HINSTANCE hChnconv ;
    CHNCONVCHAREX pChnconvCharEx ;

    hChnconv = LoadLibrary( "chnconv.dll" ) ;
    if ( hChnconv == NULL ) return 1 ;

    pChnconvCharEx = (CHNCONVSTRING) GetProcAddress( hChnconv, "ChnconvCharEx" ) ;
    if ( pChnconvCharEx == NULL ) {
        FreeLibrary( hChnconv ) ;
        return 1 ;
    }

    C = pChnconvCharEx( 0x9BCE, CP_CHINESE_CWN, CP_CHINESE_SIMPLIFIED, NULL );
    if ( C <= 0 ) {
        FreeLibrary( hChnconv ) ;
        return 1 ;
    }

    if ( C & 0xFF00 ) fputc( ( C >> 8 ) & 0xFF, stdout ) ;
    fputc( C & 0xFF, stdout ) ;

    FreeLibrary( hChnconv ) ;
    return 0 ;
}




/**** 使用例 4 ****/

/* Chinese Writerのファイル "c:\foo.rtf" を GBに変換し、"c:\poo.rtf" に出力す */
/* る。漢字の出力は "STKaiti" フォントを使用する。                            */

#include <windows.h>
#include "chnconv.h"

typedef int (WINAPI *CHNCONVEX) ( LPCTSTR pSrcFileName, LPCTSTR pDstFileName,
     int nSrcCodePage, int nDstCodePage, const CHNCONVEXINFO *pChnconvExInfo ) ;


int main () {

    /* DLL */
    HINSTANCE hChnconv ;
    CHNCONVEX pChnconvEx ;

    /* Structures */
    CHNCONVEXINFO ChnconvExInfo = { sizeof(CHNCONVEXINFO) } ;
    CHNFONTINFO FontInfo = { sizeof(CHNFONTINFO) } ;

    /* Reading DLL */
    hChnconv = LoadLibrary( TEXT("chnconv.dll") ) ;
    if ( hChnconv == NULL ) {
        return 1 ;
    }

#ifdef UNICODE
    pChnconvEx = (CHNCONVEX) GetProcAddress( hChnconv, "ChnconvExW" ) ;
#else
    pChnconvEx = (CHNCONVEX) GetProcAddress( hChnconv, "ChnconvExA" ) ;
#endif
    if ( pChnconvEx == NULL ) {
        FreeLibrary( hChnconv ) ;
        return 1 ;
    }

    /* Options */
    FontInfo.pGbFont = "STKaiti" ;
    ChnconvExInfo.pFontInfo = & FontInfo ;

    /* Conversion */
    pChnconvEx ( TEXT("c:\\foo.rtf"), TEXT("c:\\poo.rtf"), CP_CHINESE_CW, CP_CHINESE_SIMPLIFIED, & ChnconvExInfo ) ;

    /* Finalization */
    FreeLibrary( hChnconv ) ;
    return 0 ;
}