2011-07-24 7 views
0

описание функций here.Вызов PeerGroupCreateInvitation из C#

Я изо всех сил, чтобы получить право называть эту функцию из C#. Я нахожусь на этапе, где я его называю, но он возвращает E_INVALIDARG.

Я установил его следующим образом ...

[DllImport("p2p.dll", CharSet=CharSet.Unicode)] 
internal static extern uint PeerGroupCreateInvitation(IntPtr hGroup, string pwzIdentityInfo, IntPtr pftExpiration, int cRoles, IntPtr pRoles, out string ppwzInvitation); 

Моя догадка является пятым параметром, «пролетарии». Я должен послать ему указатель на один или два идентификатора GUID, представляющих тип роли.

PEER_GROUP_ROLE_ADMIN 
PEER_GROUP_ROLE_MEMBER 

У меня нет подсказки в настоящее время, как это сделать с C#.

В C этот параметр выглядит следующим образом при вызове функции ...

..., (PEER_ROLE_ID*) &PEER_GROUP_ROLE_MEMBER, ... 

PEER_ROLE_ID выглядит как System.Guid типа. PEER_GROUP_ROLE_MEMBER выглядит как фактический GUID. (Могу ли я получить это из файла p2p.dll?)

Любая помощь будет принята с благодарностью ... особенно, поскольку в этой функции в Интернете есть информация о ZERO.

Рабочее решение после комментариев каждого.

Декларация:

[DllImport("p2p.dll")] 
public static extern uint PeerGroupCreateInvitation(IntPtr hGroup, [MarshalAs(UnmanagedType.BStr)] string pwzIdentityInfo, int pftExpiration, int cRoles, ref Guid pRoles, out IntPtr ppwzInvitation); 

Вызов:

uint hr = PeerGroupCreateInvitation(hGroup, identityInfo, 0, 1, ref PEER_GROUP_ROLE_MEMBER, out pInvitation); 

... где PEER_GROUP_ROLE_MEMBER это в System.Guid для этой роли.

Получение приглашения:

string invitation = Marshal.PtrToStringAuto(pInvitation); 
+0

вы настройки cRoles числу PROLE GUIDs? И не должны ли pRoles быть списком целых чисел для представления указателей. –

ответ

0

Это правильное заявление:

[DllImport("p2p.dll")] 
public static extern uint PeerGroupCreateInvitation( 
       IntPtr hGroup, /* Updated with @RedDude's suggestion */ 
       [MarshalAs(UnmanagedType.BStr)] string pwzIdentityInfo, 
       int pftExpiration, // 32 bit, not 64 bit 
       int cRoles, 
       ref Guid pRoles, 
       out IntPtr ppwzInvitation); 
+0

pwzIdentityInfo не должен быть маршализирован как BSTR. BSTR - это строка с префиксом длины в формате unicode, сигнатура функции указывает, что она ожидает строку с нулевым символом unicode. –

+0

@sternr Мертвые на деньги! Я сделал одно изменение в вашей декларации «IntPtr hGroup», а не «int hGroup». – RedDude

+0

@ Крис, я попытался удалить «[MarshalAs (UnmanagedType.BStr)]», и он обрывается без него. – RedDude

0

Как @strenr уже сказал, что вы должны использовать ref Guid аргумент передать GUID для пролетарии. Однако, возможно, вы уже решились на это, взглянули ли вы на поддержку одноранговой сети WCF? Это даст вам большую часть возможностей одноранговой сети, уже завернутых в .NET-интерфейс?

Посмотрите здесь

http://msdn.microsoft.com/en-us/library/system.net.peertopeer.aspx

+0

Спасибо Крису. Я начал с .NET p2p, но он просто не был таким «полным», как в p2p.dll.Обязательно заглянем в нее снова, хотя это были мои первые мысли. – RedDude

 Смежные вопросы

  • Нет связанных вопросов^_^