-
С этими указателями уже весь мозг поломал.
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); }
-
Вы лучше напишите что не понятно.
-
-
Спасибо огромное за ссылку. Но код не компилируется. Пишет ошибку в строке:
var p: PChar; ...
inc(cardinal(p)); Left sude cannot be assigned too
Не пойму, что тут делается даже
-
Замени его на p:=p+1;
-
В Delphi небыло и нет арифметики указателей. Надо писать Inc(PCardinal(P)^);
-
с фига ли? (типизированные указатели)
inc(p) и все.
-
Спасибо. Так работает: inc(p)
-
> Dimka Maslov © (11.10.16 18:02) [5] > В Delphi небыло и нет арифметики указателей. Надо писать > Inc(PCardinal(P)^);
Серьёзно?!
-
> [5] Dimka Maslov © (11.10.16 18:02) > В Delphi небыло и нет арифметики указателей. Надо писать > Inc(PCardinal(P)^);
Я никогда не писал на Делфи, сюда забрёл потому что Билдер есть, но твоё сообщение меня несколько смутило - как же нет этой арифметики указателей, что-то я серьёзно упустил в знании Делфи, да и вообще в логике построения современного языка программирования, ну в которых с памятью надо работать. Где я неправ?
-
Почитал интернет. (Извините, конечно, наверное в справке это написано тоже, но я не умею помнить все цитаты или хотя бы их места, как ИШ.) Оказывается в Delphi адресная арифметика поддержана только для указателей типа PChar и только при использовании функций Inc() и Dec(). Вспомнилась моя тема http://pda.delphimaster.net/?id=1454583291&n=3Похоже, к ней это тоже применимо: операция "вычесть указатель из указателя" - типа недопустимая (не поддержана), потому и работает "как получилось".
-
только для указателей типа PChar
ага. только там все указатели "типа PChar", за исключением Pointer
-
> KSergey © (12.10.16 09:02) [10]
Значит, серьёзно. А один PChar в программе не указатель.
-
Оказывается в Delphi адресная арифметика поддержана только для указателей типа PChar и только при использовании функций Inc() и Dec().
осталось вспомнить что полный инк и дек это (var X : Ordinal; [N : integer]) и то что PChar ничем в этих инках и деках не будет отличаться от любого другого типизированного указателя.
-
-
Ну вас всех с вашими этими странными указателями.
-
Удалено модератором
-
Dimka Maslov © (11.10.16 18:02) [5]KSergey © (12.10.16 09:02) [10]Ну, не знаю, что там и где не поддерживается, в XE p:=p+1; работает нормально.
-
Адресная арифметика поддерживается для любого типизированного указателя, особенно когда его не кастят к целочисленным типам. Азы-азов
|