C # - вызов неуправляемой функции с фиксированным выходным параметром - PullRequest
1 голос
/ 13 октября 2011

Я искал последние 12 часов или около того и не думаю, что на этом этапе я даже на правильном пути или правильно формулирую свои поиски.Я надеюсь, что кто-то может указать мне правильное направление здесь.

Я пытаюсь получить доступ к функции в неуправляемой библиотеке, которая принимает в качестве одного из своих параметров массив DWORD фиксированного размера, и я не уверенкак это указать в декларации или звонить.Я также не уверен, что документация для этой функции верна (или если я ее понимаю).

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

Параметры: dwMonNum [in]: Массив DWORD дляполучить номер монитора Windows, связанный с сенсорными экранами.

iScrCnt [out]: он возвращает общее количество найденных сенсорных экранов Elo.

Возвращаемые значения: Возвращает EloSuccess, если вызов завершается успешно, он возвращает ошибкукод в противном случае.Список значений ошибок см. В разделе «Коды ошибок».

Примечания:

Возвращает список номеров мониторов Windows, связанных с сенсорными экранами, где индекс - это номер сенсорного экрана, а значение - Windows.номер монитора.

Сенсорные экраны основаны на 0, а номера мониторов Windows - на основе 1.

Если сенсорный экран не откалиброван, монитор Windows возвращается как -1.

Максимумиз 32 сенсорных экранов поддерживаются.

Обратите внимание, что в описании говорится, что он возвращает список номеров мониторов, который предполагает, что это будет заполненное значение, но в описании параметров он показывает, что как[in] и параметр count как [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 для любого направления или помощи, которую вы можете предоставить

Ответы [ 2 ]

3 голосов
/ 13 октября 2011

Вы должны быть в состоянии вызвать это с обычным массивом 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 голос
/ 13 октября 2011

Это то, что MSDN предлагает :

using DWORD = System.UInt32;

int YourUnmanagedFunction([MarshalAs(UnmanagedType.LPArray, SizeConst=32)] DWORD[] array);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...