在.NET Compact Framework中的托管代码(C#)中使用非托管(C)缓冲区

时间:2013-09-13 07:26:27

标签: c# .net c windows windows-ce

我有两个功能。

  1. 注册在C。
  2. 中定义的回叫功能
  3. C#中的回调函数,由IntPtr缓冲区组成。
  4. 在C中,我创建一个字节缓冲区并使用回调函数更新IntPtr。

    问题是,我无法在C#标签对象中打印缓冲区。但是我能够在MessageBox中显示它。

    C#功能:

    private void button1_Click(object sender, EventArgs e)
    {
            Tempclass.RegCallback(Callback);
    }
    
    
    
     public void Callback(IntPtr data,ref  int size)
        {
        byte[] ReadData = new byte[size];
    
        Marshal.Copy(data, ReadData, 0, size); 
    
        String szData  = Encoding.UTF8.GetString(data, 0, size); 
        label1.Text =   szData; // error is here.    
        }
    

    C函数:

    typedef void (__stdcall * Callback)( _Out_ byte* , _Out_ int*);
    void RM2RegImgCallback (_In_ Callback pfnCallback)
    {
        char    buffer[4]={0x64,0x65,0x66,0x00};
        DWORD size =4;
        pfnCallback((byte*)buffer,(int*)&size);
        return;
    }
    

2 个答案:

答案 0 :(得分:0)

您的代码不完整。 Tempclass.Regcallback看起来像什么?您应该在某个时刻调用GetFunctionPointerForDelegate,并且该调用的结果应该是P / Invoke边界的内容。

答案 1 :(得分:-1)

检查.net Framework是否正在使用宽字符,所以也许你应该使用C中的宽字符。