C ++ DLL函数似乎不适用于C#

时间:2011-06-01 16:16:54

标签: c# c++ dll pinvoke

我使用C#和bird.dll开发了一个小程序,但birdRS232WakeUp()函数似乎没有用。

当我在C ++中调用birdRS232WakeUp()函数时,程序将停止一段时间(8-10秒)。看起来它开始进行与硬件连接的过程(鸟群)。

但在C#中,它在调用birdRS232WakeUp()时不会停止。我该如何解决这个问题?

C#代码如下所示。

[DllImport(@"Bird.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern bool birdRS232WakeUp(int nGroupID, Boolean  bStandAlone, int nNumDevices,
                                          ref ushort[] pwComport, uint dwBaudRate,
                                          uint dwReadTimeout, uint dwWriteTimeout);

ushort[] COM_port = new ushort[]{0,16,0,0,0};
if ((!birdRS232WakeUp(GROUP_ID, false, DEVCOUNT, ref COM_port, BAUD_RATE, READ_TIMEOUT, WRITE_TIMEOUT)))
{
    LWakeUpStatus.Text = "Failde to wake up FOB";
}

C ++代码如下所示。

WORD COM_port[5] = {0,15,0,0,0}

if ((!birdRS232WakeUp(GROUP_ID,
    FALSE, // Not stand-alone
    DEVCOUNT, // Number of Devices
    COM_port, // COM Port
    BAUD_RATE, // BAUD
    READ_TIMEOUT,WRITE_TIMEOUT, // Reponses timeouts
    GMS_GROUP_MODE_ALWAYS)))
{
    printf("Can't Wake Up Flock!\n");
    Sleep(3000);
    exit(-1);}

此函数的C ++头文件:

birdRS232WakeUp(int nGroupID, BOOL bStandAlone, int nNumDevices,
                WORD *pwComport, DWORD dwBaudRate, DWORD dwReadTimeout,
                DWORD dwWriteTimeout, int nGroupMode = GMS_GROUP_MODE_ALWAYS);

手册指出“pwComport”指向一个单词数组,每个单词都是附加到其中一个鸟的COM端口号(例如,COM1 = 1,COM2 = 2等)< / p>

更新1:

我接受了elder_george的建议,但问题仍然存在。我不得不将C#代码更改为以下内容。

public  static extern bool birdRS232WakeUp(int nGroupID, Boolean  bStandAlone, int nNumDevices,
                           ushort[] pwComport, uint dwBaudRate, uint dwReadTimeout,
                           uint dwWriteTimeout,int nGroupMode);

if ((!birdRS232WakeUp(GROUP_ID, false, DEVCOUNT, COM_port, BAUD_RATE, READ_TIMEOUT, WRITE_TIMEOUT,2)))
{
    LWakeUpStatus.Text = "Failde to wake up FOB";
}

BTW,int n GroupMode等于2,基于下面的枚举类型。

enum GroupModeSettings
{
    //    GMS_DEFAULT,         // Driver will determine whether or not to use RS232 group mode.
    GMS_GROUP_MODE_NEVER,      // RS232 group mode will never be used
    GMS_GROUP_MODE_ALWAYS,     // RS232 group mode will always be used
    NUM_GROUP_MODE_SETTINGS
};

1 个答案:

答案 0 :(得分:1)

不确定这些要点是否能解决您的问题,但是:

1)pwComport应声明为ushort[] pwComport,而不是ref ushort[] pwComport

2)您需要从C#传递nGroupMode参数。如果使用C#4,可以将其设置为默认值,但不要忽略它。