2011-07-24 6 views
0

Description de la fonction here.Appel PeerGroupCreateInvitation de C#

Je me bats pour obtenir ce droit d'appeler cette fonction de C#. Je suis à un stade où je l'appelle mais il retourne E_INVALIDARG.

Je l'ai établi comme suit ...

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

Ma meilleure estimation est le 5ème paramètre, « prolos ». Je suis censé lui envoyer un pointeur vers un ou deux GUID représentant le type de rôle.

PEER_GROUP_ROLE_ADMIN 
PEER_GROUP_ROLE_MEMBER 

Je n'ai aucune idée actuellement comment faire cela à partir de C#.

En C ce paramètre ressemble à ceci lorsque vous appelez la fonction ...

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

PEER_ROLE_ID ressemble à un type System.Guid. PEER_GROUP_ROLE_MEMBER ressemble au GUID réel. (Puis-je l'obtenir à partir du fichier p2p.dll?)

Toute aide serait grandement appréciée ... d'autant plus qu'il y a près de ZERO info sur cette fonction sur internet.

Solution de travail après les commentaires de tous.

Déclaration:

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

Appel:

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

... où PEER_GROUP_ROLE_MEMBER est le System.Guid pour ce rôle.

Obtenir l'invitation:

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

sont paramètre que vous cRoles au nombre de GUIDs prolo? Et les pRoles ne devraient pas être une liste d'entiers pour représenter les guids. –

Répondre

0

Ceci est la déclaration correcte:

[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 ne doit pas être marshalé en tant que BSTR. BSTR est une chaîne unicode préfixée en longueur, la signature de la fonction indique qu'elle attend une chaîne unicode terminée par un caractère nul. –

+0

@sternr Mort sur l'argent! J'ai fait un changement à votre déclaration, "IntPtr hGroup" plutôt que "int hGroup". – RedDude

+0

@Chris, j'ai essayé d'enlever "[MarshalAs (UnmanagedType.BStr)]" et il se brise sans cela. – RedDude

0

Comme @strenr a dit que vous devez utiliser un argument ref Guid pour passer le GUID pour les prolos. Cependant, et vous avez peut-être déjà décidé de ne pas le faire, avez-vous jeté un coup d'œil sur le soutien peer-to-peer de la WCF? Cela vous donnerait la plupart des fonctionnalités peer-to-peer déjà enveloppés dans une interface .NET?

Jetez un coup d'oeil ici

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

+0

Merci Chris. J'ai commencé avec le .NET p2p stuff mais ce n'était pas aussi "complet" que ce qui est dans le p2p.dll.J'y retournerai sans hésiter, car ce n'étaient que mes premières pensées. – RedDude