Конференция "WinAPI" » Ошибка в модуле msvcr80.dll ghb вызове CeFindFirstFile [WinXP]
 
  • mefodiy (18.04.13 11:48) [0]
    Использую 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'....
    Код взят из интенета и везде он в таком виде описывается как рабочий. В чем ошибка. Спасибо за любую помощь.
  • MBo © (18.04.13 11:54) [1]
    Какая версия Дельфи?
    в старых версиях  string = AnsiString, в новых - юникодная
  • mefodiy (18.04.13 12:08) [2]
    Версия Дельфи 2010.
    Проблема решилась. Нужно было выделить память для FindData.
    Тема закрыта.
    Спасибо.
  • MBo © (18.04.13 12:24) [3]
    А это:
    var ...
         FindData: CE_FIND_DATA;


    и есть выделение памяти.
  • mefodiy (18.04.13 12:46) [4]
    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);

    Это решило проблему.
  • MBo © (18.04.13 13:40) [5]
    видимо, с объявлением функции тогда что-то не в порядке было, раз понадобилось и var, и указатель использовать.
 
Конференция "WinAPI" » Ошибка в модуле msvcr80.dll ghb вызове CeFindFirstFile [WinXP]
Есть новые Нет новых   [134430   +4][b:0][p:0.001]