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

No34106 の記事


■34106 / )  Re[7]: 参照dllへの文字列引数をutf8で渡したい。
□投稿者/ 魔界の仮面弁士 大御所(1192回)-(2019/01/17(Thu) 19:41:47)
  • アイコン2019/01/17(Thu) 20:51:04 編集(投稿者)

    No34105に返信(ukotsさんの記事)
    > Dim bf(plen - 1) As Byte

    そうですね。それで OK だと思います。

    丸括弧内は「配列の要素数」ではなく「最大インデックス番号」ですので
    「バッファの長さ - 1」を指定することになります。

    たとえば 4 バイトのバッファなら、
    Dim bf(0 To 3) As Byte な範囲になる換算ですね。


    > Dim srcStr As String = "d:\data\temp.txt"
    > Dim dstStr As String = "d:\data\result.txt"

    結果報告ありがとうございます。

    ASCII なパスを UTF-8 変換したバイナリとして渡すのは OK だったということは
    それは DLL 側の不具合(もしくは制限)である可能性が考えられます。


    おそらくは、ファイル アクセスに用いられている Windows API が
    Wide バージョン(たとえば CreateFileW 関数など)ではなく、
    Ansi バージョン(たとえば CreateFileA 関数など)になっているのでしょう。


    すなわちこれは、ファイルパスに対して
     日本語版 Windows で実行した場合は CP932 (Shift_JIS 相当) の文字列
     繁体字版 Windows で実行した場合は CP950 (Big5 相当) の文字列
     簡体字版 Windows で実行した場合は CP936 (GBK/GB2312 相当) の文字列
    しか渡せないということを意味します。


    つまり、パス引数に対して使うのは Encoding.UTF8 や Encoding.Ascii や Encoding.Unicode ではなく、
     Encoding.Default.GetBytes(srcStr & vbNullChar)
     Encoding.GetEncoding(932).GetBytes(srcStr & vbNullChar)
     Encoding.GetEncoding(936).GetBytes(srcStr & vbNullChar)
     Encoding.GetEncoding(950).GetBytes(srcStr & vbNullChar)
    のいずれかであったものと推察します。
    ※ただし strSrc の中身が OS 既定のコードページで扱える文字のみであることが条件


    そしてもし、Encoding.Default で呼び出せる文字列である場合、
    ANSI バージョンであることを明示するために、API の引数宣言を

    Declare Ansi Function NLPIR_FileProcess Lib "NLPIR" ( _
     <MarshalAs(UnmanagedType.LPStr)> ByVal sSourceFilename As String, _
     <MarshalAs(UnmanagedType.LPStr)> ByVal sResultFileName As String, _
     Optional ByVal bPOStagged As Integer = 1) As Double

    もしくは

    <DllImport("NLPIR.DLL", CharSet:=CharSet.Ansi)> _
    Function NLPIR_FileProcess(
     <MarshalAs(UnmanagedType.LPStr)> ByVal sSourceFilename As String, _
     <MarshalAs(UnmanagedType.LPStr)> ByVal sResultFileName As String, _
     Optional ByVal bPOStagged As Integer = 1) As Double
    End Function

    の形式に修正することでも、ファイルパスを渡すことが出来るのでは無いでしょうか。


    > Dim srcStr As String = "d:\data\漢字\temp.txt"

    上記のように、API 宣言で Ansi 版であることを明示した場合、
    As String な引数に "漢字" という文字列が渡されたときには
      日本語 Windows では 8A, BF, 8E, 9A
      繁体字 Windows では BA, 7E, A6, 72
      簡体字 Windows では 9D, 68, D7, D6
    というバイナリに自動変換されてから DLL に渡される見込みです。
違反を報告
返信 削除キー/


Mode/  Pass/


- Child Tree -