Расшифровка директив компиляции

Тема в разделе "WASM.WIN32", создана пользователем seiko, 9 июн 2008.

  1. seiko

    seiko New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    98
    Пишу на Delphi 7, однажды, зайдя в свой проект, обнаружил вот такой списочек директив компиляции
    Код (Text):
    1. {$A8,B-,C+,D+,E-,F-,G+,H+,I+,J-,K-,L+,M-,N+,O+,P+,Q-,R-,S-,T-,U-,V+,W-,X+,Y+,Z1}
    2. {$MINSTACKSIZE $00004000}
    3. {$MAXSTACKSIZE $00100000}
    4. {$IMAGEBASE $00400000}
    5. {$APPTYPE GUI}
    6. {$WARN SYMBOL_DEPRECATED ON}
    7. {$WARN SYMBOL_LIBRARY ON}
    8. {$WARN SYMBOL_PLATFORM ON}
    9. {$WARN UNIT_LIBRARY ON}
    10. {$WARN UNIT_PLATFORM ON}
    11. {$WARN UNIT_DEPRECATED ON}
    12. {$WARN HRESULT_COMPAT ON}
    13. {$WARN HIDING_MEMBER ON}
    14. {$WARN HIDDEN_VIRTUAL ON}
    15. {$WARN GARBAGE ON}
    16. {$WARN BOUNDS_ERROR ON}
    17. {$WARN ZERO_NIL_COMPAT ON}
    18. {$WARN STRING_CONST_TRUNCED ON}
    19. {$WARN FOR_LOOP_VAR_VARPAR ON}
    20. {$WARN TYPED_CONST_VARPAR ON}
    21. {$WARN ASG_TO_TYPED_CONST ON}
    22. {$WARN CASE_LABEL_RANGE ON}
    23. {$WARN FOR_VARIABLE ON}
    24. {$WARN CONSTRUCTING_ABSTRACT ON}
    25. {$WARN COMPARISON_FALSE ON}
    26. {$WARN COMPARISON_TRUE ON}
    27. {$WARN COMPARING_SIGNED_UNSIGNED ON}
    28. {$WARN COMBINING_SIGNED_UNSIGNED ON}
    29. {$WARN UNSUPPORTED_CONSTRUCT ON}
    30. {$WARN FILE_OPEN ON}
    31. {$WARN FILE_OPEN_UNITSRC ON}
    32. {$WARN BAD_GLOBAL_SYMBOL ON}
    33. {$WARN DUPLICATE_CTOR_DTOR ON}
    34. {$WARN INVALID_DIRECTIVE ON}
    35. {$WARN PACKAGE_NO_LINK ON}
    36. {$WARN PACKAGED_THREADVAR ON}
    37. {$WARN IMPLICIT_IMPORT ON}
    38. {$WARN HPPEMIT_IGNORED ON}
    39. {$WARN NO_RETVAL ON}
    40. {$WARN USE_BEFORE_DEF ON}
    41. {$WARN FOR_LOOP_VAR_UNDEF ON}
    42. {$WARN UNIT_NAME_MISMATCH ON}
    43. {$WARN NO_CFG_FILE_FOUND ON}
    44. {$WARN MESSAGE_DIRECTIVE ON}
    45. {$WARN IMPLICIT_VARIANTS ON}
    46. {$WARN UNICODE_TO_LOCALE ON}
    47. {$WARN LOCALE_TO_UNICODE ON}
    48. {$WARN IMAGEBASE_MULTIPLE ON}
    49. {$WARN SUSPICIOUS_TYPECAST ON}
    50. {$WARN PRIVATE_PROPACCESSOR ON}
    51. {$WARN UNSAFE_TYPE OFF}
    52. {$WARN UNSAFE_CODE OFF}
    53. {$WARN UNSAFE_CAST OFF}
    Решил не убирать, коли сама дельфа сгенерила, но недавно столкнулся с интересной проблемой:
    Передаваемая в процедуру
    Код (Text):
    1. function TForm1.Hash(s: string): string;
    2. begin
    3. result:='';
    4. len:=length(s);
    5. data:=len;
    6. if not CryptEncrypt(key,0,true,0,PByte(s),@data,len) then
    7. \\\контекст уже открыт, и хэш создан в глобальных переменных
    8. begin
    9.  result:=#10#13; \\\типа код ошибки
    10.  exit;
    11. end;
    12. result:=s;
    13. end;
    строка менялалась после попадания, то есть результат функции после
    ее выполнения совпадал с передаваемым значением
    после этого я написал так
    Код (Text):
    1. function TForm1.Hash(const s: string): string;
    не помогло, создал глобальную переменную-буфер, через которую передавал строку
    в функцию, после функции менялись обе:и буфер и оригинал
    вот так
    Код (Text):
    1. .....
    2. temp:=FPassword;
    3. stripe:=DeHash(temp); \\\аналогична Hash по описанию
    4. ....
    Так вот во всех трех переменных было одно и то же значение - расшифрованый пароль

    Добавил переменную-буфер в самих процедурах, то же самое
    Такое впечатление, что операция присвоения одной строки другой - это
    все равно что наложение адресов.

    только после замены
    Код (Text):
    1. temp:=FPassword;
    на
    Код (Text):
    1. temp:=copy(FPassword,1,length(FPassword));
    все заработало нормально

    Отсюда вопрос: в чем дело? В директивах компиляции или это где-то в опциях дельфы настраивается?!
     
  2. HuXTUS

    HuXTUS New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2007
    Сообщения:
    240
    Делфи тут вне закона.

    А вообще, как у тебя объявлены temp и FPassword?
     
  3. seiko

    seiko New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    98
    как string в анси кодировке
     
  4. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    seiko
    Пример функции из сорцов Д7:
    Код (Text):
    1. function GetShortHint(const Hint: string): string;
    2. var
    3.   I: Integer;
    4. begin
    5.   I := AnsiPos('|', Hint);
    6.   if I = 0 then
    7.     Result := Hint else
    8.     Result := Copy(Hint, 1, I - 1);
    9. end;
     
  5. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Мне кажется вам следует разобраться с работой с указателями.
    Код (Text):
    1. if not CryptEncrypt(key,0,true,0,[b]PByte(s)[/b],@data,len) then
    Здесь строка превращается в PByte