Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > чтение из реестра


Автор: ShMary 30.11.2007, 00:44
Здравствуйте, уважаемые!

просмотрела множество примеров, связанных с чтением из реестра, и попыталась реализовать 
свою программу, но натолкнулась на огромное число препятствий.  smile 
По порядку. В реестр, а именно в HKEY_CURRENT_USER и далее Software\\Microsoft\\MYYSOFTWARE прописываю переменную MyPath и в нее помещаю путь и название необходимого файла.в файле хранятся параметры для расчета. это делаю в Delphi. 
теперь мне в MVС++ нужно открыть именно этот файл и запустить расчеты. 
вот код, который наворотила я. ПОЖАЛУЙСТА помогите! я в MVС++ очень мало работала... 

#define REGEDITH
#include <windows.h>

void main()
  {
HKEY hkey; 
char  Data[256];
DWORD cbData=sizeof(Data), type;

RegOpenKeyA(HKEY_CURRENT_USER, "Software\\Microsoft\\MYYSOFTWARE", &hkey);
memset(Data, 0, cbData);
RegQueryValueEx(hkey,'MyPath',NULL,&type,(LPBYTE)&Data[0],&cbData);
RegCloseKey(hkey);

char fname [20]= FNAME;                 //
FILE *in;                                           //                                                        //
char st[80];                                      //
printf("%s\n", fname);                      //  (*)Так я делала, когда просто в начеле проги  
if ((in = fopen(fname, "rt"))==NULL)  //   объявляла #define FNAME 'd:\chisla.dat' 
  {                                                      //   
  printf("файл не сущ.");                   // 
  getch();                                             //
  }
printf("\n");                                        //

int i=0;
double doubleVar;
while (!feof(in))
{
  fscanf(in, "%s", st);
  sscanf(st, "%lf", &doubleVar);
  printf("Next double variable: %lf\n", doubleVar);
  per[i]=doubleVar;
  i++;
}
  fclose(in);

Полагаю теперь вместо (*) нужно проверять есть ли такой ключ..и файл. Как мне перейти к тому, чтоб открывать указанный в реестре файл?
Заранее ОГРОМНОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО!

Автор: JackYF 30.11.2007, 15:20
ShMary, пользуйся кнопкой "код". Это раз.
Два. Чтение реестра - это не чистый С++, поэтому добро пожаловать в соседние разделы, там, где обсуждается С++-программирование под Винду, в раздел по Visual C++.

Автор: archimed7592 30.11.2007, 17:46
IMHO, WinAPI smile.

Автор: JackYF 30.11.2007, 18:01
Цитата(archimed7592 @  30.11.2007,  17:46 Найти цитируемый пост)
IMHO, WinAPI

Можно и в винапи. Главное, чтобы не здесь.

Автор: MAKCim 30.11.2007, 19:38
ShMary, 

M
MAKCim
Модератор: Используйте тег код!


Автор: ShMary 1.12.2007, 21:52
Все.Хорошо! smile 
 ОБЯЗАТЕЛЬНО БУДУ использовть кнопку "код". и пойду в соседние разделы. Спасибо за совет!  smile 

Автор: archimed7592 1.12.2007, 21:53
Эээммм, даже не знаю как тебе сказать... Дело в том, что ты и так уже в соседнем разделе smile.

Автор: ShMary 1.12.2007, 21:59
ммммммда...пролистала вверх и сама увидела!  smile 
только пока легче не стало...проблема-то осталась! smile 

Автор: ShMary 1.12.2007, 23:25
с учетом вышеизложенных советов...
В реестр, а именно в HKEY_CURRENT_USER и далее Software\\Microsoft\\MYYSOFTWARE прописываю переменную MyPath и в нее помещаю путь и название необходимого файла.в файле хранятся параметры для расчета. это делаю в Delphi. 
теперь мне в MVС++ нужно открыть именно этот файл и запустить расчеты. 
вот код, который наворотила я. ПОЖАЛУЙСТА помогите! я в MVС++ очень мало работала... 
Код

#define REGEDITH
#include <windows.h>

void main()
  {
HKEY hkey; 
char  Data[256];
DWORD cbData=sizeof(Data), type;

RegOpenKeyA(HKEY_CURRENT_USER, "Software\\Microsoft\\MYYSOFTWARE", &hkey);
memset(Data, 0, cbData);
RegQueryValueEx(hkey,'MyPath',NULL,&type,(LPBYTE)&Data[0],&cbData);
RegCloseKey(hkey);

char fname [20]= FNAME;                 //
FILE *in;                                           //                                                        //
char st[80];                                      //
printf("%s\n", fname);                      //  (*)Так я делала, когда просто в начеле проги  
if ((in = fopen(fname, "rt"))==NULL)  //   объявляла #define FNAME 'd:\chisla.dat' 
  {                                                      //   
  printf("файл не сущ.");                   // 
  getch();                                             //
  }
printf("\n");                                        //

int i=0;
double doubleVar;
while (!feof(in))
{
  fscanf(in, "%s", st);
  sscanf(st, "%lf", &doubleVar);
  printf("Next double variable: %lf\n", doubleVar);
  per[i]=doubleVar;
  i++;
}
  fclose(in);



Полагаю теперь вместо (*) нужно проверять есть ли такой ключ..и файл. И создать переменную с результатом чтения ключа.Как мне перейти к тому, чтоб открывать указанный в реестре файл? 
Заранее ОГРОМНОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО! ПОЖАЛУЙСТА, ДАЙТЕ КОМЕНТАРИЙ ИЛИ СОВЕТ. 

Автор: 586 2.12.2007, 01:05
Код
#include <windows.h>
#include <stdio.h>
#include <conio.h>

#define FNAME "D:\\chisla.dat"

int main(int, char**)
{
    HKEY hkey; 
    char  Data[256];
    DWORD cbData=sizeof(Data), type;

    if(RegOpenKeyA(HKEY_CURRENT_USER, "Software\\Microsoft\\MYYSOFTWARE", &hkey) != ERROR_SUCCESS)
    {
        printf("Cant't open key\n");
        getch();
        return 1;
    }

    memset(Data, 0, cbData);
    if(RegQueryValueExA(hkey,"MyPath",NULL,&type,(LPBYTE)Data,&cbData) != ERROR_SUCCESS)
    {
        printf("Can't query value\n");
        strcpy(Data, FNAME);        // другое имя
    }
    RegCloseKey(hkey);

    FILE *in;                                           //                                                        //
                                         //
    printf("%s\n", Data);                      //  (*)Так я делала, когда просто в начеле проги  
    if ((in = fopen(Data, "rt"))==NULL)  //   объявляла #define FNAME 'd:\chisla.dat' 
      {                                                      //   
      printf("File not found\n");                   // 
      getch();                                             //
      return 2;
      }

    printf("\n");
/*
    char fname [20]; 
    char st[80]; 

    int i=0;
    double doubleVar;
    while (!feof(in))
    {
      fscanf(in, "%s", st);
      sscanf(st, "%lf", &doubleVar);
      printf("Next double variable: %lf\n", doubleVar);
      per[i]=doubleVar;
      i++;
    }*/
      fclose(in);
  return 0;
}

Автор: ShMary 4.12.2007, 21:43
Здравствуйте!
Спасибо ОГРОМНОЕ за ответ!!!  smile 
код, правда, не совсем такой, какой мне надо было, но ОЧЕНЬ ПОМОГ! немного подправила под себя- и все замечательно! все работает, как надо!
СПАСИБО!!!!!! Движусь дальше, диплом пишется!.. smile 
Этот вопрос можно считать закрытым.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)