Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.02.2015, 02:02   #1
ДралсяСошибками
Форумчанин
 
Аватар для ДралсяСошибками
 
Регистрация: 31.05.2011
Сообщений: 301
Злость Функция не работает из потока

Всем Привет.
Не работает если вызвать в потоке
Код:
function SHA1(Text: String): String;
var
  Prov, Hash: Cardinal;
  Len: DWord;
  Data: Array [0..19] of Byte;
  i: Integer;
begin
  CryptAcquireContext(Prov, nil, nil, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
  CryptCreateHash(Prov, CALG_SHA1, 0, 0, Hash);
  CryptHashData(Hash, @Text[1], Length(Text), 0);
  CryptGetHashParam(Hash, HP_HASHVAL, @Data[0], Len, 0);
  CryptDestroyHash(Hash);
  CryptReleaseContext(Prov, 0);
    for i := 0 to Len - 1 do Result := Result + LowerCase(IntToHex(Data[i], 2));
end;
выдаёт не тот результат и пол хеша нулей
ДралсяСошибками вне форума Ответить с цитированием
Старый 12.02.2015, 07:42   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Каждая из этих функций возвращает результат.
Почему ты не захотел проверять его? Может какая-то из функций дает ошибку.
Например у меня:
Код:
    if not CryptAcquireContext(hProv, pcont, nil, AProvType, iFlag) then begin
     Error:='CryptAcquireContext error: '+SysErrorMessage(GetLastOSError);
Или вот:
Код:
function TAlisaCrypto.CryptSignString(Txt: ansiString): ansiString;
const
       //sig=AT_KEYEXCHANGE;
       sig=AT_SIGNATURE;
var
  mProv: HCRYPTPROV;
  mHash: HCRYPTHASH;
  BufLen: DWORD;
begin
  Result:='';
  CryptAcquireContext(mProv,nil,nil,PROV_RSA_FULL,0);
  CryptCreateHash(mProv,CALG_MD5,0,0,mHash);
  CryptHashData(mHash,PByte(txt),Length(txt),0);
  BufLen:=0;
  if CryptSignHash(mHash,sig,nil,0,nil,BufLen) and (BufLen>0) then begin
    SetLength(Result,BufLen);
    CryptSignHash(mHash,sig,nil,0,PByte(Result),BufLen);
  end else begin
    Error:='CryptSignString CryptSignHash error: '+SysErrorMessage(GetLastOSError);
    Result:='';
  end;
  CryptDestroyHash(mHash);
  CryptReleaseContext(mProv,0);
end;
Во втором не все проверяется, но он работает.
I'm learning to live...

Последний раз редактировалось Stilet; 12.02.2015 в 07:44.
Stilet вне форума Ответить с цитированием
Старый 12.02.2015, 11:25   #3
ДралсяСошибками
Форумчанин
 
Аватар для ДралсяСошибками
 
Регистрация: 31.05.2011
Сообщений: 301
По умолчанию

Не проверял, так как это пока набросок, я лишь потрассировал его и посмотрел результаты, спотыкается на CryptGetHashParam(Hash, HP_HASHVAL, @Data[0], Len, 0); но из главного потока он отрабатывает без ошибок. Вообще я не дописал, что хеширую несколько строк из StringList, не думал, что это важно и вот когда пишу: Str := SHA1(StringList.Text); то облом, а вот когда StringList.GetText то работает.
ДралсяСошибками вне форума Ответить с цитированием
Старый 12.02.2015, 12:05   #4
WinCoder
Заблокирован
 
Регистрация: 24.11.2014
Сообщений: 721
По умолчанию

Функция не относится к потоку. Видно по объявлению. Если это функция главного потока, ошибка ясна.
WinCoder вне форума Ответить с цитированием
Старый 12.02.2015, 12:10   #5
ДралсяСошибками
Форумчанин
 
Аватар для ДралсяСошибками
 
Регистрация: 31.05.2011
Сообщений: 301
По умолчанию

Функция ничья
ДралсяСошибками вне форума Ответить с цитированием
Старый 12.02.2015, 13:01   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
когда пишу: Str := SHA1(StringList.Text); то облом, а вот когда StringList.GetText то работает.
ИМХО лучше из StringList.Text вынести в переменную отдельно и ее передавать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.02.2015, 13:28   #7
ДралсяСошибками
Форумчанин
 
Аватар для ДралсяСошибками
 
Регистрация: 31.05.2011
Сообщений: 301
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
ИМХО лучше из StringList.Text вынести в переменную отдельно и ее передавать.
Я так делал, но результат тот же, удивительно(((
Код:
StringList.Add('1');
  StringList.Add('2');
  Text := StringList.Text;
  HashSHA1 := SHA1(Text);
Результат:
HashSHA1: '64242101000000000000000000000000d6 422101'
ДралсяСошибками вне форума Ответить с цитированием
Старый 12.02.2015, 13:35   #8
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,926
По умолчанию

А это ничего что в StringList.Text вставляются #13#10 после каждой строки?
northener вне форума Ответить с цитированием
Старый 12.02.2015, 13:59   #9
ДралсяСошибками
Форумчанин
 
Аватар для ДралсяСошибками
 
Регистрация: 31.05.2011
Сообщений: 301
По умолчанию

И пусть встраиваются.

случайно разобрался со своей бедой, каким то боком в потоке он желает PROV_RSA_AES

Последний раз редактировалось Stilet; 15.02.2015 в 09:55.
ДралсяСошибками вне форума Ответить с цитированием
Старый 15.02.2015, 09:56   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
каким то боком в потоке он желает PROV_RSA_AES
Чушь. Я в потоке, вызываемом из потока использую PROV_RSA_FULL без проблем.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Sendmail работает, функция mail() работает, но есть проблема. PavelNAndreev PHP 8 27.01.2014 12:45
Как получить доступ к методу потока(TThread) из основного потока? Pcrepair Общие вопросы Delphi 3 30.03.2013 14:52
Принудительное завершение потока не работает :(! TEED! Работа с сетью в Delphi 3 06.06.2012 14:34
Должно быть 3 потока. А диспетчер задач показывает, что потока создано 2 BEL9ILLI Общие вопросы Delphi 3 06.12.2011 20:26
одна функция потока, а другая функция - член класса запускающего этот поток Дмитрий_Ч Общие вопросы C/C++ 2 27.09.2007 08:50