Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не вызывается метод из Rapi.dll [D6]


Страницы:   1 2

PolarS ©   (2003-10-13 19:17:00) 

Не получается выполнить метод из Rapi.dll
Пишу так:

type
_SECURITY_ATTRIBUTES = record
nLength: DWORD;
lpSecurityDescriptor: Pointer;
bInheritHandle: boolean;
end;
LPSECURITY_ATTRIBUTES = ^_SECURITY_ATTRIBUTES;

TCeCreateFile = function (lpFileName: string; dwDesiredAccess: DWORD; dwShareMode: DWORD;
lpSecurityAttributes:LPSECURITY_ATTRIBUTES; dwCreationDistribution: DWORD;
dwFlagsAndAttributes: DWORD; hTemplateFile: Pointer): THandle; StdCall;

EDLLLoadError = class(Exception);

procedure TForm1.Button1Click(Sender: TObject);
var Handle, hDest: THandle;
CeCreateFile: TCeCreateFile;
begin
Handle:= LoadLibrary("D:\rapi.dll");
try
if Handle = 0 then
raise EDLLLoadError.Create("Can not load DLL.");
@CeCreateFile:= GetProcAddress(Handle, "CeCreateFile");
if not (@CeCreateFile = nil) then
begin
hDest:= CeCreateFile("\test.dat",GENERIC_WRITE,FILE_SHARE_READ,nil,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nil);
if (INVALID_HANDLE_VALUE = hDest ) then RaiseLastWin32Error;
end
else RaiseLastWin32Error;
finally
FreeLibrary(Handle);
end;
end;

Ошибка такая: SystemError.Code 1447. Окно не имеет полос прокрутки.
Подскажите, что я не так делаю.
Заранее благодарен.


PolarS   (2003-10-15 09:46:00) [1]

Да, с выделением памяти у меня слабость.
Спасибо. Помогло.


jack128   (2003-10-14 21:20:00) [2]

а память под wfd кто выделять будет?
сравни свой экспорт с экспортом FindFirstFile из windows.pas - сделай выводы...


sirius   (2003-10-14 15:45:00) [3]

>Код в студию:
function CeFindFirstFile(lpFileName: PWideChar; lpFindFileData: LPCE_FIND_DATA):THandle; stdcall; external "RAPI.DLL" index 44;
function CeFindClose(hFindFile: THandle): boolean; stdcall; external "RAPI.DLL" index 41;
...

var hRapiResult: HRESULT;
FindHandle: THandle;
fileName: WideString;
wfd: LPCE_FIND_DATA;

begin
fileName:= "\test.xml";
hRapiResult:= CeRapiInit();
if (hRapiResult = E_FAIL) then begin
ShowMessage("E_FAIL"); Exit;
end;
FindHandle := CeFindFirstFile(PWideChar(fileName), wfd);
if (FindHandle = INVALID_HANDLE_VALUE) then begin
ShowMessage("Find is not Ok.");
Exit;
end
else begin
//RaiseLastWinCEError;
//ShowMessage("Find is Ok."); // или тут вылетает, если нет комментариев
CeFindClose(FindHandle);
end;
hRapiResult:= CeRapiUnInit();
if (hRapiResult = E_FAIL) then begin
ShowMessage("E_FAIL"); Exit;
end;
end; // или тут вылетает


jack128   (2003-10-14 15:33:00) [4]

Вообще если хочешь пообщатся на тему, то давай на мыло...
кстати на rsdn подобные вопросы в форум мобильные устройства задовать, а не в Delphi/Builder ;-)


jack128   (2003-10-14 15:29:00) [5]


> А вот с CeFindFirstFile начались проблемы.
> Она проходит, но по выходу из приложения Access violation.
Это вопрос или констатация факта? Если первое, то код в студию, если второе, то мои соболезнования..


sirius   (2003-10-14 15:17:00) [6]

А вот с CeFindFirstFile начались проблемы.
Она проходит, но по выходу из приложения Access violation.


jack128   (2003-10-14 14:30:00) [7]

знаешь что..попробуй организовать поиск на кпк...(пример выше) Попробуй удалить какой нибудь из найденых файлов.. Проверь найдется ли нужный тебе файл...


sirius   (2003-10-14 14:28:00) [8]

ПОЛУЧИЛОСЬ!!!
Воо, бл..ха-муха. Я при объявлении CeDeleteFile оставил параметром lpFileName: string.
Спасибо тебе, огромное.


sirius   (2003-10-14 14:21:00) [9]

Представляешь, не работает. Блин, я уже начинаю нервничать...


jack128   (2003-10-14 14:19:00) [10]


> Ну и.... выход типа есть???

Даже если тебя съели - есть по крайнй мере два выхода ;-)


sirius   (2003-10-14 14:16:00) [11]

Ну и.... выход типа есть???


jack128   (2003-10-14 14:16:00) [12]

то экспортируешь функции проимерно так
function CeDeleteFile(lpFileName: PWideChar): boolean; stdcall;
external "RAPI.DLL" index 36; //name "CeDeleteFile";

и вызываешь Res := CeDeleteFile(PwideChar(WideString("\mycoolfile.dat")));


jack128   (2003-10-14 14:14:00) [13]

я идиот!!!! :-))...Сам обламался в свое время.
В PocketPC все строки идут в Unicode . анси кпк"шки воообще не поддерживают...


jack128   (2003-10-14 14:10:00) [14]

Я б помог, но в данный момент у меня кпк"шки нету...


sirius   (2003-10-14 14:06:00) [15]

Извини за не скромность.
Можешь у себя совсем простой пример (без классов) сделать с CeDeleteFile, я потом попробую у себя. Я не знаю почему у меня не работает, а очень нужно. Ошибка скорее всего в какой-то мелочи.


jack128   (2003-10-14 13:49:00) [16]


> А ты также загружаешь dll?

нет - статичести


sirius   (2003-10-14 11:58:00) [17]

А ты также загружаешь dll?


sirius   (2003-10-14 11:57:00) [18]

Спасибо, только все равно не помогло :(


jack128   (2003-10-14 11:49:00) [19]

Суть та же..

i := RapiUnit.CeRapiInit();
if i = CERAPI_E_ALREADYINITIALIZED then SelfInitRapi := False
else if i <> ERROR_SUCCESS then Exit
else SelfInitRapi := True;
FFileList := TStringList.Create();
try
temp := FSourceMask;//Маска для копирования
FindHandle := CeFindFirstFile(PWideChar(temp),ffd);
if FindHandle = INVALID_HANDLE_VALUE then begin
FResult := CeGetLastError = ERROR_NO_MORE_FILES;
Exit;
end;
try
FAllToCopy := 0;
repeat
FFileList.AddObject(ExtractFileDir(FSourceMask)+"\"+ffd.cFileName,
TObject(ffd.nFileSizeLow));
inc(FAllToCopy,ffd.nFileSizeLow);
until not CeFindNextFile(FindHandle,ffd);
finally
CeFindClose(FindHandle);
end; // Получили файлы для копирования
FAllCopied := 0;
for i := 0 to FFileList.Count-1 do begin
FSourceFile := FFileList[i];
FDestFile := FDestDir+"\"+ExtractFileName(FSourceFile);
Self.FFileSize := integer(FFileList.Objects[i]);
Self.FFileCopied := 0;
FResult := hpcCopyFileFromHpcToPc( FSourceFile, FDestFile, False, EmplyProc,CallBackFuncEveryBytes, Integer(Self));//копируем файл на PC
if not Result then Break
else begin
Temp := FSourceFile;
CeDeleteFile(PWideChar(Temp));// и удаляем с HPC
end;
end;
finally
FFileList.Free;
if SelfInitRapi then RapiUnit.CeRapiUninit;
end;


sirius   (2003-10-14 11:31:00) [20]

А ты как делал, если не секрет.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо