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

No34099 の記事


■34099 / )  Re[1]: 参照dllへの文字列引数をutf8で渡したい。
□投稿者/ 魔界の仮面弁士 大御所(1189回)-(2019/01/15(Tue) 16:48:04)
  • アイコンNo34095に返信(ukotsさんの記事)
    > 関数の引数をXYZ(ByVAl abc() As Byte, .........) As Stringとし、

    「第三者のdll」が戻り値として返却する文字列のメモリは
    DLL 側でどのように確保されているのでしょうか。
    また、戻り値の文字列エンコードは何になっているのでしょうか。


    戻り値が ANSI あるいは UTF-16 の場合には、戻り値の As String に
    対して MarshalAs 属性を付与することで受けられる可能性が
    あるのですが、その時、どのような宣言になるべきかは
    DLL 側の実装に依存しますので、DLL 提供元に問い合わせてみてください。

    たとえば DLL 側が SysAllocString している場合は
    UnmanagedType.BStr あるいは UnmanagedType.AnsiBStr を、
    CoTaskMemAlloc している場合は
    UnmanagedType.LPWStr あるいは UnmanagedType.LPStr を、
    MarshalAs することで対処できる可能性があります。

    あるいは戻り値として、As IntPtr が求められるケースもあるでしょう。
    仮に、戻り値のエンコードが UTF-8 な BSTR だとしたら、
    As String では正しく受けられないはずですので、
    As IntPtr で受け取った上で VB 側でデコードし、
    使用後に Marshal.FreeBSTR メソッドで解放するなどの
    追加手順が必要になるかもしれません。(こちらでは検証できませんが)
違反を報告
返信 削除キー/


Mode/  Pass/


- Child Tree -