2011-10-13 38 views
1

我一直在搜索最近12个小时左右,并且不认为我现在甚至在正确的轨道上,或者如果我用我的搜索字词正常。我希望有人能在这里指出我正确的方向。C# - 使用固定大小输出参数调用非托管功能

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

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

参数: dwMonNum [in]:DWORD的阵列来接收与触摸屏相关的Windows显示器编号。

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

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

备注:

它返回那里,该指数是触摸屏号码和值是Windows显示器编号触摸屏相关的Windows显示器号码列表。

触摸屏基于0,Windows显示器号码为1。

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

最多支持32个触摸屏。在描述

注意到它说,它返回监视号码列表这将表明这将是填充值,但在参数说明它表明,作为一个[in]和计数参数作为[out]除非我误解了描述。 在另请参见样本链接它显示使用的例子中,似乎都被填充

DWORD dwEnumMon[MAX_SUPPORTED_SCR] ; 
    int iScrCnt, iRet ; 

    ZeroMemory(dwEnumMon, MAX_SUPPORTED_SCR) ; 
    ZeroMemory(dwMonParam, MAX_SUPPORTED_SCR) ; 

    // Get the list of all Elo Serial & USB screen and monitor association 
    iRet = EloGetScreenInfo(dwEnumMon,iScrCnt) ; 
    if(iRet != EloSuccess){ 
     printf("Error Code = %d \n", iRet) ; 
     return EloFailure; 
    } 
    else 
    if(iScrCnt<0){ 
     printf("No Elo touchscreens found\n") ; 
     return EloFailure; 
    } 

    // Process Commandline 
    ProcessCmdLine(argc, argv) ; 

    // For all screens of matching monitor number enable/disable touch 
    for(int i=0; i<dwMonParamCnt; i++){ 
     // where j is the screen number associated with the monitor number 
     for(int j=0; j<iScrCnt; j++){ 
      if(dwMonParam[i] == dwEnumMon[j]){ 
       // Enables/Disables touch depending on the bFlag 
       // where j is the screen number 
       if((iRet = EloSetTouchReportingState(bEnable , j)) == EloSuccess) 
        printf("EloSetTouchReportingState Returned success\n"); 
       else 
        printf("EloSetTouchReportingState Returned failed. Error \ Code=%d\n", iRet); 
       } 
      } 
     } 

     return EloSuccess; 

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

回答

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); 
+0

这与我的答案基本相同,不是吗?你的更完整,但我没有添加iScrCnt参数。 – lesderid

+0

谢谢你们两位,除非我误解了你们的通话范例,它是两个答案的混合,结果证明是正确的。在你的例子中,你显示MarshalAs,它不编译,因为它不适合在上下文中,它需要在非托管函数声明中指定为lesderid提供,但它不需要是DWORD。谢谢你们俩! – JoshHetland

+0

@lesderid:是的。我没有看到你的,直到我发布了我的。 –

1

这是MSDN suggests

using DWORD = System.UInt32; 

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

(晚)注:DWORD是没有必要的,我只加它的函数声明类似于C++函数尽可能多。 – lesderid