Windows Mobile 平台上的 PInvoke
Posted
技术标签:
【中文标题】Windows Mobile 平台上的 PInvoke【英文标题】:PInvoke on the Windows Mobile platform 【发布时间】:2009-11-02 01:42:44 【问题描述】:所以我试图调用我在非托管 C++ dll 中的一个函数。
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 附加到字符串的末尾,我已经消除了这个问题。虽然我不确定这是否是设计使然。
【问题讨论】:
【参考方案1】:您自己偶然发现了答案 - 传递给函数的长度无处不在。
您需要仔细考虑在哪些函数上运行这些函数,以及 ASCII 是否真的是您想要的。
您可能真的想要这个,不需要 ASCII 编码,并且在封送类型中显式地终止 null:
[DllImport("dll.dll")]
public static extern void foo(
[MarshalAs(LPStr)] string in_file,
[MarshalAs(LPStr)] string out_file);
但请检查您的 foo() 实现,并确保您了解您真正期望传入的内容。
【讨论】:
以上是关于Windows Mobile 平台上的 PInvoke的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows Mobile 6.1 Treo 800w 上的 Opera 9.5 Mobile 中使用 Canvas 标签