Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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
14-62254
ASt
2003-11-25 03:45
2003.12.19
IMHO


3-61944
gestern
2003-11-26 19:03
2003.12.19
insert


3-61988
GIL
2003-11-25 15:56
2003.12.19
добавление записи


3-61950
Vick
2003-11-26 17:21
2003.12.19
sp_processmail в MS SQL


4-62322
alexis
2003-10-26 12:05
2003.12.19
Помогите разобраться с функцией !





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский