Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.19;
Скачать: CL | DM;

Вниз

Не вызывается метод из Rapi.dll   Найти похожие ветки 

 
PolarS ©   (2003-10-13 19:17) [0]

Не получается выполнить метод из 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. Окно не имеет полос прокрутки.
Подскажите, что я не так делаю.
Заранее благодарен.


 
jack128 ©   (2003-10-13 19:47) [1]

Ошибка не та. Для Rapi ошибка вызывается примерно так.

resourcestring

SWinCEError = "WinCE Error. Code: %d."#10"%s";
SUnkWinCEError = "A WinCE API function failed";

type
EWinCEError = class(EWin32Error);

procedure RaiseLastWinCEError;
var
LastError: DWORD;
Error: EWin32Error;
begin
LastError := CeGetLastError;
if LastError <> ERROR_SUCCESS then
Error := EWinCEError.CreateResFmt(@SWinCEError, [LastError,
SysErrorMessage(LastError)])
else
Error := EWinCEError.CreateRes(@SUnkWinCEError);
Error.ErrorCode := LastError;
raise Error;
end;

Итак. какая у тя ошибка?


 
jack128 ©   (2003-10-13 20:45) [2]

Ха.. туплю я :-)) Все тривиально.. Ты не инициализируешь RAPI

см CeRapiInit и CeRapiInitEx


 
PolarS ©   (2003-10-14 10:27) [3]

Я попробовал сделать по-проще:

function CeRapiInit(): HResult; stdcall; external "RAPI.DLL" index 74; //name "CeRapiInit";
function CeRapiUninit(): HResult; stdcall; external "RAPI.DLL" index 77; //name "CeRapiUninit";
function CeDeleteFile(lpFileName: string): boolean; stdcall; external "RAPI.DLL" index 36; //name "CeDeleteFile";

procedure TForm1.Button2Click(Sender: TObject);
var hRapiResult: HRESULT;
LastError: DWORD;
Error: EWin32Error;
begin
hRapiResult:= CeRapiInit();
if (CeDeleteFile("\sample.xml")) then ShowMessage("Delete is Ok.")
else ShowMessage("Delete is not Ok.");
hRapiResult:= CeRapiUnInit();
end;
При этом всегда "Delete is not Ok." ???
Так можно???


 
jack128 ©   (2003-10-14 10:37) [4]

где проверка hRapiResult ?
if hRapiResult = E_FAIL then
raise Exception.Create("Хана");

кстати как ты запихнул rapi.dll в корень d:\?
Может актив синг ее(rapi.dll) просто не находит??


 
sirius ©   (2003-10-14 10:47) [5]

Проверку я делаю hRapiResult = S_OK.
A путь простоя укоротил "C:\WINNT\system32\rapi.dll".
Пробовал еще так:
type
TCeRapiInit = function (): HResult; stdcall;
TCeRapiUninit = function (): HResult; stdcall;
TCeDeleteFile = function (lpFileName: string): boolean; stdcall;
...
begin
Handle:= LoadLibrary("C:\WINNT\system32\rapi.dll");
try
if Handle = 0 then
raise EDLLLoadError.Create("Can not load DLL.");
@CeRapiInit:= GetProcAddress(Handle, "CeRapiInit");
if not (@CeRapiInit = nil) then
begin
hRapiResult:= CeRapiInit();
if (hRapiResult = S_OK) then begin
ShowMessage("CeRapiInit is Ok.");
@CeDeleteFile:= GetProcAddress(Handle, "CeDeleteFile");
if not (@CeDeleteFile = nil) then begin
res:= CeDeleteFile("\sample.xml");
if (res) then ShowMessage("CeDeleteFile is Ok.")
else ShowMessage("CeDeleteFile is not Ok.");
@CeRapiUnInit:= GetProcAddress(Handle, "CeRapiUnInit");
if not (@CeRapiUnInit = nil) then begin
hRapiResult:= CeRapiUnInit();
if (hRapiResult = S_OK) then ShowMessage("CeRapiUnInit is Ok.")
else ShowMessage("CeRapiUnInit is not Ok.");
end;
end
else
RaiseLastWin32Error;
end
else ShowMessage("CeCreateFile is not Ok.");
end
else
RaiseLastWin32Error;
finally
FreeLibrary(Handle);
end;
end;

CeRapiInit проходит, а CeDeleteFile нет.


 
jack128 ©   (2003-10-14 10:51) [6]

Какую ошибку выдает CeDeleteFile ?? CeGetLastError - что выдает???


 
sirius ©   (2003-10-14 10:59) [7]

WinCe Error.Code 2. Системе не удается найти указанный файл


 
jack128 ©   (2003-10-14 11:05) [8]


> Системе не удается найти указанный файл
B какой из этого ты сделал вывод? ;-))


 
sirius ©   (2003-10-14 11:08) [9]

Файл "\sample.xml" точно на месте.


 
jack128 ©   (2003-10-14 11:23) [10]

Тогда не чем не могу помочь... у мя все работает..


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

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


 
jack128 ©   (2003-10-14 11:49) [12]

Суть та же..

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:57) [13]

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


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

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


 
jack128 ©   (2003-10-14 13:49) [15]


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

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


 
sirius ©   (2003-10-14 14:06) [16]

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


 
jack128 ©   (2003-10-14 14:10) [17]

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


 
jack128 ©   (2003-10-14 14:14) [18]

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


 
jack128 ©   (2003-10-14 14:16) [19]

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

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


 
sirius ©   (2003-10-14 14:16) [20]

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


 
jack128 ©   (2003-10-14 14:19) [21]


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

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


 
sirius ©   (2003-10-14 14:21) [22]

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


 
sirius ©   (2003-10-14 14:28) [23]

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


 
jack128 ©   (2003-10-14 14:30) [24]

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


 
sirius ©   (2003-10-14 15:17) [25]

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


 
jack128 ©   (2003-10-14 15:29) [26]


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


 
jack128 ©   (2003-10-14 15:33) [27]

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


 
sirius ©   (2003-10-14 15:45) [28]

>Код в студию:
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 21:20) [29]

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


 
PolarS ©   (2003-10-15 09:46) [30]

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



Страницы: 1 вся ветка

Текущий архив: 2003.12.19;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.016 c
4-62318
Antarion
2003-10-24 18:10
2003.12.19
Как отключить мышь и клаву через WinApi


1-62040
xprosium
2003-12-06 02:39
2003.12.19
Получение строки


3-61912
MakNik
2003-11-27 13:59
2003.12.19
dxDBGrid


1-62105
Checist [root]
2003-12-09 15:06
2003.12.19
!!! ОШИБКА СЧИТЫВАНИЯ ИЗ ФАЙЛА !!!


1-62124
lightix
2003-12-08 10:19
2003.12.19
QReport+QRichText - как разорвать страницу в нужном месте