Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
平沃克c++;c#中传递2个浮点数的函数 我在C语言中使用一个非托管C++ DLL,它通过USB来控制一个MaxMeNT设备。首先,我想访问dll中的函数,该函数将从设备返回测量值,并在文档中定义如下: BOOL WINAPI LKIF_GetCalcData(OUT LKIF_FLOATVALUE *CalcData1,OUT LKIF_FLOATVALUE *CalcData2); typedef enum { LKIF_FLOATRESULT_VALID, // valid data LKIF_FLOATRESULT_RANGEOVER_N, // over range at negative (-) side LKIF_FLOATRESULT_WAITING, // comparator result } LKIF_FLOATRESULT; typedef struct { LKIF_FLOATRESULT FloatResult; // valid or invalid data. float Value; // measurement value during LKIF_FLOATRESULT_VALID. Any other times will return an invalid value. } LKIF_FLOATVALUE; LKIF_FLOATVALUE CalcData1; LKIF_FLOATVALUE CalcData2; bool success = Keyence.LKIF_GetCalcData(out CalcData1, out CalcData2);_C#_C_Pinvoke - Fatal编程技术网

平沃克c++;c#中传递2个浮点数的函数 我在C语言中使用一个非托管C++ DLL,它通过USB来控制一个MaxMeNT设备。首先,我想访问dll中的函数,该函数将从设备返回测量值,并在文档中定义如下: BOOL WINAPI LKIF_GetCalcData(OUT LKIF_FLOATVALUE *CalcData1,OUT LKIF_FLOATVALUE *CalcData2); typedef enum { LKIF_FLOATRESULT_VALID, // valid data LKIF_FLOATRESULT_RANGEOVER_N, // over range at negative (-) side LKIF_FLOATRESULT_WAITING, // comparator result } LKIF_FLOATRESULT; typedef struct { LKIF_FLOATRESULT FloatResult; // valid or invalid data. float Value; // measurement value during LKIF_FLOATRESULT_VALID. Any other times will return an invalid value. } LKIF_FLOATVALUE; LKIF_FLOATVALUE CalcData1; LKIF_FLOATVALUE CalcData2; bool success = Keyence.LKIF_GetCalcData(out CalcData1, out CalcData2);

平沃克c++;c#中传递2个浮点数的函数 我在C语言中使用一个非托管C++ DLL,它通过USB来控制一个MaxMeNT设备。首先,我想访问dll中的函数,该函数将从设备返回测量值,并在文档中定义如下: BOOL WINAPI LKIF_GetCalcData(OUT LKIF_FLOATVALUE *CalcData1,OUT LKIF_FLOATVALUE *CalcData2); typedef enum { LKIF_FLOATRESULT_VALID, // valid data LKIF_FLOATRESULT_RANGEOVER_N, // over range at negative (-) side LKIF_FLOATRESULT_WAITING, // comparator result } LKIF_FLOATRESULT; typedef struct { LKIF_FLOATRESULT FloatResult; // valid or invalid data. float Value; // measurement value during LKIF_FLOATRESULT_VALID. Any other times will return an invalid value. } LKIF_FLOATVALUE; LKIF_FLOATVALUE CalcData1; LKIF_FLOATVALUE CalcData2; bool success = Keyence.LKIF_GetCalcData(out CalcData1, out CalcData2);,c#,c,pinvoke,C#,C,Pinvoke,由于这是我第一次使用dll,我花了相当长的时间研究如何使用PInvoke在C#中定义函数,并设法使它部分工作。我能够调用函数,当函数执行时,它似乎正确地返回true或false值。例如,如果设备已打开并准备就绪,则返回true;如果关闭设备,则返回false。但是,应包含测量值的两个浮点值始终返回零值 我首先创建了一个包含PInvoke的类: public class Keyence { [DllImport("c:\\LkIF.dll")] public static exte

由于这是我第一次使用dll,我花了相当长的时间研究如何使用PInvoke在C#中定义函数,并设法使它部分工作。我能够调用函数,当函数执行时,它似乎正确地返回true或false值。例如,如果设备已打开并准备就绪,则返回true;如果关闭设备,则返回false。但是,应包含测量值的两个浮点值始终返回零值

我首先创建了一个包含PInvoke的类:

public class Keyence
{
    [DllImport("c:\\LkIF.dll")]
    public static extern bool LKIF_GetCalcData(
        [Out] float CalcData1, [Out] float CalcData2);
}
然后由getMeasurement方法调用:

static bool getMeasurement(ref float MeasurementValue1, ref float MeasurementValue2)
{
    float CalcData1 = new float();
    float CalcData2 = new float();

    bool sucess = Keyence.LKIF_GetCalcData(CalcData1,CalcData2);

    if (sucess)
    {
        // all is ok
        MeasurementValue1 = CalcData1;
        MeasurementValue2 = CalcData2;
        return (sucess);
    }
    else
    {
        MessageBox.Show("Unable to get measurment.");
        return (sucess);
    }
}
要测试该方法,请使用带有按钮和文本框的简单表单,单击按钮后,文本框值将更新为两个测量值

private void button1_Click(object sender, EventArgs e)
{
    float MeasurementValue1 = new float();
    float MeasurementValue2 = new float();
    bool success = getMeasurement(ref MeasurementValue1, ref MeasurementValue2);
    if (success)
    {
        textBox1.Text = MeasurementValue1.ToString() + "," + MeasurementValue2.ToString();
    }      
}
单击按钮后,文本框中的值将更新为0,0

我见过很多涉及调用非托管函数的线程,其中传递了一个值,但是如果函数返回一个值,则不太多。我有一种感觉,我可能无法正确定义C++中的C++函数,但我现在有点不知所措。

< P>尝试下面的

public enum LKIF_FLOATRESULT {
    LKIF_FLOATRESULT_VALID,
    LKIF_FLOATRESULT_RANGEOVER_N,
    LKIF_FLOATRESULT_WAITING,
}

public struct LKIF_FLOATVALUE {
    public LKIF_FLOATRESULT FloatResult;
    public float Value;
}

public partial class NativeMethods {

    [DllImport("c:\\LkIF.dll")]
    public static extern  bool LKIF_GetCalcData(
        out LKIF_FLOATVALUE CalcData1, 
        out LKIF_FLOATVALUE CalcData2) ;

}
试试下面的方法

public enum LKIF_FLOATRESULT {
    LKIF_FLOATRESULT_VALID,
    LKIF_FLOATRESULT_RANGEOVER_N,
    LKIF_FLOATRESULT_WAITING,
}

public struct LKIF_FLOATVALUE {
    public LKIF_FLOATRESULT FloatResult;
    public float Value;
}

public partial class NativeMethods {

    [DllImport("c:\\LkIF.dll")]
    public static extern  bool LKIF_GetCalcData(
        out LKIF_FLOATVALUE CalcData1, 
        out LKIF_FLOATVALUE CalcData2) ;

}

函数返回的是结构而不是浮点。您必须在C#代码中声明该结构

然后定义p/invoke,将该结构作为out参数传递给函数

[DllImport(@"c:\LkIF.dll")]
public static extern bool LKIF_GetCalcData(
    out LKIF_FLOATVALUE CalcData1, 
    out LKIF_FLOATVALUE CalcData2
);
最后,您可以这样调用函数:

BOOL WINAPI LKIF_GetCalcData(OUT LKIF_FLOATVALUE *CalcData1,OUT LKIF_FLOATVALUE *CalcData2);

typedef enum {
    LKIF_FLOATRESULT_VALID, // valid data
    LKIF_FLOATRESULT_RANGEOVER_N, // over range at negative (-) side
    LKIF_FLOATRESULT_WAITING, // comparator result
} LKIF_FLOATRESULT;

typedef struct {
LKIF_FLOATRESULT FloatResult; // valid or invalid data.
    float Value; // measurement value during LKIF_FLOATRESULT_VALID. 
    Any other times will return an invalid value.
} LKIF_FLOATVALUE;
LKIF_FLOATVALUE CalcData1;
LKIF_FLOATVALUE CalcData2;
bool success = Keyence.LKIF_GetCalcData(out CalcData1, out CalcData2);

函数返回的是结构而不是浮点。您必须在C#代码中声明该结构

然后定义p/invoke,将该结构作为out参数传递给函数

[DllImport(@"c:\LkIF.dll")]
public static extern bool LKIF_GetCalcData(
    out LKIF_FLOATVALUE CalcData1, 
    out LKIF_FLOATVALUE CalcData2
);
最后,您可以这样调用函数:

BOOL WINAPI LKIF_GetCalcData(OUT LKIF_FLOATVALUE *CalcData1,OUT LKIF_FLOATVALUE *CalcData2);

typedef enum {
    LKIF_FLOATRESULT_VALID, // valid data
    LKIF_FLOATRESULT_RANGEOVER_N, // over range at negative (-) side
    LKIF_FLOATRESULT_WAITING, // comparator result
} LKIF_FLOATRESULT;

typedef struct {
LKIF_FLOATRESULT FloatResult; // valid or invalid data.
    float Value; // measurement value during LKIF_FLOATRESULT_VALID. 
    Any other times will return an invalid value.
} LKIF_FLOATVALUE;
LKIF_FLOATVALUE CalcData1;
LKIF_FLOATVALUE CalcData2;
bool success = Keyence.LKIF_GetCalcData(out CalcData1, out CalcData2);

多亏了这两个答案。添加枚举和结构定义修复了该问题。我确实需要将每一个都定义为公共的,就像在这个答案中一样。@用户请记住接受对这两个答案帮助最大的答案。添加枚举和结构定义修复了该问题。我确实需要将每个都定义为公共的,就像在这个答案中一样。用户请记住接受对您帮助最大的答案