我一直在搜索最近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任何方向或帮助,您可以提供
这与我的答案基本相同,不是吗?你的更完整,但我没有添加iScrCnt参数。 – lesderid
谢谢你们两位,除非我误解了你们的通话范例,它是两个答案的混合,结果证明是正确的。在你的例子中,你显示MarshalAs,它不编译,因为它不适合在上下文中,它需要在非托管函数声明中指定为lesderid提供,但它不需要是DWORD。谢谢你们俩! – JoshHetland
@lesderid:是的。我没有看到你的,直到我发布了我的。 –