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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
AlexFilan
0 / 0 / 0
Регистрация: 13.05.2009
Сообщений: 65
#1

boombastiku. Как вытянуть альтернативные номера из адресной книги? - C++

08.11.2009, 11:52. Просмотров 1391. Ответов 13
Метки нет (Все метки)

Функцией RasGetEntryProperties(...) получилось достать только основной номер, и то если он там только один.
Когда добавляю еще один номер, то ругается на размер ERROR_BUFFER_TOO_SMALL.
В MSDN написано, что для того чтобы узнать нужный размер, нужно вызвать это-же ф-ю, но с RASENTRY = NULL и lpdwEntryInfoSize установить в ноль, тогда ф-я возвращает требуемый буферный размер в lpdwEntryInfoSize. Но что-то не получается.
Может можно как-то по другому?
Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2009, 11:52     boombastiku. Как вытянуть альтернативные номера из адресной книги?
Посмотрите здесь:

Как вытянуть RGB из COLORREF? - C++
например я вот так делаю COLORREF color; color = ::GetPixel(hdc, x, y); cout << color; и как из этого получить цвет в RGB? а то...

Как получить доступ к элементам массива работая с ним как с указателем и адресной арифметикой - C++
int array = { {1,2,3}, {1,2},{1,2,3,4}, {1,2,3,4},{1,2,},}; for(int i = 0; i < 25; i++) printf("%d ", array); ...

Как из файла/строки вытянуть данные? - C++
ну в смысле данные, есть например файл содержащий 854 634 6436 2357 457345 вопщем неважно какие числа, ну к примеру я их уже...

Альтернативные реализации тернарного оператора - C++
помогите, пожалуйста,написать программу: На примере тернарного оператора условное выражение приведите его альтернативные реализации. ...

Альтернативные классы и приемы работы - C++
При изучении C++ сразу бросается в глаза неоднозначность определения типов данных и следовательно ,приемов программирования. На примере...

Чтение стандарта C++: альтернативные подходы к изучению - C++
Хотел прочитать стандарт, но возникло 2 проблемы: 1. Стандарт на английском который я знаю не так уж и хорошо что бы осилить весь текст ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ghost
Сообщений: n/a
08.11.2009, 11:53     boombastiku. Как вытянуть альтернативные номера из адресной книги? #2
boom - ВАУ! поздравляю - штатшый ответчик )))) Требуй со smalig'а оплаты ))))))))
Alexey
Сообщений: n/a
08.11.2009, 12:27     boombastiku. Как вытянуть альтернативные номера из адресной книги? #3
он и так уже ;-D
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
08.11.2009, 12:45     boombastiku. Как вытянуть альтернативные номера из адресной книги? #4
Мне конечно же очень льстит то, что мое мнение ценится среди людей, посещающих эту конференцию, однако я бы хотел поддержать Ghost'a и отметить, что это не корректно на публичном форуме персонально адресовать свой вопрос.

Для этого существует электронная почта и персональный e-mail, который доступен всем желающим через мой профайл.

Теперь касательно вопроса, та область вопрос из которой Вы задаете мне совершенно не знакома, но я догадываюсь как может выглядеть решение. Я обещаю посмотреть сегодня вечером на эту функцию и ее использование и попытаюсь ответить на Ваш вопрос.

С уважением, Владимир.

P.S. На этот форум заглядывают очень умные люди, профессионалы своего дела, Ghost один из них, поэтому, пожалуйста, уважаете посетителей этого форума и не адресуйте персонально свои вопросы.

P.P.S. to smalig: спасибо за поддержку
Alexey
Сообщений: n/a
08.11.2009, 13:11     boombastiku. Как вытянуть альтернативные номера из адресной книги? #5
to boombastik - чтоб я делал без вас :-D
AlexFilan
0 / 0 / 0
Регистрация: 13.05.2009
Сообщений: 65
08.11.2009, 14:07  [ТС]     boombastiku. Как вытянуть альтернативные номера из адресной книги? #6
Понял. Исправлюсь.
Ghost
Сообщений: n/a
08.11.2009, 17:25     boombastiku. Как вытянуть альтернативные номера из адресной книги? #7
(сорри если повтор)
Таааккк... заклевали втроем одного ))) и правильно - ибо нефиг, а теперь переходим к нашим баранам:

Согласно
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.1033/rras/rras/rasgetentryproperties.htm
(на моей машине ссылка выглядит так)

lpdwDeviceInfoSize
[in, out] Pointer to a variable that, on input, specifies the size, in bytes, of the buffer specified by the lpbDeviceInfo parameter.
On output, this variable receives the number of bytes required.

This parameter can be NULL if the lpbDeviceInfo parameter s NULL.

To determine the required buffer size, call RasGetEntryProperties with lpbDeviceInfo set to NULL and *lpdwDeviceInfoSize set to zero. The function returns the required buffer size in *lpdwDeviceInfoSize.

Windows Server 2003, Windows XP, Windows 2000 and Windows NT: This parameter is unused. The calling function should set this parameter to NULL.

Далее:
вот код:
Код
		DWORD dwCX(0);
		DWORD dwRET = ::RasGetEntryProperties(NULL, NULL, NULL, &dwCX, NULL, NULL);
Возвертает в dwCX - 2088, при этом сама функция возвращает ERROR_BUFFER_TOO_SMALL.
Что дальше делаем? Понятно, что буфер размером 0 действительно мал )))
Я бы попытался для начала плюнуть на код ошибки, который вернула функция и вызвать её еще раз с нужными параметрами (заполненным буфером) и прочим добром. Если слетит - то повторить обращение в форум, или сходить на MSDN.
AlexFilan
0 / 0 / 0
Регистрация: 13.05.2009
Сообщений: 65
09.11.2009, 11:38  [ТС]     boombastiku. Как вытянуть альтернативные номера из адресной книги? #8
Пока пришлось сделать так:
Открываю rasphone.pbk и выдираю оттуда номера.
Ghost
Сообщений: n/a
09.11.2009, 13:39     boombastiku. Как вытянуть альтернативные номера из адресной книги? #9
по-подробнее можно?
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
11.11.2009, 01:30     boombastiku. Как вытянуть альтернативные номера из адресной книги? #10
Что ж, вот и у меня нашлось время помучать Ras функции. AlexFilan, если Вам еще не удалось найти решения, то предлагаю на Ваше обозрение труды моих исследований. Вся магия заключается во флаге dwAlternateOffset и описании из MSDN'a его назначения:

Specifies the offset, in bytes, from the beginning of the structure to a list of consecutive null-terminated strings. The last string is terminated by two consecutive null characters. The strings are alternate phone numbers that RAS dials in the order listed if the primary number (see szLocalPhoneNumber) fails to connect. The alternate phone number strings are ANSI or Unicode, depending on whether you use the ANSI or Unicode version of the structure.

Если честно, я бы убил того кто придумал так хитро оперировать памятью, пришлось извращаться для того чтобы выдернуть эти телефоны из возвращаемой структуры. Ниже приведен код как это делается. Просьба не пугаться макросов _T, типов TCHAR, LPTSTR и команд _tcslen() - просто это старая привычка писать код, который компилируется как в нормальном режиме, так и в Unicode. Если Вы не планируете компилировать под Unicode, то макросы _T('') можно смело удалять TCHAR заменить на char, LPTSTR на LPSTR или даже char*, а команду _tcslen() на strlen().

Например, строка 1. преобразится в строку 2.
Код
1. pAltPhone = (LPTSTR)((DWORD)pAltPhone + (_tcslen(pAltPhone) + 1)*sizeof(TCHAR));
2. pAltPhone = (char*)((DWORD)pAltPhone + strlen(pAltPhone) + 1);
Я использовал afxDump для вывода отладочной информации в Output window во время запуска программы в режиме отладки. Вам же следует использовать извлеченную информацию на свое усмотрение.

Вот полный исходный код моего примера:
[code]
#include <ras.h>
#include <raserror.h>

...

DWORD dwCb = sizeof(RASENTRYNAME);
DWORD dwErr = ERROR_SUCCESS;

// Get Entries
DWORD dwEntryNames = 0;
RASENTRYNAME RasEntryName;
RASENTRYNAME* pRasEntryNames;

RasEntryName.dwSize = sizeof(RASENTRYNAME);
dwErr = RasEnumEntries(NULL, NULL, &RasEntryName, &dwCb, &dwEntryNames);
if (dwEntryNames < 1)
return;

pRasEntryNames = new RASENTRYNAME[dwEntryNames];
pRasEntryNames[0].dwSize = sizeof(RASENTRYNAME);
dwErr = RasEnumEntries(NULL, NULL, pRasEntryNames, &dwCb, &dwEntryNames);

// Loop through entries
if (dwErr == ERROR_SUCCESS)
{
dwCb = sizeof(RASENTRY);
DWORD dwEntryInfoSize = 0;
RASENTRY* pRasEntry;

afxDump << _T('Phone-book entries in the default phone book:

');
for (DWORD i = 0; i < dwEntryNames; i++)
{
// Get Entry Information
dwEntryInfoSize = 0;
dwErr = RasGetEntryProperties(NULL, pRasEntryNames[i].szEntryName, NULL, &dwEntryInfoSize, NULL, NULL);
pRasEntry = (RASENTRY*)new unsigned char[dwEntryInfoSize];
pRasEntry->dwSize = sizeof(RASENTRY);
dwErr = RasGetEntryProperties(NULL, pRasEntryNames[i].szEntryName, pRasEntry, &dwEntryInfoSize, NULL, NULL);

afxDump << pRasEntryNames[i].szEntryName << _T(':') << _T('
');
afxDump << _T(' Phone - ') << pRasEntry->szLocalPhoneNumber << _T('
');

// Loop through alternative phone numbers if such exist (Blimey!!!!)
if (pRasEntry->dwAlternateOffset > 0)
{
LPTSTR pAltPhone = (LPTSTR)((DWORD)pRasEntry + pRasEntry->dwAlternateOffset);
while (_tcslen(pAltPhone) > 0)
{
afxDump << _T(' Alt Phone - ') << pAltPhone
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
11.11.2009, 01:37     boombastiku. Как вытянуть альтернативные номера из адресной книги? #11
P.S. Следующую строку:
Код
pRasEntry = (RASENTRY*)new unsigned char[dwEntryInfoSize];
можно было бы записать красивее и понятнее:

Код
pRasEntry = (RASENTRY*)new BYTE[dwEntryInfoSize];
Просто опять сыграла привычка использовать правильный C++, тот что описан Страуструпом, и не использовать платформозависимые макросы, хотя там же я использовал DWORD ... эх ... заработался.
AlexFilan
0 / 0 / 0
Регистрация: 13.05.2009
Сообщений: 65
12.11.2009, 15:37  [ТС]     boombastiku. Как вытянуть альтернативные номера из адресной книги? #12
Огромное спасибо.

На счет 'Открываю rasphone.pbk и выдираю оттуда номера'.
Т.е открываю файл rasphone.pbk и считываю его.
Только вот как определить путь к адресной книге у меня не получилось.
Если только подсовывать его.
Он как INI файл

[MyConnect]
...
...
...
PhoneNumbre=номер1
...
PhoneNumbre=номер2
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
12.11.2009, 21:12     boombastiku. Как вытянуть альтернативные номера из адресной книги? #13
Ну это совсем просто делается: используется атрибут szPhonebookPath структуры RASENTRYNAME. Например вот так:
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
36
37
38
39
40
41
WORD dwCb = sizeof(RASENTRYNAME);
DWORD dwErr = ERROR_SUCCESS;
 
// Get Entries
DWORD dwEntryNames = 0;
RASENTRYNAME RasEntryName;
RASENTRYNAME* pRasEntryNames;
 
RasEntryName.dwSize = sizeof(RASENTRYNAME);
dwErr = RasEnumEntries(NULL, NULL, &RasEntryName, &dwCb, &dwEntryNames);
if (dwEntryNames < 1)
    return;
 
pRasEntryNames = new RASENTRYNAME[dwEntryNames];
pRasEntryNames[0].dwSize = sizeof(RASENTRYNAME);
dwErr = RasEnumEntries(NULL, NULL, pRasEntryNames, &dwCb, &dwEntryNames);
 
// Loop through entries
if (dwErr == ERROR_SUCCESS)
{
    DWORD dwEntryInfoSize = 0;
    RASENTRY* pRasEntry;
 
    afxDump << _T('Phone-book entries in the default phone book:
 
');
    for (DWORD i = 0; i < dwEntryNames; i++)
    {
        // Display name and phonebook path of an entry
        afxDump << pRasEntryNames[i].szEntryName << _T(' : ') << pRasEntryNames[i].szPhonebookPath << _T('
');
    }
}
else
{
    afxDump << _T('RasEnumEntries failed: Error = ') << dwErr << _T('
');
}
 
// Cleaning
delete[] pRasEntryNames;
Однако этот атрибут поддерживается только в новых версиях Windows - начиная с Windows 2000 (насколько мне известно в Windows 9x эти данные вообще хранились в реестре), поэтому, чтобы проект откомпилировался нормально необходимо изменить значение WINVER в файле stdafx.h проекта на соответствующее Windows 2000 или выше.

Например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// stdafx.h : include file for standard system include files,
...
// Было
/*
#ifndef WINVER
#define WINVER 0x0400
#endif
*/
// Стало
#ifndef WINVER
#define WINVER 0x0500
#endif
...
Удачи, Владимир
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.11.2009, 21:14     boombastiku. Как вытянуть альтернативные номера из адресной книги?
Еще ссылки по теме:

Книги Г.Шилдта в каком порядке нужно или какие книги для изучения с++ - C++
Скажите в каком порядке надо читать книги Г.Шилдта для изучения с++ . Возможно сначала придется с учить , или как лучше ? Или подскажите...

Вытянуть число из массива - C++
Есть массив unsigned char mass; и он содержит некое число, при чём, у числа цифры забиты в отдельный байт. Пример - есть число 8500 - и...

Вытянуть номер телефона - C++
Здравствуйте. У меня есть некоторый текст: Привет, меня зовут Саша. Мой номер телефона 050-123-45-67. Подскажите пожалуйста как...

Нужно вытянуть путь из переменной - C++
Есть переменная CString ProcPath. В ней лежит путь и имя исполняемой программы. Мне нужно вытянуть из этой переменной путь. Если я пишу...


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

Или воспользуйтесь поиском по форуму:
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
12.11.2009, 21:14     boombastiku. Как вытянуть альтернативные номера из адресной книги? #14
P.S. Правда после этого нужно быть готовым к тому, что программа перестанет работать с более ранними версиями Windows.
Yandex
Объявления
12.11.2009, 21:14     boombastiku. Как вытянуть альтернативные номера из адресной книги?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru