Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Глючит CharToOEM [D6, Win2k]


Voldemar ©   (2002-06-26 19:58:00) 

Доброе время суток!
У меня странно глючит вот такой код:
var TS1, TS2: TStringList;
cnd: cardinal;
St1, St2: PChar;



begin
TS1:=TStringList.Create;
TS2:=TStringList.Create;
try
TS1.LoadFromFile(ParamStr(1));
except
begin
writeln("File not found!");
exit;
end;
end;

for cnd:=0 to TS1.Count-1 do begin
St1:=Pchar(TS1.Strings[cnd]);
St2:=AllocMem(Length(St1));
CharToOem(St1,St2);
TS2.Add(string(St2));
FreeMem(St2);
end;

TS2.SaveToFile(ChangeFileExt(ParamStr(1),".cnd"));
TS1.Free;
TS2.Free;
end.

Когда запускаешь из IDE - выдает EInvalidPointer, а когда из шелла - выкидывает ошибку "Неизвестное программное исключение в модуле Program.exe"
Причем результирующий файл пишется правильно! Пробовал отловить зависимость от размера файла (до 30000 строк), от размера строки (до 700 символов) - не нашел :(. Т.е. может проглотить огромную строку, а на коротенькой глюкнуть. Даже на какой конкретно команде вылетает ошибка, определить не могу, но где-то внутри цикла.


Voldemar   (2002-06-26 23:17:00) [1]

Вот теперь получилось! И даже на 200-метровом файле... Спасибо огромное, а я-то му**лся :))


Voldemar   (2002-06-26 23:02:00) [2]

>rhf © (26.06.02 21:03)
Оказалось, размер не причем... Сгенерил файл около 200 метров - нормально отработало... А вот на одном конкретномфайле глючит. В шелле вылетает ошибка Exception EAccessViolation in module user32.dll at 000234D3.
Попробую сделать последним способом:)


rhf   (2002-06-26 21:03:00) [3]

а при чем тут размер файла... не понятно... в каком месте он вылетает.......

кстати можно сделать все без цикла


st1:=ts.getText;
charToOem(st1,st1);
ts.text:=string(st1);


тестил на 2 с половиной метрах.......


Voldemar   (2002-06-26 20:43:00) [4]

> rhf © (26.06.02 20:15)
так лучше, но когда файл больше 1.5 метров, вылетает ошибка Память не может быть "written"...


rhf   (2002-06-26 20:15:00) [5]

твой кусок кода у меня работает...без ошибок.... вот только результаты неправильные :(

делай лучше так

for cnd:=0 to TS1.Count-1 do begin
St1:=Pchar(TS1.Strings[cnd]);
CharToOem(St1,St1);
TS2.Add(string(St1));
end;


rhf   (2002-06-26 20:04:00) [6]

при работе с чарТоОем и оемТоЧар можно и даже полезно в качестве параметров передавать одну и ту же переменную....


Наверх

Титульная страница Поиск, карта сайта Написать письмо