На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> RAS + Coredll , Проблема при получении параметров учетной записи
    Здравствуйте!

    Я хочу установить сетевое соединение из программы на C# (.NET CF 2.0), для этого пытаюсь использовать API-функции из Coredll.dll:
    RasEnumEntries - для получения списка имен существующих учетных записей
    RasGetEntryDialParams - для получения параметров учетной записи
    RasDial - для установления соединения

    RasEnumEntries удалось успешно выполнить, она возвращает список учетных записей, однако, почему-то только у одного элемента списка заполнено имя. Дальше беру это имя и пытаюсь получить параметры записи через RasGetEntryDialParams,которая завершается с кодом ошибки 87, и никак не пойму в чем дело.

    Вот код:
    ExpandedWrap disabled
      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;
      }
      Вероятнее всего функции не нравится первый null. Попробуй передать или указатель на пустую строку, или реальное имя записной книжки как-то получить.
        вот что сказано про параметр 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 прекрасно срабатывает и устанавливает сетевое соединение

        всем спасибо. вопрос закрыт
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0210 ]   [ 16 queries used ]   [ Generated: 24.04.24, 20:03 GMT ]