Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2018.12.23;
Скачать: [xml.tar.bz2];

Вниз

Помогите переписать код C++ на Delphi   Найти похожие ветки 

 
xteam777 ©   (2016-10-11 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 ©   (2016-10-11 14:04) [1]

Вы лучше напишите что не понятно.


 
kilkennycat ©   (2016-10-11 15:17) [2]

http://forum.vingrad.ru/topic-11150.html


 
xteam777 ©   (2016-10-11 16:53) [3]

Спасибо огромное за ссылку.
Но код не компилируется. Пишет ошибку в строке:

var p: PChar;
...

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

Не пойму, что тут делается даже


 
stas ©   (2016-10-11 17:07) [4]

Замени его на p:=p+1;


 
Dimka Maslov ©   (2016-10-11 18:02) [5]

В Delphi небыло и нет арифметики указателей. Надо писать Inc(PCardinal(P)^);


 
iop ©   (2016-10-11 18:22) [6]

с фига ли? (типизированные указатели)

inc(p) и все.


 
xteam777 ©   (2016-10-12 00:03) [7]

Спасибо. Так работает: inc(p)


 
KSergey ©   (2016-10-12 07:41) [8]

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

Серьёзно?!


 
Inovet ©   (2016-10-12 08:09) [9]

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

Я никогда не писал на Делфи, сюда забрёл потому что Билдер есть, но твоё сообщение меня несколько смутило - как же нет этой арифметики указателей, что-то я серьёзно упустил в знании Делфи, да и вообще в логике построения современного языка программирования, ну в которых с памятью надо работать. Где я неправ?


 
KSergey ©   (2016-10-12 09:02) [10]

Почитал интернет. (Извините, конечно, наверное в справке это написано тоже, но я не умею помнить все цитаты или хотя бы их места, как ИШ.)

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

Вспомнилась моя тема
http://delphimaster.net/view/15-1454583291/

Похоже, к ней это тоже применимо: операция "вычесть указатель из указателя" - типа недопустимая (не поддержана), потому и работает "как получилось".


 
iop ©   (2016-10-12 09:31) [11]

только для указателей типа PChar

ага.
только там все указатели "типа PChar", за исключением Pointer


 
Dimka Maslov ©   (2016-10-12 09:34) [12]


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


Значит, серьёзно. А один PChar в программе не указатель.


 
iop ©   (2016-10-12 09:48) [13]

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


осталось вспомнить что полный инк и дек это   (var X : Ordinal; [N : integer])
и то что PChar ничем в этих инках и деках не будет отличаться от любого другого типизированного указателя.


 
Inovet ©   (2016-10-12 10:43) [14]

> [10] KSergey ©   (12.10.16 09:02)
> Вспомнилась моя тема
> http://delphimaster.net/view/15-1454583291/

Я этот код почитал как заклинание. Ничё так получилось, можно убить мага начальной программистской ступени.


 
Inovet ©   (2016-10-12 10:48) [15]

Ну вас всех с вашими этими странными указателями.


 
Inovet ©   (2016-10-12 10:48) [16]

Удалено модератором


 
stas ©   (2016-10-12 13:19) [17]

Dimka Maslov ©   (11.10.16 18:02) [5]
KSergey ©   (12.10.16 09:02) [10]

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


 
Rouse_ ©   (2016-10-12 15:09) [18]

Адресная арифметика поддерживается для любого типизированного указателя, особенно когда его не кастят к целочисленным типам.
Азы-азов



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2018.12.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.002 c
15-1475703002
Юрий
2016-10-06 00:30
2018.12.23
С днем рождения ! 6 октября 2016 четверг


6-1286616123
Ref
2010-10-09 13:22
2018.12.23
WebBrowser Парсер


11-1266336914
michael
2010-02-16 19:15
2018.12.23
kol with delphi 2010


15-1475743983
KSergey
2016-10-06 11:53
2018.12.23
GitHub Desktop для WinXP


8-1246160987
ormada
2009-06-28 07:49
2018.12.23
разрезать видео файл





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский