DOBON.NETプログラミング道掲示板

No34102 の記事


■34102 / )  Re[3]: 参照dllへの文字列引数をutf8で渡したい。
□投稿者/ 魔界の仮面弁士 大御所(1190回)-(2019/01/16(Wed) 17:05:20)
  • アイコン2019/01/16(Wed) 17:08:10 編集(投稿者)

    No34101に返信(ukotsさんの記事)
    > 今回の問題のdllの仕様は下記のpdfに載っています

    簡体は読み解けないので、コード部と英語部分だけを
    流し読みしてみただけですが…エンコーディングについては
    最初の NLPIR_Init API で指定するのでしょうか。

    簡体字、繁体字、UTF-8 の 3 種があるようですが(既定では簡体字)、
    残念ながら .NET Framework では Marshal.PtrToStringXXX メソッドの
    UTF-8 版が使えないという罠。
    https://docs.microsoft.com/ja-jp/dotnet/api/system.runtime.interopservices.marshal.ptrtostringutf8


    となるとやはり、System.Text.Encoding を使って
    自前で処理する必要があると思います。


    > NLPIR_ParagraphProcess

    この API ですね。

    const char * NLPIR_ParagraphProcess(const char *sParagraph, int bPOStagged = 1);

    だとすれば、こんな手順でどうでしょう。


    (1) NLPIR_ParagraphProcess API の戻り値を As IntPtr で宣言しなおす

    (2) 戻り値のバッファ長を得るため、kernel32.dll の lstrlenA API を呼び出す
     Private Declare Ansi Function lstrlenA Lib "kernel32" (ByVal p As IntPtr) As Integer

    (3) 受信バッファとして、その長さの Byte 型 1 次元配列を確保する

    (4) 確保したバッファに、Marshal.Copy( IntPtr, Byte(), Integer, Integer) メソッドで複写

    (5) System.Text.Encoding.UTF8.GetString メソッドで文字列に変換する



    なお、受信した文字列バッファの解放処理をどうすべきかは、
    読み解けませんでした。

    NLPIR_Exit を呼び出すとワーキングバッファも解放されるようですが、
    戻り値で返される文字列のメモリ解放もこれですかね…?
違反を報告
返信 削除キー/


Mode/  Pass/


- Child Tree -