ПЗУ КПК или НЕРАЗБЕРИХА
От: XGarik  
Дата: 29.09.05 17:09
Оценка:
Доброго времени суток!

Заметил тут недавно странный баг или так и должно быть?

Код Delphi для копирования файла на КПК (использование библиотеки RAPI.DLL):

procedure TForm1.Button1Click(Sender: TObject);
var
sTemplate:TStringList;
HDes:THandle;
o1:Poverlapped;
BytesWritten:DWORD;
begin
sTemplate:=TStringList.Create;
sTemplate.LoadFromFile('test.xml');
cerapiinit;
HDes := CeCreateFile ('\ipaq file store\test.xml',Generic_Write,File_Share_Write,nil,Create_Always,0,0);
CEWriteFile(HDes,PChar(sTemplate.Text),Length(sTemplate.Text),BytesWritten,@o1);
CECloseHandle(HDes);
CERapiUninit;
showmessage('Скопировано: '+inttostr(BytesWritten) + ' байт');
end;

Обратите внимание на выделенную строку и первый параметр ф-ии CECreateFile... Правильно, это значит создать файл test.xml в ПЗУ.

А теперь попробуем изменить путь так:
HDes := CeCreateFile ('\test.xml',Generic_Write,File_Share_Write,nil,Create_Always,0,0);

Программа выдает сообщение, что скопировано 0 байт. И на КПК создается пустой файл. ПОЧЕМУ? Неужели можно писать только в ПЗУ?

09.10.05 08:28: Перенесено модератором из '.NET' — IT
10.10.05 10:42: Перенесено модератором из 'Delphi & Builder' — Hacker_Delphi
Re: ПЗУ КПК или НЕРАЗБЕРИХА
От: XGarik  
Дата: 10.10.05 07:19
Оценка:
Народ!
Я так и не разобрался! Подскажите пожалуйста!
Re[2]: ПЗУ КПК или НЕРАЗБЕРИХА
От: RAVer  
Дата: 10.10.05 10:37
Оценка:
Держи готовую функцию для копирования с компьютера на устройство. Специально проверял — копирует в корневой каталог без проблем.


function CopyFileToDevice(Dest,Source:PChar;NoMessage:boolean=false):integer;
var FileHandle,CeHandle,Handle:  THandle;
CeFileName:PWideChar;
Res:integer;
BoolRes:boolean;
BufferCount,ReadCount:cardinal;
buffer:array [1..1024] of char;
writesByte:cardinal;
MsgStr:String;
begin
Res:=0;
Handle:=LoadLibrary('rapi.dll');
if Handle<>0 then
 begin
 CeWriteFile := GetProcAddress(Handle, 'CeWriteFile');
 CeCreateFile := GetProcAddress(Handle, 'CeCreateFile');
 CeCreateDirectory := GetProcAddress(Handle, 'CeCreateDirectory');
 CeCloseHandle := GetProcAddress(Handle, 'CeCloseHandle');
 CeRapiInit := GetProcAddress(Handle, 'CeRapiInit');
 CeRapiUninit := GetProcAddress(Handle, 'CeRapiUninit');
 CeGetLastError := GetProcAddress(Handle, 'CeGetLastError');
 if Assigned(CeRapiInit) then CeRapiInit;

 GetMem(CeFileName,512);
 MsgStr:=ExtractFileDir(Dest);
 CeFileName:=StringToWideChar(MsgStr,CeFileName,length(Dest)+1);
 BoolRes:=CeCreateDirectory(CeFileName,nil);

 CeFileName:=StringToWideChar(Dest,CeFileName,length(Dest)+1);
 CeHandle := CeCreateFile(CeFileName,GENERIC_READ or GENERIC_WRITE,0,nil,CREATE_ALWAYS,
             FILE_ATTRIBUTE_NORMAL,0);
 if (CeHandle<>INVALID_HANDLE_VALUE) then
  begin
  BufferCount:=1024;ReadCount:=1024;
  FileHandle:=CreateFile(PChar(Source),GENERIC_READ,0,nil,OPEN_EXISTING,
              FILE_ATTRIBUTE_NORMAL,0);

  if FileHandle<>INVALID_HANDLE_VALUE then
   begin
   while ReadFile(FileHandle,Buffer,BufferCount,ReadCount,nil) and (ReadCount<>0) do
    CeWriteFile(CeHandle,buffer,ReadCount,writesByte,nil);
   CloseHandle(FileHandle);
   end
  else
   begin
   Res:=GetLastError;
   MsgStr:='Не удалось открыть на компьютере файл'+Source;
   if NoMessage=false then ShowMessage(MsgStr+'. Код ошибки:'+IntToStr(Res));
   end;//if FileHandle...

  CeCloseHandle(CeHandle);
  FreeMemory(CeFileName);
  end
 else
  begin
  Res:=CeGetLastError;
  MsgStr:='Не удалось создать файл '+CeFileName+' на устройстве';
  if NoMessage=false then ShowMessage(MsgStr+'. Код ошибки:'+IntToStr(Res));
  end;//if CeHandle...

 if Assigned(CeRapiUninit) then CeRapiUninit;
 FreeLibrary(Handle);
 end//if Handle<>0...
else
 begin
 Res:=1;
 if NoMessage=false then ShowMessage('Не удалось открыть библиотеку RAPI. Установите ActiveSync');
 end;
Result:=Res;
end;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.