如何将void*(指向double或int)从C传递到C#



我在C:中有通用回调类型

typedef int(*OverrideFieldValueSetCB_t)(const char *Dialog, const char *FieldName, void *Value);

和回调:

OverrideFieldValueSetCB_t       gOverrideFieldValueSetCB;

以及我在C代码中调用的函数,将值传递给C#:

int DllGuiSetFieldValue(const char *Dialog, const char *FieldName, void *pValue)
{   
    return gOverrideFieldValueSetCB(Dialog, FieldName, pValue);
}

在C#代码中,我设置了这种委托:

private static int OverrideFieldValueSetCb(string dialogName, string fieldName, IntPtr value)
{
    ///...
}

在上面,我想根据fieldName将值封送/强制转换为int或double。

问题:

  1. IntPtr正确吗
  2. 如果IntPtr是正确的,如何将其强制转换/封送为double或int

"指向double或int"只是在找麻烦。

但是,如果您确定这是您想要的方式,请查看Marshal类——Marshal.ReadInt32用于intMarshal.PtrToStructure<double>用于double。确保你不会把两者搞砸:)

当然,如果可以使用unsafe代码,则不需要使用Marshal。就像你在C.里演的一样

示例:

double val = 123.45d;
double second;
double third;
unsafe
{
  void* ptr = &val;
  second = *(double*)ptr;
  third = Marshal.PtrToStructure<double>(new IntPtr(&val));
}
second.Dump();

如果dialogName和fieldName指示它是双I do:

    private int ChangeFieldValue(string fieldName, IntPtr newValue)
    {
        double[] destination = new double[1];
        Marshal.Copy(newValue, destination, 0, 1);

对此有什么想法吗?似乎有效。

相关内容

  • 没有找到相关文章

最新更新