Форум программистов, компьютерный форум CyberForum.ru

Получение значения из функции - C++

Восстановить пароль Регистрация
 
caldwell
0 / 0 / 0
Регистрация: 12.06.2014
Сообщений: 17
13.06.2014, 00:09     Получение значения из функции #1
Здравствуйте! Помогите понять что делаю не так. Очевидно неправильно возвращаю значение из функции, но как правильно реализовать не могу додуматься. Есть такой вот класс:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class CSystemApi
{
public:
    CSystemApi(void);
    ~CSystemApi(void);
    BOOL filePathExist(LPCTSTR szPath);
    LPCSTR getGUID() const;
    LPCSTR getHWID() const;
private:
    CHAR guid[17];
    CHAR hwid[17];
    VOID initGUID(LPSTR guid);
    BOOL initHWID(LPSTR hwid);
};
Функция initGUID по задумке генерит некий уникальный ID и сохраняет его в приватное поле hwid. Выглядит она так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
VOID CSystemApi::initGUID(LPSTR guid)
{
    BYTE buff[MAX_PATH];
 
    RtlGenRandom(buff, sizeof(buff));
 
    MD5 md5;
 
    guid = md5.digestMemory(buff, sizeof buff);
 
    printf("Process ID is: %s\n", guid);
 
    SecureZeroMemory(buff,sizeof(buff));
};
Вызывается это все хозяйство в конструкторе:
C++
1
2
3
4
CSystemApi::CSystemApi(void)
{
    CSystemApi::initGUID(guid);
}
Далее, я пытаюсь уже в приложении создать экземпляр класса и получить значение через аксессор:
C++
1
2
3
    CSystemApi api;
 
    printf("Process ID is: %s\n", api.getGUID());
При этом тот printf, который выводит значение непосредственно в функции показывает нормальную строку, а тот, что используется в приложении возвращает мусор:

Program started...
Process ID is: 451f61e3bb66c3df5027865a30679a88
Machine ID is: cfcd208495d565ef66e7dff9f98764da
Process ID is: 9+4☺→l├H■***&&4☺>&4☺Ё.4☺╨∙<
Machine ID is: &4☺Ё.4☺╨∙<

Подскажите как правильно реализовать возврат значения?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,960
13.06.2014, 00:43     Получение значения из функции #2
guid = md5.digestMemory(buff, sizeof buff);
guid - LPSTR, то есть указатель на C строку, а не сама строка. Что либо присваивать указателю бессмысленно, на строчку это никак не повлияет. Надо было написать md5.digestMemory(guid, 17);
caldwell
0 / 0 / 0
Регистрация: 12.06.2014
Сообщений: 17
13.06.2014, 08:22  [ТС]     Получение значения из функции #3
Нет, так как вы написали не пойдет. В функцию передается указатель на область памяти и длинна массива по этому адресу, а возвращает она md5-хеш.
C++
1
2
  /// Digests a byte-array already in memory
  char* digestMemory( BYTE *memchunk, int len )
Пытался писать так
C++
1
*guid = md5.digestMemory(buff, sizeof buff);
, но IDE ругается, говорит "Значение типа char* нельзя присвоить сущности типа char".

Добавлено через 33 минуты
Написал кратко то, что я хочу. Выводится 1 как и задумывалось.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <string>
 
using namespace std;
 
class C
{
    public:
        C(void);
        char getI();
    private:
        void initI(char* i);
        char i;
};
 
C::C(void)
{
    C::initI(&i);
};
 
void C::initI(char* i)
{
    *i = '1';
}
 
char C::getI()
{
    return i;
}
 
int main() {
    C c;
    cout << "i: " << c.getI() << endl;
    return 0;
}
Так что меняю вопрос: как прописать заголовок функции принимающей указатель на массив элементов типа char? Что бы можно было сделать с параметром guid из первого сообщения то же, что я сделал тут с целым числом.

Добавлено через 43 минуты
Решено:

1. добавил символов в массив guid
C++
1
CHAR guid[80];
2. присваивание значения в функции делаю через strcpy
C++
1
2
3
4
5
6
7
8
9
10
11
12
VOID CSystemApi::initGUID(LPSTR guid)
{
    BYTE buff[MAX_PATH];
 
    RtlGenRandom(buff, sizeof(buff));
 
    MD5 md5;
 
    strcpy(guid, md5.digestMemory(buff, sizeof buff));
 
    SecureZeroMemory(buff,sizeof(buff));
};
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
13.06.2014, 08:24     Получение значения из функции #4
Цитата Сообщение от caldwell Посмотреть сообщение
CHAR guid[80];
а чем тебе структура GUID не угодила?
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
13.06.2014, 08:25     Получение значения из функции #5
Цитата Сообщение от caldwell Посмотреть сообщение
Так что меняю вопрос: как прописать заголовок функции принимающей указатель на массив элементов типа char? Что бы можно было сделать с параметром guid из первого сообщения то же, что я сделал тут с целым числом.
Ну правильно же ответили - digestMemory возвращает адрес строки в памяти объекта md5.
Вы присваиваете этот адрес своему указателю, и после разрушения объекта md5 он указывает на уже освобожденную память. Нужно копировать хеш, на пример функцией strncpy.
C++
1
2
char* md5_guid = md5.digestMemory(buff, sizeof buff);
strncpy(guid,md5_guid,16);
caldwell
0 / 0 / 0
Регистрация: 12.06.2014
Сообщений: 17
13.06.2014, 09:09  [ТС]     Получение значения из функции #6
ValeryS, согласен с 80 символами я пожадничал, достаточно 32. Без этого был выход за границы массива при копировании через strcpy (без указания количества копируемых символов).

uglyPinokkio, ну дак я сам себе и ответил.

Добавлено через 5 минут
ValeryS, погоди, ты ведь не про количество символов спрашивал. Я так понял это формат хранения и представления данных, а не способ генерации. Мне удобнее все обезличенными хешами хранить, плюс удобно, что хеш можно взять хоть от куска памяти, хоть от строки, хоть от целого файла.
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
13.06.2014, 10:18     Получение значения из функции #7
Цитата Сообщение от caldwell Посмотреть сообщение
Мне удобнее все обезличенными хешами хранить,
А причем здесь хеш???
твоя переменная обозвана CHAR guid
просто байты
кстати почему не unsigned char?
из этого я делаю вывод что это это "статистически уникальный 128-битный идентификатор"
http://ru.wikipedia.org/wiki/GUID
у которого есть своя структура
и есть готовые алгоритмы генерации
если это не так, то переобзови переменную, чтобы не путать не себя не других
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2014, 11:35     Получение значения из функции
Еще ссылки по теме:

Схема алгоритма. Как по ГОСТу отобразить обращение и получение значения из функции? C++
Tuple, получение значения по индексу C++
C++ Указатель: получение значения без разименовывания?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
caldwell
0 / 0 / 0
Регистрация: 12.06.2014
Сообщений: 17
13.06.2014, 11:35  [ТС]     Получение значения из функции #8
ValeryS, про GUID понял. Это не та структура. Решил, что вопрос в том, почему использую md5-хеш, а не GUID напрямую.

unsigned char больше подходит. Поменяю тип. Спасибо!
Yandex
Объявления
13.06.2014, 11:35     Получение значения из функции
Ответ Создать тему
Опции темы

Текущее время: 16:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru