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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.10.2011, 05:10   #1
Adult_Master
Пользователь
 
Регистрация: 04.04.2011
Сообщений: 63
По умолчанию Перевести Сишные функции записи данных в реестр на Delphi

Здравствуйте, у меня есть исходники программы на С++, которая сохраняет данные в бинарном виде в реестре (шифрованные), мне нужно написать функции по работе с этими данными но в Delphi.
Что имеем на С++:

есть некая структура данных :
Код:
//объявлено в  h файлах
struct  Params
{	
unsigned int	m_Param1;
int		m_Param2;
UINT64		g_Count1, g_Count2;
bool		m_Param3;
unsigned int	m_Param4;
int		m_Param5;
};

static Params mParams;
BYTE userstring[512];

//Далее в самом cpp

//mKey - ключ в реестре
//RegOpenKeyEx - вызывается в программе ранее

void Profile::save()
{
	
 DWORD length = sizeof( mParams );
 memcpy( userstring, &mParams,  length); 

 for( size_t i = 0; i < length; i++)
	userstring[ i ]  ^= 0x89; 

 RegSetValueEx( mKey, L"data", 0, REG_BINARY, (unsigned char *)  userstring, length );
		
}
//Чтение
void Profile::read()
{	
DWORD userstringlen;
DWORD type = REG_SZ;	

RegQueryValueEx( mKey,  L"data",	0, &type, (unsigned char *) userstring, &userstringlen);

for( size_t i = 0; i < userstringlen; i++)
	userstring[ i ]  ^= 0x89;

memcpy( &mParams, userstring,  userstringlen);
}
Собственно мне нужно перевести функци Write и Read на Delphi, при этом сохранять и читать в record

Код:
.....
type
TmParams = record
m_Param1: integer;
m_Param2: integer;
g_Count1, g_Count2: int64;
m_Param3: boolean;
m_Param4: integer;
m_Param5: integer; 
end;
.....

var
mParams: TmParams;
Правильно ли я определил переменные в своем record ? в частности интересует unsigned int

Далее пытаюсь реализовать функцию Read:

Код:
procedure ProfileRead;
var
Handle: HKEY;
BufSize, DataType: DWORD;
res,i: integer;
buffer: PChar;
begin
 DataType := REG_SZ;

 res := RegOpenKeyEx(HKEY_CURRENT_USER, PChar    ('Software\MyCompany\'), 0, KEY_QUERY_VALUE, Handle);

 if res<>0 then
   raise exception.Create('Не могу открыть ключ реестра');

 RegQueryValueEx(Handle,'data',nil,@DataType,nil,@BufSize);
 GetMem(Buffer, BufSize);
 RegQueryValueEx(Handle,'data',nil,@DataType,PByte(Buffer),@BufSize);

 RegCloseKey(Handle);

 for i := 0 to BufSize - 1 do Buffer[i] := chr(ord(Buffer[i]) xor $89);//Вот тут не совсем уверен что правильно делаю

//Дальше просто попытка вывести прочитанные данные
    s := '';
    for i := 0 to BufSize - 2 do
    begin

      if Buffer[i] = #0 then
      begin

        Memo1.Lines.Add(s);
        s := '';
      end
      else
      begin
        s := s + Buffer[i];
      end;
    end;

  FreeMem(Buffer);
end;
Как мне правильно прочитать данные, поксорить их повторно (для дешифрации) и сохранить в record ?

Помогите хотя бы с функцией Read, Write я по аналогии сам допишу ). Зарание спасибо !

P.S. Количество записей в record не фиксировано, оно меняется от версии к версии, поэтому желательно написать универсальные функции.

Последний раз редактировалось Adult_Master; 29.10.2011 в 05:17.
Adult_Master вне форума Ответить с цитированием
Старый 29.10.2011, 07:02   #2
Хамяг
Форумчанин
 
Аватар для Хамяг
 
Регистрация: 22.08.2008
Сообщений: 105
По умолчанию

не проверял, думаю как-то так:

Код:
type
  Params = record
    m_Param1: Cardinal;
    m_Param2: Cardinal;
    g_Count1: UInt64;
    g_Count2: UInt64;
    m_Param3: Boolean;
    m_Param4: Cardinal;
    m_Param5: Integer;
  end;

var
  mParams: Params;
  userstring: array [1..512] of Byte;
  mKey: Cardinal;

procedure ProfileRead;
var
  i: Word;
begin
  Move(mParams,userstring,SizeOf(mParams));
  for i:=1 to SizeOf(mParams) do userstring[i]:=userstring[i] xor $89;
  RegSetValueEx(mKey,'data',0,REG_BINARY,@userstring,SizeOf(mParams));
end;

procedure ProfileWrite;
var
  i: Word;
  userstringlen: Cardinal;
  rtype: Cardinal;
begin
  rtype:=REG_SZ;
  RegQueryValueEx(mKey,'data',nil,@rtype,@userstring,@userstringlen);
  for i:=1 to userstringlen do userstring[i]:=userstring[i] xor $89;
  Move(userstring,mParams,userstringlen);
end;
Хамяг вне форума Ответить с цитированием
Старый 29.10.2011, 10:24   #3
Adult_Master
Пользователь
 
Регистрация: 04.04.2011
Сообщений: 63
По умолчанию

Спасибо ! Всё работает ! Только надо поменять местами названия функций, и у переменной mKey тип HKEY !

P.S. Ещё раз большое спасибо !

Последний раз редактировалось mihali4; 29.10.2011 в 14:02.
Adult_Master вне форума Ответить с цитированием
Старый 29.10.2011, 19:01   #4
Хамяг
Форумчанин
 
Аватар для Хамяг
 
Регистрация: 22.08.2008
Сообщений: 105
По умолчанию

незачто

для справки,

Код:
type
  HKEY = type LongWord;
LongWord и Cardinal - одно и то же. то есть, ошибки с моей стороны тут нет .
Хамяг вне форума Ответить с цитированием
Старый 30.10.2011, 11:02   #5
Adult_Master
Пользователь
 
Регистрация: 04.04.2011
Сообщений: 63
По умолчанию

Цитата:
Сообщение от Хамяг Посмотреть сообщение
незачто

для справки,

Код:
type
  HKEY = type LongWord;
LongWord и Cardinal - одно и то же. то есть, ошибки с моей стороны тут нет .
Ну у меня компилятор ругнулся почему то, я изменил на HKEY и все Ок. Плюсанул в карму.
Тема закрыта )
Adult_Master вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
записи значения в реестр winwirus Общие вопросы Delphi 2 26.09.2011 19:17
написать процедуру записи значения в реестр winwirus Помощь студентам 2 26.09.2011 18:49
Добавление записи в реестр при открытии книги ru3000 Microsoft Office Excel 3 29.07.2009 04:49
[Delphi] Комбинированный тип данных (записи) n01R Помощь студентам 2 17.12.2008 20:39