К списку форумов К списку вопросов
RAS API -> .NET
VaS
10.08.2004 - 14:43
Переносим вот это:
.
typedef struct _RASENTRYNAME {
  DWORD dwSize;
  TCHAR szEntryName[RAS_MaxEntryName + 1];
#if (WINVER >= 0x500)
  DWORD dwFlags;
  TCHAR szPhonebookPath[MAX_PATH + 1];
#endif
} RASENTRYNAME;
.
DWORD RasEnumEntries (
  LPCTSTR reserved, // reserved, must be NULL
  LPTCSTR lpszPhonebook, // pointer to full path and
                                 // file name of phone-book file
  LPRASENTRYNAME lprasentryname, // buffer to receive
                                 // phone-book entries
  LPDWORD lpcb, // size in bytes of buffer
  LPDWORD lpcEntries // number of entries written
                                 // to buffer
);
.
Вот так:
.
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public class RasEntry
{
  public uint Size;
  [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 257)]
  public string Name = null;
  public uint Flags;
  [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 261)]
  public string PhonebookPath;
};
.
[DllImport("rasapi32.dll", EntryPoint = "RasEnumEntriesW",
SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true,
CallingConvention = CallingConvention.StdCall)]
public static extern int RasEnumEntries(
  [MarshalAs(UnmanagedType.LPTStr)]string Reserved,
  [MarshalAs(UnmanagedType.LPTStr)]string Phonebook,
  [In, Out]RasEntry[] RasEntryName,
  [In, Out]uint Cb,
  [Out]uint Entries
);
.
Вызов:
.
private const int MaxEntries = 100;
...
uint EntrySize = 532;
uint Num = 0;
string[] Result = null;
uint BuffSize = EntrySize * MaxEntries;
RasEntry[] Entries = new RasEntry[MaxEntries];
for (int I = 0; I < MaxEntries; I++)
  Entries[I] = new RasEntry();
Entries[0].Size = EntrySize;
int Res = RasEnumEntries(null, null, Entries, BuffSize, Num);
.
Res = "Обнаружен неверный размер структуры". Пытался делать EntrySize от 0 до 10000 - то же самое. Такое впечатление, что где-то неверно объявил обертку над RasEnumEntries()...
Roman B
1 - 11.08.2004 - 00:12
EnterySize=sizeof(RasEntery);
RasEnumEntries вернет после вызова в переменную BuffSize требуемый размер буфера.
Roman B
2 - 11.08.2004 - 00:14
Нда, было время когда оператор "взять адресс" использовали...
VaS
3 - 11.08.2004 - 15:05
sizeof() нельзя применять в управляемом коде.
Marshal.SizeOf() возвращает 1052, что многова-то и ситуацию не спасает.
Roman B
4 - 11.08.2004 - 20:32
В моем описании эта структура выглядит так, попробуй, чем черт не шутит.
typedef struct _RASENTRYNAME {
  DWORD dwSize;
  TCHAR szEntryName[RAS_MaxEntryName + 1];
}
VaS
5 - 12.08.2004 - 10:10
Именно с такой структуры и начинал :) То же самое.
Roman B
6 - 12.08.2004 - 21:33
[In, Out] означает указатель?
может так
[In, Out]uint *Cb
[Out]uint *Entries
или так надо
[In, Out]lpuint Cb
[Out]lpuint Entries
PS: Я в .NET не разбираюсь. :(

К списку вопросов на форуме Программирование

>>