пишу на дэльфях прогу автозапуска на флэшку, которая бы автоматически писала в desktop.ini тот файл background-картинку, который соответствует разрешению экрана. проблема при поиске этих desktop.ini на флэшке. возможно проблема в русскоязычных именах папок или в длине пути поиска... вот мой код:
program autorun;
{$APPTYPE CONSOLE}
uses
Windows,
SysUtils,
Classes,
Forms,
IniFiles;
procedure WriteResolutionToIni(const FileName: string);
var
Data: TIniFile;
begin
Data:=TIniFile.Create(FileName);
try
Data.WriteString('{BE098140-A513-11D0-A3A4-00C04FD706EC}',
'IconArea_Image',
'background.'+IntToStr(Screen.Width)+'x'+IntToStr( Screen.Height)+'.jpg');
finally
Data.Free;
end;
end;
function LowerCase(const S: string): string;
asm
push ebx
push esi
push edi
mov esi, eax
mov eax, edx
test esi, esi
jz @Nil
mov edx, [esi-4]
mov edi, eax
test edx, edx
jle @Nil
mov ecx, [eax]
mov ebx, edx
test ecx, ecx
jz @Realloc
test edx, 3
jnz @Length3
xor edx, [ecx-4]
cmp edx, 3
jbe @TestRef
jmp @Realloc
@Length3:
or edx, 2
xor edx, [ecx-4]
cmp edx, 1
ja @Realloc
@TestRef:
cmp [ecx-8], 1
je @LengthOK
@Realloc:
mov edx, ebx
or edx, 3
call System.@LStrSetLength
@LengthOK:
mov edi, [edi]
mov [edi-4], ebx
mov byte ptr [ebx+edi], 0
add ebx, -1
and ebx, -4
mov eax, [ebx+esi]
@Loop: mov ecx, eax
or eax, $80808080
mov edx, eax
sub eax, $5B5B5B5B
xor edx, ecx
or eax, $80808080
sub eax, $66666666
and eax, edx
shr eax, 2
xor eax, ecx
mov [ebx+edi], eax
mov eax, [ebx+esi-4]
sub ebx, 4
jge @Loop
pop edi
pop esi
pop ebx
ret
@Nil: pop edi
pop esi
pop ebx
jmp System.@LStrClr
end;
procedure ScanFile(const f: string);
begin
if (LowerCase(ExtractFileName(f)) = 'desktop.ini') then
begin
writeln(f);
//WriteResolutionToIni(f);
end;
end;
procedure ScanDir(d: string);
var
sr: tsearchrec;
f: string;
begin
if findfirst(d+'\*.*',faanyfile,sr) <> 0 then
findclose(sr)
else
repeat
f:=d+'\'+sr.name;
if sr.attr <> fadirectory then
begin
ScanFile(f);
end
else
begin
if (sr.name <> '.') and (sr.name <> '..') then
ScanDir(f);
end;
until findnext(sr) <> 0;
findclose(sr);
end;
var
list: TStringList;
i: integer;
s: string;
begin
list:=TStringList.Create;
list.LoadFromFile(ExtractFilePath(ParamStr(0))+'au torun.txt');
for i:=0 to list.Count-1 do
begin
s:=list[i];
if (s[1] <> ';') and (s[1] <> '/') and (s[2] <> '/') then
begin
s:=ExtractFilePath(ParamStr(0))+s;
writeln(s);
WinExec(PChar(s),SW_NORMAL);
end;
end;
list.Free;
s:=ExtractFilePath(ParamStr(0));
Delete(s,length(s),1);
ScanDir(s);
readln;
end.
пожалуйста - помогите мне с этим.
Социальные закладки