2016-08-19 70 views
0

我想在我的python项目中调用.NET dll。我想使用返回字符串并获取字符串参数的函数。通过把一些代码段解决的错误:但不知何故,我不能得到字符串我就可以得到字符串的第一个字符,有时以下错误引发.Net dll函数返回Python中字符串的第一个字符

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

编辑

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

但是这次结果并不是我想要的。结果是:b'h \ XE7 \ x8c \ X80'与输入“你好”

这里是我的代码:

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。 所以我不明白我的代码有什么问题。

任何帮助,将不胜感激..

编辑:

导出的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函数。显示原型。你仍然需要导出一个C原型来从'ctypes'调用它。如果您只看到第一个字符,则暗示应该使用'c_char_p',因为'c_wchar_p'会将该字符串作为''h \ x00e \ x00l \ x00l \ x00o \ x00''传递并且在第一个字节之后看起来为空。 –

回答

1

如果使用非托管导出,其封送示例默认为“.Net将这些字符串封送为单字节Ansi”。如果是这样,请使用c_char_p并从Python传递字节字符串。

相关问题