【问题标题】:Marshalling char arrays in the Compact Framework在 Compact Framework 中编组字符数组
【发布时间】:2012-05-11 08:12:17
【问题描述】:

在紧凑的框架(3.5)上,我有一个 pinvoke 如下:

[DllImport("VAMDll.dll", SetLastError = true, EntryPoint = "openLiteSpatial")]
public static extern int OpenLiteSpatial(byte[] mode, byte[] data, byte[] capture, IntPtr callback);

对于以下原生函数 sig:

int openLiteSpatial(char *mode, char *data, char *capture, void callBack(char *, char *));

向内传递参数可以正常工作,如下所示:

Native.OpenLiteSpatial(Encoding.UTF8.GetBytes(Mode.FunctionalLocation), Encoding.UTF8.GetBytes(functionalLocation), Encoding.UTF8.GetBytes(capture), Marshal.GetFunctionPointerForDelegate(callback));

但在我的回调中,我必须对回调参数字符串做一些奇怪的转换:

public delegate void LiteSpatialCallback(string attributeData, string geoCoordinate);
    public static void Callback(string attributeData, string geoCoordinate)
    {
        byte[] decodedAttributeData = Encoding.Unicode.GetBytes(attributeData);
        byte[] decodedGeoCoordinate = Encoding.Unicode.GetBytes(geoCoordinate);

        attributeData = Encoding.UTF8.GetString(decodedAttributeData, 0, decodedAttributeData.Length);
        geoCoordinate = Encoding.UTF8.GetString(decodedGeoCoordinate, 0, decodedGeoCoordinate.Length);
    }

我尝试在 DllImport 属性上指定 Charset,并使用 byte[] 数组(这会导致回调根本不被调用),并指定各种 MarshalAs 选项。

有没有更好的办法?

【问题讨论】:

    标签: c# compact-framework pinvoke


    【解决方案1】:

    我倾向于将 IntPtrs 传递给委托参数,然后使用内存窗口准确查看它们返回的内容。它是指向数据的指针吗?指向指针的指针?数据本身?它是 Unicode 还是 ASCII?所有这些都可以通过遍历返回的地址来确定。然后,您可以直接从该目标手动复制,也可以根据您的发现重新处理 P/Invoke 和/或委托签名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 2011-02-09
      相关资源
      最近更新 更多