![]() |
![]() |
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 не разбираюсь. :( |