47760
こんにちは、お世話になります。

C#でCで作成されたDLLを呼び出そうとしています。  
そこで1つ困ったことがあるので、質問させてください。

今回利用しようとしているDLLは、下記からダウンロードできる「Tags」というものです。

<http://www.un4seen.com/download.php?z/3/tags18>

そして、このDLLでは、戻り値にポインタの先頭位置のアドレスが返ってくるようなんですが、このような関数の呼び出し方がわからずにいます。  
ちなみに、Cの関数宣言では、下記のようになっています。

```

    const char* _stdcall TAGS_Read(
        DWORD handle,
        const char* fmt
    );
    
```

また、リファレンスによると、戻り値は下記のように記述されています。

```

    - empty string when unable to properly read the tag, or when there are no supported tags.
    - pointer to the beginning of a text string, containing extracted
      values from the song tags, on success;
    - a parser error message text, when format string is ill-formed.
    
```

説明不足で申し訳ないのですが、このような関数の呼び出し方および返ってきたアドレスを基にデータを取得する方法を教えていただけないでしょうか。

よろしくお願いいたします。
CC BY-SA 4.0
2018-08-23T06:12:41.840
47755
2018-08-23T08:23:41.780
2018-08-23T08:23:41.780
3060
29034
question
c#
C#でポインタのアドレスが返ってくるDLLの呼び出し方法
774RRさんが

> たとえポインタを得ても C# (manage) 側から C++ (unmanage) 側のメモリを直接アクセスすることはできません。

と否定されていますが実はできます。当該コードはダウンロードしておらずその意味では「そのためには C++
側が返却するポインタが指すメモリの素性がわからないと」という前置きが付きますが、例えば

```

    [DllImport("filename.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
    static extern IntPtr TAGS_Read(int handle, string fmt);
    
```

と定義でき、[`Marshal.PtrToStringAnsi()`](https://msdn.microsoft.com/ja-
jp/library/7b620dhe\(v=vs.110\).aspx)を使用して`'\0'`までの文字列を`string`として読み出したり、[`Marshal.Copy()`](https://msdn.microsoft.com/ja-
jp/library/ms146631\(v=vs.110\).aspx)を使用してバイト配列に読み込んだりできます。

ただし、774RRさんが言われるように「メモリの素性」によっては「マーシャラに任せるのが一番簡単」です。（確保されたメモリを誰がどのように解放するか次第）
CC BY-SA 4.0
2018-08-23T08:01:23.100
47760
2018-08-23T08:01:23.100
4236
47755
answer