如何从使用 void * 从本机函数调用的托管委托中的 IntPtr 参数获取整数值?
How to get integer value from IntPtr-parameter in managed delegate that is called from native function with void *?
我有原生功能
void SetValue(char *FieldName, void *pValue);
我想将其更改为调用更早的设置 callback/delegate
有签名
void SetValueDelegate(string fieldName, IntPtr value);
我这样调用本机 SetValue:
int IntValue = 0;
SetValue("MyField", &IntValue);
现在我认为我可以将它投射到托管委托中:
void SetValueDelegate(string fieldName, IntPtr value)
{
if (fieldName == "MyField")
{
int intValue = (int)value;
}
}
这不起作用。如果转换为 long,它的值为 204790096。
应该怎么做?
在您的托管代码中,value
是 int
变量的地址。因此,您可以这样读取该变量:
int intValue = Marshal.ReadInt32(value);
您的代码只是读取地址,而不是存储在该地址的值。
我有原生功能
void SetValue(char *FieldName, void *pValue);
我想将其更改为调用更早的设置 callback/delegate
有签名
void SetValueDelegate(string fieldName, IntPtr value);
我这样调用本机 SetValue:
int IntValue = 0;
SetValue("MyField", &IntValue);
现在我认为我可以将它投射到托管委托中:
void SetValueDelegate(string fieldName, IntPtr value)
{
if (fieldName == "MyField")
{
int intValue = (int)value;
}
}
这不起作用。如果转换为 long,它的值为 204790096。
应该怎么做?
在您的托管代码中,value
是 int
变量的地址。因此,您可以这样读取该变量:
int intValue = Marshal.ReadInt32(value);
您的代码只是读取地址,而不是存储在该地址的值。