-
Использую Rapi.dll для интерфейса с терминалом сбора данных. Нормально работают CeReadFile, CeWriteFile, CeDeleteFile и т.д., а вот с функцией CeFindFirstFile - проблема. Она обявлена как function CeFindFirstFile(lpFileName: PWideChar; var lpFindFileData: CE_FIND_DATA): THandle; external 'RAPI.DLL'; где
Ce_Find_Data = record dwFileAttributes: DWORD; ftCreationTime: TFileTime; ftLastAccessTime: TFileTime; ftLastWriteTime: TFileTime; nFileSizeHigh: DWORD; nFileSizeLow: DWORD; dwOID: DWORD; cFileName: array [0..MAX_PATH-1] of WideChar; cAlternateFileName: array [0..13] of WideChar; end; Вот кусок кода: var FindHandle: THandle; FindData: CE_FIND_DATA; FSourceMask,FDestDir: string; begin CeRapiInit; FSourceMask := '\My Documents\*.txt'; FDestDir := 'C:\Temp'; FindHandle := CeFindFirstFile(PWideChar(FSourceMask),FindData); ......... end При выполнении CeFindFirstFile вылетает ошибка Access violation at address .... in module 'MSVCR80.dll'.... Код взят из интенета и везде он в таком виде описывается как рабочий. В чем ошибка. Спасибо за любую помощь.
-
Какая версия Дельфи? в старых версиях string = AnsiString, в новых - юникодная
-
Версия Дельфи 2010. Проблема решилась. Нужно было выделить память для FindData. Тема закрыта. Спасибо.
-
А это: var ...
FindData: CE_FIND_DATA; и есть выделение памяти.
-
type _CeWIN32_FIND_DATAW = record dwFileAttributes: DWORD; ftCreationTime: TFileTime; ftLastAccessTime: TFileTime; ftLastWriteTime: TFileTime; nFileSizeHigh: DWORD; nFileSizeLow: DWORD; dwOID: DWORD; cFileName: array[0..MAX_PATH - 1] of WideChar; cAlternateFileName: array[0..13] of WideChar; end; CeWIN32_FIND_DATAW = _CeWIN32_FIND_DATAW; CE_FIND_DATA = ^CeWIN32_FIND_DATAW;
GetMem(FindData, SizeOf(CE_FIND_DATA)); FindHandle := CeFindFirstFile(PWideChar(FSourceMask),FindData);
Это решило проблему.
-
видимо, с объявлением функции тогда что-то не в порядке было, раз понадобилось и var, и указатель использовать.
|