【发布时间】:2015-11-20 03:33:16
【问题描述】:
好的,我有一个 DLL 函数声明为:
[DllImport(mDllName, EntryPoint = "SetParam")]
public static extern bool setParam(string param_name, ref IntPtr param_value);
这个函数有很多不同的参数,例如在 C++ 中你会这样使用它。
int i=2;
setParam("width", &i);
float k=2.5f;
setParam("factor", &f);
所以我试图声明一个 C# 函数来调用这个 DLL api,我有一个用于指向整数大小写的指针:
public static void setWidth(int width)
{
IntPtr w = new IntPtr(width);
setParam("width", ref w);
}
但我不知道如何做第二个,我将一个指针作为 IntPtr 传递给一个浮点数。有什么想法吗?
public static void setFactor(float f)
{
IntPtr w = new IntPtr(f); // WHAT GOES HERE??
setParam("factor", ref w);
}
【问题讨论】:
-
你为什么使用 IntPtr 作为 param_value。您是否尝试过使用 float 而不是 IntPtr
-
@XPD:在这里使用
IntPtr是正确的(尽管有更好的方法),因为本机setParam本质上期望像void*这样的东西——一个指向由其他参数定义的东西的通用指针。在 C# 方面,此类指针由 IntPtr 类表示。IntPtrnt 的意思是“指向整数的指针”,它是“指针作为整数值”。另一件事是,rukiman 以错误的方式使用 IntPtr。IntPtr(width)会将“width”值作为指针值,即会将width=32作为0x00000020指针 -
rukiman:请在 Bauss 的回答下查看我的 cmets。我很确定声明应该是
public static extern bool setParam(string param_name, ref IntPtr param_value);而没有ref。可能这就是您的new IntPtr(width)起作用的原因,但这一切都是危险和错误的。 -
@quetzalcoatl 问题是,正确的类型是
IntPtr,而不是ref IntPtr(IntPtr*) - rukiman 声明他正在将指针传递给指针,但他实际上是在传递指针到一个值。然而,这正是非托管方所期望的,所以它确实有效 - 但它清楚地表明 rukiman 不太明白他在做什么 - 如果他真的想通过ref int,这就是他应该声明并通过的。这只是一种非常令人困惑的方式(当然,它会在 64 位上中断)。 -
@Luaan:直到我注意到我忘记从上面的声明中删除
ref之前,我才明白你为什么要给我写这个:) 幸运的是,我提到了删除它。太糟糕的评论被锁定了,我不能再纠正它了。