2016-08-19 1 views
0

私はPythonプロジェクトに.NET dllを呼び出します。私は文字列を返す関数を使い、文字列パラメータを取得したい。.Net dll関数はPythonの文字列の最初の文字を返します

'charmap' codec can't encode characters in position 1-15: character maps to  <undefined> 

EDIT:しかし、どういうわけか、私は単なる文字列の最初の文字を取得することができ、時にはそれが次のエラーを発生させる文字列を取得カントのコードのいくつかの作品を置くことによって、エラーを解決しました。

しかし、今回の結果はまさに私が望むものではありません。結果は次のとおりです。b'h \ XE7 \ x8c \ X80' は、入力"hello" をここで

は私のコードです:関数は、文字列パラメータを取得し

import ctypes 
import time 

hllDll = ctypes.WinDLL ("C:\\Users\\yazilimhpaio2\\Downloads\\mydll.dll") 


hllApiProto = ctypes.WINFUNCTYPE (
    ctypes.c_wchar_p, # Return type. 
    ctypes.c_wchar_p  # Parameter 1 ... 
)     

hllApiParams = (1,"p1",0), 

hllApi = hllApiProto (("ReturnMyString", hllDll), hllApiParams) 

var = "hello" 

p1 = ctypes.c_wchar_p (var) 

x = hllApi (p1) 

print(x.encode(sys.stdout.encoding, errors='replace')) 

time.sleep(3) 

ReturnMyStringとパラメータことを返します。しかし、このコードを実行すると、パラメータの最初の文字が表示されます。

私はPythonでc_wchar_p is used for stringを見つけました。 私のコードで何が問題なのか理解できませんでした。

任意の助けをいただければ幸いです。..

EDIT:

エクスポートされたDLL関数:

[ComVisible(true)] 
[DllExport("ReturnMyString", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)] 
public static string ReturnMyString(string value) 
{ 
    return value; 
} 

プロトタイプ:

public static string ReturnMyString(string) 
+1

呼び出しようとしているC関数のプロトタイプは何ですか?それが 'char *'をとるなら 'c_char_p'を使い、' wchar_t * 'を使うには' c_wchar_p'を使います。私はそれが前者だと思う。もしそうなら、Python 3の文字列を渡すのではなく、バイト文字列... b'hello 'を使ってください。 –

+0

@MarkTolonen dllはC#で書かれているので、文字列のみを取り、文字列を返します。 – Hilal

+1

次に、DLL関数をどのようにエクスポートするかを示します。プロトタイプを表示します。 'ctypes'から呼び出すためにCプロトタイプをエクスポートする必要があります。 'c_wchar_p'が''h \ x00e \ x00l \ x00l \ x00o \ x00 ''という文字列を渡し、最初のバイトの後でヌルで終わるように見えるので、 'c_char_p'が使われなければならないことを意味する最初の文字だけが見えます。 –

答えて

1

管理されていないエクスポートを使用している場合、マーシャリングの例では、デフォルトで「.Netはこれらの文字列を1バイトのAnsiとしてマーシャリングします」と表示されます。その場合は、c_char_pを使用し、Pythonからバイト文字列を渡します。

関連する問題