2012-01-27 19 views
4

char*ポインタを返すネイティブDLLから関数を呼び出していますが、返されたポインタを文字列に変換するにはどうすればよいですか?char * C#の文字列へ

char* c = function(); 
string s = new string(c); 

をしかし、それはちょうどcの正しい値ではありません奇妙な漢字を、返さ: 私が試してみました。

+6

cがUnicode(UTF-16)データを指していることを確認してください。 –

+0

私は 'char *'として "hi"を返すネイティブDLLで関数を呼び出しています。なんらかの理由で、変換された文字列は "hi"ではありません。 – method

+3

あなたを助けるために使用できるものは何も掲載していません。 "私は何かを持っている(しかし、私はそれが何であるかを言うつもりはない)、私はこのことをするとき、私が期待していない何かを戻している(しかし、私はどちらもそれを言っていない)。外部関数の宣言、C#で使用しているimportステートメント、変数宣言を含むコードを呼び出すコードを投稿してください。誰かが助けてくれるかもしれません。それは本当に推測です。 –

答えて

9

おそらく、ネイティブのDLLはなく、実際にUnicode文字列のANSI文字列を返しています。/

using System.Runtime.InteropServices; 
... 
string s = Marshal.PtrToStringAnsi((IntPtr)c); 
+0

ありがとう、私の問題を解決しました。十分な情報を与えないと申し訳ありません。 – method

1

あなたの例は完全にはっきりしていませんが、あなたのコメントは、あなたがc#からC++ dllを呼び出していることを示唆しています。 char *や文字列ではなく、bstrを返す必要があります。

私はこの操作を実行するために持っていたとき、私は使用この質問/答え、で始まると思います:

How to return text from Native (C++) code

2

更新しますPなどの外部関数の宣言を起動します:その場合は、Marshal.PtrToStringAnsiを呼び出す

[DllImport ("MyDll.dll", CharSet = CharSet.Ansi, EntryPoint = "Func")] 
[return : MarshalAs(UnmanagedType.LPStr)] 
string Func (...); 

あなたはポインタを取得した後、余分な作業を行う必要はありません。この方法で。