Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

Как лучше организовать хранение адресной книги? - C#
Доброго времени суток форумчане. Мне для работы программы нужно создать адресную книгу с которой пользователь выбрав в TreeView группу...

Путь к адресной книги в The Bat - Софт
Такая проблема с адресной книгой. Путь на нее ведет на съемный носитель, т.е. флешку. Меня путь на адр.книгу на жесткий. После выключения...

Импорт адресной книги формата .wab - VBA
Возможно ли по средствам VBA произвести импорт адресной книги из файла .wab?!

Скрипт внедрения адресной книги в Outlook - VBScript/JScript
Здравствуйте! На просторах интернета нашел скрипт внедрения адресной книги LDAP в outlook. Но есть в этом скрипте недоработочка (на мой...

Ошибка при инициализации адресной книги - Objective-C
#import <Foundation/Foundation.h> #import <AddressBook/AddressBook.h> int main(int argc, const char * argv) { ...

Импортировать карточки адресной книги в MacOS - Mac OS
ХЕЛП!!!!!!! Слетел макинтош, накрылся винчестер. Поставил другой винт, переустановил макос. Со старого винта вытащили карточки телефонной...

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

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

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

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

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

P.P.S. to smalig: спасибо за поддержку
0
Alexey
08.11.2009, 13:11 #5
to boombastik - чтоб я делал без вас :-D
AlexFilan
0 / 0 / 0
Регистрация: 13.05.2009
Сообщений: 65
08.11.2009, 14:07  [ТС] #6
Понял. Исправлюсь.
0
Ghost
08.11.2009, 17:25 #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  [ТС] #8
Пока пришлось сделать так:
Открываю rasphone.pbk и выдираю оттуда номера.
0
Ghost
09.11.2009, 13:39 #9
по-подробнее можно?
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
11.11.2009, 01:30 #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
0
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
11.11.2009, 01:37 #11
P.S. Следующую строку:
Код
pRasEntry = (RASENTRY*)new unsigned char[dwEntryInfoSize];
можно было бы записать красивее и понятнее:

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

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

[MyConnect]
...
...
...
PhoneNumbre=номер1
...
PhoneNumbre=номер2
0
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
12.11.2009, 21:12 #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
...
Удачи, Владимир
0
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
12.11.2009, 21:14 #14
P.S. Правда после этого нужно быть готовым к тому, что программа перестанет работать с более ранними версиями Windows.
0
12.11.2009, 21:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.11.2009, 21:14
Привет! Вот еще темы с ответами:

Вероятность вытянуть последовательно номера 1,2,3. - Теория вероятностей
помогите решить В мешочке содержится 10 одинаковых кубиков с номерами от 1 до 10. Наудачу извлекают по одному три кубика. Найти...

Подскажите плиз, где можно взять движок для адресной книги - Delphi
Надо движок для адресной книги на Делфе. Может кто в курсе.

В какой папке и в каком файле хранятся записи контакт-листа адресной книги uVNC? - Администрирование Windows
Добрый день! Вопрос по небезызвестному , а точнее для адресной книге для него - VNC Adress book. До этого пользовался , в котором...

Как задавать альтернативные названия папкам? - Windows 10
В корне диска C: есть папка &quot;Users&quot;, но проводник отображает ее как &quot;Пользователи&quot;. Тоже самое с папками &quot;Documents&quot;, &quot;Desktop&quot; и т.д....


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

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