Llamar a PeerGroupCreateInvitation de C#
-
25-10-2019 - |
Pregunta
Función descriptiva aquí.
Estoy luchando por darle la pena llamar a esta función desde C#. Estoy en una etapa en la que lo llamo, pero está devolviendo E_invalidarg.
Lo he configurado de la siguiente manera ...
[DllImport("p2p.dll", CharSet=CharSet.Unicode)]
internal static extern uint PeerGroupCreateInvitation(IntPtr hGroup, string pwzIdentityInfo, IntPtr pftExpiration, int cRoles, IntPtr pRoles, out string ppwzInvitation);
Mi mejor suposición es el quinto parámetro, "Proles". Se supone que debo enviarle un puntero a uno o dos GUID que representen el tipo de rol.
PEER_GROUP_ROLE_ADMIN
PEER_GROUP_ROLE_MEMBER
Actualmente no tengo idea de cómo hacer esto desde C#.
En C, este parámetro se ve así cuando llamas a la función ...
..., (PEER_ROLE_ID*) &PEER_GROUP_ROLE_MEMBER, ...
Peer_role_id parece un tipo de sistema. Peer_group_role_member se parece al guía real. (¿Puedo obtener esto del archivo p2p.dll?)
Cualquier ayuda sería muy apreciada ... especialmente porque hay información cercana a cero en esta función en Internet.
Solución de trabajo después de los comentarios de todos.
Declaración:
[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);
Vocación:
uint hr = PeerGroupCreateInvitation(hGroup, identityInfo, 0, 1, ref PEER_GROUP_ROLE_MEMBER, out pInvitation);
... donde peer_group_role_member es el system.guid para este rol.
Obteniendo la invitación:
string invitation = Marshal.PtrToStringAuto(pInvitation);
Solución
Esta es la declaración correcta:
[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);
Otros consejos
Como @strenr ha dicho que deberías usar un ref Guid
argumento para pasar el GUID por los proles. Sin embargo, y es posible que ya haya decidido en contra de esto, ¿ha echado un vistazo al soporte de igual a igual de WCF? ¿Esto le daría la mayoría de las capacidades de igual a igual que ya están envueltas en una interfaz .NET?
Echa un vistazo aquí
http://msdn.microsoft.com/en-us/library/system.net.peertoper.aspx