Вызов PeerGroupCreateInvitation из C # - PullRequest
0 голосов
/ 24 июля 2011

Описание функции здесь.

Я изо всех сил пытаюсь понять, правильно ли вызывать эту функцию из 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);

Мое лучшее предположение - 5-й параметр, "pRoles". Я должен отправить ему указатель на один или два 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?)

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

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

Декларация:

[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);

Ответы [ 2 ]

0 голосов
/ 24 июля 2011

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

Взгляните сюда

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

0 голосов
/ 24 июля 2011

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

[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); 
...