C# - 使用固定大小的out参数调用非托管函数

时间:2011-10-13 14:50:43

标签: c# unmanaged

我一直在寻找最近12个小时左右的时间,并且不认为我现在甚至在正确的轨道上,或者我是否正确地搜索了我的搜索。我希望有人能在这里指出我正确的方向。

我正在尝试访问非托管库中的一个函数,该函数将其参数作为其中一个固定大小的DWORD数组,我不知道如何在声明或调用中指定它。我也不确定该功能的文档是否正确(或者如果我理解的话)。

  

int EloGetScreenInfo(DWORD dwMonNum[32], int iScrCnt)

     

参数:   dwMonNum [in]:用于接收与触摸屏关联的Windows监视器编号的DWORD数组。

     

iScrCnt [out]:它检索找到的Elo触摸屏的总数。

     

返回值:如果调用成功则返回EloSuccess,否则返回错误代码。有关错误值列表,请参阅错误代码部分。

     

说明:

     

它返回与触摸屏关联的Windows监视器编号列表,其中索引是触摸屏编号,值是Windows监视器编号。

     

触摸屏基于0,Windows监视器编号基于1。

     

如果未校准触摸屏,则Windows监视器将返回-1。

     

支持最多32个触摸屏。

请注意,在描述中它声明它返回一个监视器编号列表,表示它将是填充值,但在参数描述中它显示为[in]并且count参数为{ {1}}除非我误解了描述。 在另请参见示例链接中,它显示了一个使用示例,其中两者似乎都已填充

[out]

任何方向的TIA或您可以提供的帮助

2 个答案:

答案 0 :(得分:3)

你应该可以使用UInt32的正常数组来调用它。您的托管原型将是:

[DLLImport "DllName"]
static extern int EloGetScreenInfo(UInt32[] dwMonNum, out int iScrCnt);

要调用它,只需指定编组:

UInt32[] MonitorNumbers = new UInt32[32];
int iScrCnt = 0;

int rslt = EloGetScreenInfo(
    [MarshalAs(UnmanagedType.LPArray, SizeConst=32)] MonitorNumbers,
    out iScrCnt);

答案 1 :(得分:1)

这就是MSDN suggests

using DWORD = System.UInt32;

int YourUnmanagedFunction([MarshalAs(UnmanagedType.LPArray, SizeConst=32)] DWORD[] array);