Форум: "Система";
Текущий архив: 2003.12.19;
Скачать: [xml.tar.bz2];
ВнизНе вызывается метод из 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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.007 c