Конференция "Прочее" » Помогите переписать код C++ на Delphi
 
  • xteam777 © (11.10.16 10:56) [0]
    С этими указателями уже весь мозг поломал.

    BOOL
    GetFilenameFromHandle(HANDLE hFile) {

     BOOL bSuccess = FALSE;
     TCHAR* pszFilename[MAX_PATH+1];
     uint uMaxLenDest = 0;

     // Получаем размер файла.
     DWORD dwFileSizeHi = 0;
     DWORD dwFileSizeLo = GetFileSize(hFile, &dwFileSizeHi);

     // Делаем мапинг файла.
     HANDLE hFileMap = CreateFileMapping(hFile,
                                         NULL,
                                         PAGE_READONLY,
                                         0,
                                         dwFileSizeLo,
                                         NULL);

     if (hFileMap) {
       // Маппинг для получения имени файла.
       void* pMem = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 1);

       if (pMem) {
         if (GetMappedFileName (GetCurrentProcess(),
                                pMem,
                                pszFilename,
                                MAX_PATH)) {

           // Переводим путь с именем устройства в букву диска
           TCHAR szTemp[512];
           *szTemp = NULL;

           if (GetLogicalDriveStrings(MAX_ARRAY_ITEMS(szTemp)-1,
                                      szTemp)) {
             TCHAR szName[MAX_PATH];
             TCHAR szDrive[3] = TEXT(" :");
             BOOL bFound = FALSE;
             TCHAR* p = szTemp;

             do {
               // Копируем букву диска во временную строку,
               // удаляя обратный слэш.
               *szDrive = *p;

               // Проверяем каждое имя устройства.
               if (QueryDosDevice(szDrive, szName,
                                  MAX_ARRAY_ITEMS(szName))) {
                 uint uNameLen = _tcslen(szName);

                 // Если больше, чем длина имени файла, то не удовлетворяет
                 if (uNameLen < uMaxLenDest) {
                   bFound = _tcsnicmp(pszFilename, szName, uNameLen)
                                       == 0;

                   if (bFound) {
                     // Заново создаём pszFilename используя szTemp и
                     // заменяем путь устройства нашим DOS-путём.
                     TCHAR szTempFile[MAX_PATH];
                     _stprintf(szTempFile,
                               TEXT("%s%s"),
                               szDrive,
                               pszFilename+uNameLen);
                     stringCopy(pszFilename, szTempFile, uMaxLenDest);
                   }
                 }
               }

               // Переходим к следующему нулевому символу.
               while (*p++);
             } while (!bFound && *p); // в конце строки
           }
         }
         bSuccess = TRUE;
         if (!UnmapViewOfFile(pMem)) assert(0);
       }

       if (!CloseHandle(hFileMap)) assert(0);
     }
     return(bSuccess);
    }
  • stas © (11.10.16 14:04) [1]
    Вы лучше напишите что не понятно.
  • kilkennycat © (11.10.16 15:17) [2]
  • xteam777 © (11.10.16 16:53) [3]
    Спасибо огромное за ссылку.
    Но код не компилируется. Пишет ошибку в строке:

    var p: PChar;
    ...

    inc(cardinal(p));
    Left sude cannot be assigned too

    Не пойму, что тут делается даже
  • stas © (11.10.16 17:07) [4]
    Замени его на p:=p+1;
  • Dimka Maslov © (11.10.16 18:02) [5]
    В Delphi небыло и нет арифметики указателей. Надо писать Inc(PCardinal(P)^);
  • iop © (11.10.16 18:22) [6]
    с фига ли? (типизированные указатели)

    inc(p) и все.
  • xteam777 © (12.10.16 00:03) [7]
    Спасибо. Так работает: inc(p)
  • KSergey © (12.10.16 07:41) [8]
    > Dimka Maslov ©   (11.10.16 18:02) [5]
    > В Delphi небыло и нет арифметики указателей. Надо писать
    > Inc(PCardinal(P)^);

    Серьёзно?!
  • Inovet © (12.10.16 08:09) [9]
    > [5] Dimka Maslov ©   (11.10.16 18:02)
    > В Delphi небыло и нет арифметики указателей. Надо писать
    > Inc(PCardinal(P)^);

    Я никогда не писал на Делфи, сюда забрёл потому что Билдер есть, но твоё сообщение меня несколько смутило - как же нет этой арифметики указателей, что-то я серьёзно упустил в знании Делфи, да и вообще в логике построения современного языка программирования, ну в которых с памятью надо работать. Где я неправ?
  • KSergey © (12.10.16 09:02) [10]
    Почитал интернет. (Извините, конечно, наверное в справке это написано тоже, но я не умею помнить все цитаты или хотя бы их места, как ИШ.)

    Оказывается в Delphi адресная арифметика поддержана только для указателей типа PChar и только при использовании функций Inc() и Dec().

    Вспомнилась моя тема
    http://pda.delphimaster.net/?id=1454583291&n=3

    Похоже, к ней это тоже применимо: операция "вычесть указатель из указателя" - типа недопустимая (не поддержана), потому и работает "как получилось".
  • iop © (12.10.16 09:31) [11]
    только для указателей типа PChar

    ага.
    только там все указатели "типа PChar", за исключением Pointer
  • Dimka Maslov © (12.10.16 09:34) [12]

    > KSergey ©   (12.10.16 09:02) [10]


    Значит, серьёзно. А один PChar в программе не указатель.
  • iop © (12.10.16 09:48) [13]
    Оказывается в Delphi адресная арифметика поддержана только для указателей типа PChar и только при использовании функций Inc() и Dec().


    осталось вспомнить что полный инк и дек это   (var X : Ordinal; [N : integer])
    и то что PChar ничем в этих инках и деках не будет отличаться от любого другого типизированного указателя.
  • Inovet © (12.10.16 10:43) [14]
    > [10] KSergey ©   (12.10.16 09:02)
    > Вспомнилась моя тема
    > http://pda.delphimaster.net/?id=1454583291&n=3

    Я этот код почитал как заклинание. Ничё так получилось, можно убить мага начальной программистской ступени.
  • Inovet © (12.10.16 10:48) [15]
    Ну вас всех с вашими этими странными указателями.
  • Inovet © (12.10.16 10:48) [16]
    Удалено модератором
  • stas © (12.10.16 13:19) [17]
    Dimka Maslov ©   (11.10.16 18:02) [5]
    KSergey ©   (12.10.16 09:02) [10]

    Ну, не знаю, что там и где не поддерживается, в XE
    p:=p+1;

    работает нормально.
  • Rouse_ © (12.10.16 15:09) [18]
    Адресная арифметика поддерживается для любого типизированного указателя, особенно когда его не кастят к целочисленным типам.
    Азы-азов
 
Конференция "Прочее" » Помогите переписать код C++ на Delphi
Есть новые Нет новых   [134431   +14][b:0][p:0.001]