2009-11-02 71 views
1

所以我试图调用我的非托管C++ DLL中的函数。PInvoke在Windows Mobile平台

void foo(char* in_file, char * out_file) 

在我的C#应用​​程序,我宣布了相同的功能,

[DllImport("dll.dll")] 
public static extern void foo(byte[] in_file, byte[] out_file); 

实际参数我通过一个ASCII编码器,像这样

byte[] param1 = Encoding.ASCII.GetBytes(filename1); 
byte[] param2 = Encoding.ASCII.GetBytes(filename2); 
foo(param1, param2); 

一切正常,除了当长度param1是0或36或72个字符(字节)。然后出于某种原因,DLL报告接收到的长度为1,38,73,并在最后显示0x16字符。

我浪费了半天的时间试图调试并理解为什么会发生这种情况。有任何想法吗? 36的倍数有什么意义?

编辑/解决方案

后,我张贴这一个可能的答案让我吃惊。通过在将字符串转换为字节数组之前将空字符0x0附加到字符串的末尾,我已消除了该问题。虽然我不确定这是否是设计。

回答

2

你已经偶然发现了答案 - 无处传递给函数的长度。

你需要仔细思考你正在运行的功能以及ASCII是否真的是你想要的。

你可能真的想这样,没有ASCII编码必要和空终止的编组类型明确:

[DllImport("dll.dll")] 
public static extern void foo(
    [MarshalAs(LPStr)] string in_file, 
    [MarshalAs(LPStr)] string out_file); 

但检查您的FOO()的实现,并确保你明白你真的希望传递英寸