解決策が見えたかな: DllImportを使用し 文字コードをCharSet.Unicodeとし、 関数の引数をXYZ(ByVAl abc() As Byte, .........) As Stringとし、 Dim abc() As Byte = System.Text.Encoding.UTF8.GetBytes(目的の文字列 + ChrW(0))として懸案の第三者Dllを動かし、 返値XYZを一旦dim temp As String =System.Text.Encoding.Unicode.GetBytes(XYZ)とし、 それを更にDim result As String System.Text.Encoding.UTF8.GetString(temp)としたら関数の返値(utf8)がresult中にUicodeとして文字化けせずに見えました。
Declare Function NLPIR_ParagraphProcess Lib "NLPIR.dll" (ByVal sParagraph As String, ByVal bPOStagged As Integer) As Stringに関しては返値文字列の必要な部分のみを取り出す処理を追加し、一応使用できる状態になりましたので、自分的にはこれで良しと考えています。
別件で、この関数のシリーズ中に、NLPIR_FileProcessがあります。これも Declare Function NLPIR_FileProcess Lib "NLPIR.dll" (ByVal sSourceFileName As String, ByVal sResultFileName As String, ByVal bPOStagged As Integer) As Doubleという記述でVBNETで使用しようとしています。ただ、ファイルパスはUTF8文字列であり、漢字交じりのパス名を渡すとエラーになります。よって、半角英数のファイルパスの元で動かすようにして使用できるようにしました。
PS: NLPIR_FileProcess(FileName,FileName,1) As Doubleについては、NLPIR_FileProcess自体がUTF8でWindows側のファイルにアクセスしようとすることは、そのままではどうにも対処できるものではないのであきらめですね。 ではこれにて解決済みとします。
Dim intptr As Integer = NLPIR_ParagraphProcess(ybyt, 1) Dim plen As Integer = lstrlenA(intptr) Dim bf(plen - 1) As Byte Marshal.Copy(intptr, bf, 0, bf.Length) Dim pstr As String = System.Text.Encoding.UTF8.GetString(bf) これで0hは付加されませんでした。
Dim srcStr As String = "d:\data\漢字\temp.txt" Dim dstStr As String = "d:\data\漢字\result.txt"
Dim bytSrc As Byte() = Encoding.UTF8.GetBytes(srcStr & vbNullChar) Dim ptrSrc As IntPtr = Marshal.AllocHGlobal(bytSrc.Length) Marshal.Copy(bytSrc, 0, ptrSrc, bytSrc.Length)
Dim bytDst As Byte() = Encoding.UTF8.GetBytes(dstStr & vbNullChar) Dim ptrDst As IntPtr = Marshal.AllocHGlobal(bytDst.Length) Marshal.Copy(bytDst, 0, ptrDst, bytDst.Length)
Dim ret As Double = NLPIR_FileProcess(ptrSrc, ptrDst, 1) では機能しません。
上記でディレクトリの漢字を削除したPathでは問題なくresult.txt作成され、内容も期待したものが入っていました。つまり、 Dim srcStr As String = "d:\data\temp.txt" Dim dstStr As String = "d:\data\result.txt"
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 に渡される見込みです。