Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.222.163.31] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте!
Я хочу установить сетевое соединение из программы на C# (.NET CF 2.0), для этого пытаюсь использовать API-функции из Coredll.dll: RasEnumEntries - для получения списка имен существующих учетных записей RasGetEntryDialParams - для получения параметров учетной записи RasDial - для установления соединения RasEnumEntries удалось успешно выполнить, она возвращает список учетных записей, однако, почему-то только у одного элемента списка заполнено имя. Дальше беру это имя и пытаюсь получить параметры записи через RasGetEntryDialParams,которая завершается с кодом ошибки 87, и никак не пойму в чем дело. Вот код: const int RAS_MaxEntryName = 256; const int RAS_MaxPhoneNumber = 128; const int RAS_MaxCallbackNumber = RAS_MaxPhoneNumber; const int UNLEN = 256; const int PWLEN = 256; const int DNLEN = 15; [DllImport("coredll.dll", SetLastError = true, CharSet = CharSet.Auto)] static extern int RasEnumEntries( IntPtr reserved, IntPtr lpszPhonebook, [In, Out] RASENTRYNAME[] lprasentryname, ref int lpcb, ref int lpcEntries); [DllImport("coredll.dll", CharSet = CharSet.Auto)] static extern int RasGetEntryDialParams( string lpszPhoneBook, ref RASDIALPARAMS lpRasDialParams, out bool lpfPassword); [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] struct RASENTRYNAME { public int dwSize; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxEntryName + 1)] public string szEntryName; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] struct RASDIALPARAMS { public int dwSize; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxEntryName + 1)] public string szEntryName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxPhoneNumber + 1)] public string szPhoneNumber; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxCallbackNumber + 1)] public string szCallbackNumber; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = UNLEN + 1)] public string szUserName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = PWLEN + 1)] public string szPassword; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = DNLEN + 1)] public string szDomain; } static int GetDialParams(string entryName) { RASDIALPARAMS rasDialParams = new RASDIALPARAMS(); rasDialParams.szEntryName = entryName; rasDialParams.dwSize = Marshal.SizeOf(typeof(RASDIALPARAMS)); bool passwordReturned; int ret = RasGetEntryDialParams(null, ref rasDialParams, out passwordReturned); // ret = 87, а успех при 0! return ret; } |
Сообщ.
#2
,
|
|
|
Вероятнее всего функции не нравится первый null. Попробуй передать или указатель на пустую строку, или реальное имя записной книжки как-то получить.
|
Сообщ.
#3
,
|
|
|
вот что сказано про параметр lpszPhoneBook функции RasGetEntryDialParams в MSDN:
lpszPhoneBook This parameter is ignored and should be set to NULL. Dial-up networking stores phone-book entries in the registry rather than in a phone-book file. http://msdn.microsoft.com/en-us/library/aa450847.aspx так что null - это правильное значение а вообще, оказалось, что можно прекрасно обойтись и без функции RasGetEntryDialParams: 1. создаем структуру RASDIALPARAMS 2. заполняем поле dwSize размером структуры 3. заполняем поле szEntryName именем используемой учетной записи, полученной через RasEnumEntries 4. вызываем RasDial с созданной структурой и то, что все остальные поля структуры RASDIALPARAMS не заполнены, не имеет значения, RasDial прекрасно срабатывает и устанавливает сетевое соединение всем спасибо. вопрос закрыт |