Пишу на Delphi 7, однажды, зайдя в свой проект, обнаружил вот такой списочек директив компиляции Код (Text): {$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} {$MINSTACKSIZE $00004000} {$MAXSTACKSIZE $00100000} {$IMAGEBASE $00400000} {$APPTYPE GUI} {$WARN SYMBOL_DEPRECATED ON} {$WARN SYMBOL_LIBRARY ON} {$WARN SYMBOL_PLATFORM ON} {$WARN UNIT_LIBRARY ON} {$WARN UNIT_PLATFORM ON} {$WARN UNIT_DEPRECATED ON} {$WARN HRESULT_COMPAT ON} {$WARN HIDING_MEMBER ON} {$WARN HIDDEN_VIRTUAL ON} {$WARN GARBAGE ON} {$WARN BOUNDS_ERROR ON} {$WARN ZERO_NIL_COMPAT ON} {$WARN STRING_CONST_TRUNCED ON} {$WARN FOR_LOOP_VAR_VARPAR ON} {$WARN TYPED_CONST_VARPAR ON} {$WARN ASG_TO_TYPED_CONST ON} {$WARN CASE_LABEL_RANGE ON} {$WARN FOR_VARIABLE ON} {$WARN CONSTRUCTING_ABSTRACT ON} {$WARN COMPARISON_FALSE ON} {$WARN COMPARISON_TRUE ON} {$WARN COMPARING_SIGNED_UNSIGNED ON} {$WARN COMBINING_SIGNED_UNSIGNED ON} {$WARN UNSUPPORTED_CONSTRUCT ON} {$WARN FILE_OPEN ON} {$WARN FILE_OPEN_UNITSRC ON} {$WARN BAD_GLOBAL_SYMBOL ON} {$WARN DUPLICATE_CTOR_DTOR ON} {$WARN INVALID_DIRECTIVE ON} {$WARN PACKAGE_NO_LINK ON} {$WARN PACKAGED_THREADVAR ON} {$WARN IMPLICIT_IMPORT ON} {$WARN HPPEMIT_IGNORED ON} {$WARN NO_RETVAL ON} {$WARN USE_BEFORE_DEF ON} {$WARN FOR_LOOP_VAR_UNDEF ON} {$WARN UNIT_NAME_MISMATCH ON} {$WARN NO_CFG_FILE_FOUND ON} {$WARN MESSAGE_DIRECTIVE ON} {$WARN IMPLICIT_VARIANTS ON} {$WARN UNICODE_TO_LOCALE ON} {$WARN LOCALE_TO_UNICODE ON} {$WARN IMAGEBASE_MULTIPLE ON} {$WARN SUSPICIOUS_TYPECAST ON} {$WARN PRIVATE_PROPACCESSOR ON} {$WARN UNSAFE_TYPE OFF} {$WARN UNSAFE_CODE OFF} {$WARN UNSAFE_CAST OFF} Решил не убирать, коли сама дельфа сгенерила, но недавно столкнулся с интересной проблемой: Передаваемая в процедуру Код (Text): function TForm1.Hash(s: string): string; begin result:=''; len:=length(s); data:=len; if not CryptEncrypt(key,0,true,0,PByte(s),@data,len) then \\\контекст уже открыт, и хэш создан в глобальных переменных begin result:=#10#13; \\\типа код ошибки exit; end; result:=s; end; строка менялалась после попадания, то есть результат функции после ее выполнения совпадал с передаваемым значением после этого я написал так Код (Text): function TForm1.Hash(const s: string): string; не помогло, создал глобальную переменную-буфер, через которую передавал строку в функцию, после функции менялись обе:и буфер и оригинал вот так Код (Text): ..... temp:=FPassword; stripe:=DeHash(temp); \\\аналогична Hash по описанию .... Так вот во всех трех переменных было одно и то же значение - расшифрованый пароль Добавил переменную-буфер в самих процедурах, то же самое Такое впечатление, что операция присвоения одной строки другой - это все равно что наложение адресов. только после замены Код (Text): temp:=FPassword; на Код (Text): temp:=copy(FPassword,1,length(FPassword)); все заработало нормально Отсюда вопрос: в чем дело? В директивах компиляции или это где-то в опциях дельфы настраивается?!
seiko Пример функции из сорцов Д7: Код (Text): function GetShortHint(const Hint: string): string; var I: Integer; begin I := AnsiPos('|', Hint); if I = 0 then Result := Hint else Result := Copy(Hint, 1, I - 1); end;
Мне кажется вам следует разобраться с работой с указателями. Код (Text): if not CryptEncrypt(key,0,true,0,[b]PByte(s)[/b],@data,len) then Здесь строка превращается в PByte