Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2018.12.23;
Скачать: CL | DM;

Вниз

Помогите переписать код 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.007 c
6-1286616123
Ref
2010-10-09 13:22
2018.12.23
WebBrowser Парсер


15-1475753599
Gavana
2016-10-06 14:33
2018.12.23
Автообновление данных


2-1472129362
jcl
2016-08-25 15:49
2018.12.23
Помогите разобраться с потоками в сервисе


4-1290258828
Eraser
2010-11-20 16:13
2018.12.23
Определить под Wine мы или нет


4-1290160827
Boatswain
2010-11-19 13:00
2018.12.23
Кат узнать флэшка или кард-ридер