首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# -使用固定大小的out参数调用非托管函数

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

Stack Overflow用户
提问于 2011-10-13 14:50:42
回答 2查看 1.1K关注 0票数 1

我已经搜索了大约12个小时,并且认为我甚至没有在这一点上正确的轨道上,或者如果我是正确的措辞我的搜索。我希望有人能给我指明正确的方向。

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

int EloGetScreenInfo(DWORD dwMonNum[32], int iScrCnt) 参数:dwMonNum [in]:接收与触摸屏相关联的Windows编号的DWORD数组。 iScrCnt [out]:它检索找到的Elo触摸屏的总数。 返回值:如果调用成功,则返回EloSuccess,否则返回错误代码。有关错误值的列表,请参见错误代码部分。 备注: 它返回与触摸屏相关联的Windows监视器编号列表,其中,索引是触摸屏编号,值是Windows监视器编号。 触摸屏是基于0的,Windows监视器是基于1的。 如果没有校准触摸屏,则窗口监视器返回为-1。 最多支持32个触摸屏。

注意,它在描述中声明,它返回一个监视器编号列表,这表示它将是已填充的值,但在参数描述中,它显示为[in],计数参数为[out],除非我误解了这些描述。在另一个示例链接中,它显示了一个使用示例,在该示例中两者似乎都已被填充。

代码语言:javascript
复制
    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;

任何方向或帮助,你都可以提供。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-13 15:02:33

您应该能够使用普通的UInt32数组来调用它。您的托管原型将是:

代码语言:javascript
复制
[DLLImport "DllName"]
static extern int EloGetScreenInfo(UInt32[] dwMonNum, out int iScrCnt);

要调用它,只需指定封送处理:

代码语言:javascript
复制
UInt32[] MonitorNumbers = new UInt32[32];
int iScrCnt = 0;

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

Stack Overflow用户

发布于 2011-10-13 14:58:17

这就是MSDN建议

代码语言:javascript
复制
using DWORD = System.UInt32;

int YourUnmanagedFunction([MarshalAs(UnmanagedType.LPArray, SizeConst=32)] DWORD[] array);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7756027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档