Форум: "Прочее";
Текущий архив: 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]
Ну, не знаю, что там и где не поддерживается, в XEp:=p+1;
работает нормально.
← →
Rouse_ © (2016-10-12 15:09) [18]Адресная арифметика поддерживается для любого типизированного указателя, особенно когда его не кастят к целочисленным типам.
Азы-азов
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2018.12.23;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.002 c