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 标签

Windows Mobile 上的矢量图形

Windows Mobile 上的自有窗口

UWP

将 Windows-mobile 6.5 应用程序连接到 PC 上的 sqlite 数据库

Windows Mobile / Windows CE 上的服务器推送 / HTTP 流