Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.28;
Скачать: CL | DM;

Вниз

Различное поведение в зависимости от юнита.   Найти похожие ветки 

 
Riply ©   (2007-10-03 21:55) [0]

Здравствуйте !
В большом проекте есть два больших юнита и две не правильные функции:

function PCharToWideStr(const pSour: PChar; const aLen: integer): WideString;
begin
SetLength(Result, aLen);
if aLen > 0 then Result[MultiByteToWideChar(CP_ACP, 0, pSour, aLen + 1, PWideChar(Result), aLen)] := #0;
end;

function PCharToWideStr(const pSour: PChar): WideString;
begin
Result := PCharToWideStr(pSour, LstrLen(pSour));
end;

При вызове
var
MyStr: string;
begin
MyStr := "bla-bla";
PCharToWideStr(PChar(MyStr))
;

из одного юнита, получаем исключение Range check error,
а при вызове из другого это дело проскакивает без ошибки.
В чем может быть разница ?
P.S.
Директивы в юнитах не отличаються, все "используемые внутри" ф-ии
не переписаны и вызываются из правильных мест.


 
tesseract ©   (2007-10-03 22:13) [1]


> В чем может быть разница ?


А может переписать её как  в хелпе приводится и всё заработает ? Например направо и налево не приводить result к разным типам данных, Я так думаю что просто в одном модуле кодировка строки в русской раскладке встречаeться - и получаете свой RangeCheck.


 
Riply ©   (2007-10-03 22:18) [2]

> [1] tesseract ©   (03.10.07 22:13)
> А может переписать её как  в хелпе приводится и всё заработает ?
Переписать не проблемма. Важнее понять причину.
Если бы разница была, например, в том, что в одном юните
мы портим нужную память, а в другом - "не нужную", то и исключение
было бы наверное другим ?


 
tesseract ©   (2007-10-03 22:20) [3]

Не портите вы память, вы её не выделяете под result, и даже размера  необходимого не запрашиваете, см справку.


 
Riply ©   (2007-10-03 22:21) [4]

>[1] tesseract ©   (03.10.07 22:13)
> Я так думаю что просто в одном модуле кодировка строки в русской раскладке
> встречаeться - и получаете свой RangeCheck.
Не поняла. Где-то в совершенно другом месте юнита "кодировка строки в русской раскладке" ?
Вызываю-то я с одним и тем же параметром.


 
Leonid Troyanovsky ©   (2007-10-04 09:21) [5]


> Riply ©   (03.10.07 21:55)  

> В чем может быть разница ?

Истинный путь программиста - Дао, и он единственный.
Ложных путей может быть бесконечно много
и стоит ли тратить жизнь на их исследование?

На месте компилятора я бы даже не стал компилировать
приведенный код. А от lstrlen хочется плакать.

Ставь задачу как положено,
и еще раз: энергия Вселенной постоянна,
а энтропия постоянно возрастает.

--
Regards, LVT.



Страницы: 1 вся ветка

Текущий архив: 2007.10.28;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.017 c
2-1190980483
foreverDelphi
2007-09-28 15:54
2007.10.28
как написать компонент видимый за пределами формы


1-1186031887
Раф
2007-08-02 09:18
2007.10.28
Как в чужом приложение на MessageDlg нажать Да


2-1191426525
Max.66RUS
2007-10-03 19:48
2007.10.28
Поиск пути к исполняемому файлу через реестр...


2-1191865439
smartleds
2007-10-08 21:43
2007.10.28
Господа , подскажите плз как завести массивы для открываемых


2-1191236054
sydenis
2007-10-01 14:54
2007.10.28
неявное связывание с bpl