Daha önce bahsetmiştim, d2007'den d2010'a bir projeyi çeviriyordum. Bir sürü sorunla karşılaştım özellikle unicode ile. Neyse çoğunu hallettim fakat henüz başaramadığım bir kısım var. 3 gündür uğraştım ancak işin içinden çıkamadım.
Önce program hakkında bilgi vereyim. Bu program kullanıcının seçtiği modele göre tamamen binary olan data dosyalarında 3 - 10 yeri bulup değiştiren bir mekanizma. Kısaca kullanıcı yüklüyor, program yerleri buluyor ve gerekli değişiklikleri yapıyor, sonuçta yeni bir dosya olarak yazıyor.
İçinden çıkamadığım nokta, program Türkçe (kullandığım) Windows'da bu noktaları gayet iyi bir şekilde buluyor ve yapıyor. Ancak, diğer dillerde aşağıda belirttiğim bir tarama kodunu bulmadığını söyleyip hata veriyor. Kodun için diğerlerinde olduğu gibi 00 yok. Benim istediğim D7'de olduğu gibi ne verirsem onu araması. Dolasıyla problemin PosEx'den kaynaklandığını farkındayım ancak Codepage mi değişecek yok tanımlamada mı birşey belirtmem gerekiyor bir türlü anlamadım.
Kullanıcıdan OpenDialog1 ile aldığım dosya bilgisini aşağıdaki prosedure ile string olarak yüklüyorum:
Kod: Tümünü seç
var
buf1 : Ansistring;
Begin
if not sOpenDialog1.Execute then
sMemo1.Lines.Add('File dont open!') // file dont opened
else
begin
buf1 := LoadStringFromFile(sOpenDialog1.FileName,TEncoding.Default);
Kod: Tümünü seç
function LoadStringFromFile(const filename: string; encoding: TEncoding = nil): string;
var
FPreambleLength: Integer;
begin
with TBytesStream.Create do
try
LoadFromFile(filename);
FPreambleLength := TEncoding.GetBufferEncoding(Bytes, encoding);
Result := encoding.GetString(Bytes, FPreambleLength, Size - FPreambleLength);
finally
Free;
end;
end;
Sonra program "case of nn" ile seçilen kısma geliyor ve işlem başlıyor.
Kod: Tümünü seç
//---------------------------------------------------------------------------
Procedure Model253(var filebuf : Ansistring; fsize :integer; fpath :string);
var
s1 : Ansistring;
c,i : integer;
begin
s1 := 'Extended253';
c := PosEx(s1,filebuf,1);
if c = 0 then
begin
ShowMessage('Sign Error');
end;
//Test için hazırladım, codepage bende 1254 çalışmayanlarda 1250 olarak gözüküyor.
Form1.sMemo1.Lines.Add('Default Code page : ' + IntToStr(StringCodePage(filebuf)));
Form1.sMemo1.Lines.Add('Default Element Size : ' + IntToStr(StringElementSize(filebuf)));
//Patchpro sadece işlemi kısaltıyor.
arama :=1;
s1 :=#$01#$01#$10#$00#$01#$01#$01#$00;
PatchPro(filebuf,s1,$04,$00,$00,22,$00,$00,lastpos,fpath,fsize);
arama :=2;
s1 :=#$40#$9f#$be#$77#$40#$9f#$e7#$6d#$44;
PatchPro(filebuf,s1,$04,$00,$00,22,$00,$00,lastpos,fpath,fsize);
Kod: Tümünü seç
Procedure PatchPro(var filebuf: Ansistring; sstr: Ansistring; pfar: integer; pval1: byte; pval2:byte; psize: integer; end1:byte; end2:byte; posnext:integer; fpath : string; fsize:integer);
var
s1,strnew,filebufnew : string;
c,i,mboxsel,clen : integer;
begin
...
posnext := lastpos;
c := PosEx(sstr,filebuf,posnext);
if c = 0 then
begin
Form1.Memo1.Lines.add('Error '+IntToStr(arama)+ 'not found' +IntToHex(posnext,8));
end;
...
// işlem tamamsa dosyayı değiştiriliyor.
Burada garip çözemediğim olay şudur :
Aranan 2 tane kod dizilimi var : Arama1 : 01 01 10 00 01 01 01 00 ve Arama2 : 40 9f be 77 40 9f e7 6d 44.
- 1. arama hiç sorunsuz oluyor ve işlem başarıyla yapılıyor. Fakat 2. aramaya gelince belirtilen kod olduğu halde bulamadım diyor hata veriyor (Türkçe Windows ve hepsinde).
- Eğer 2. arama için farklı bir dizilim verirsem örneğin : 44 7a 00 00 44 61 00 00 başarıyla buluyor ve yapıyor. Fakat programda yüzden fazla bölüm var ve hepsini değiştirmek çok fazla zaman istiyor.
Sorunun iyice araştırmak için debugger ile tek tek inceledim. Gördüm ki, 2 aramada PosEx'e giren çalışmayan kod dizilimi değişiyor ve farklı bir şey aratılıyor.
Bu noktada ne yapmak gerekiyor ki PosEx Delphi7'de olduğu gibi her verdiğimi aynı şekilde arasın? Görüldüğü gibi eğer aranan dizin içinde 00 01 değerleri varsa PosEx arama string'ini aynen alıp kullanıyor ama 2 dizilim gibi olunca bunu (unicode değil) farklı bir şekile çevirip aramaya çalışıyor.
Delphi2010'un Unicode olduğunu biliyorum fakat nerede ne hata yaptığımı maalesef çözemedim.
Yardımlarınızı ve önerilerinizi bekliyorum.
Saygılar ve sevgiler.