Hallo,
ich versuche seit Tagen mit WNetAddConnection2 eine Laufwerksfreigabe zu einem anderen PC zu nutzen. Als Rückgabewert erhalte ich die 87. Zum ersten, was bedeutet der Wert, was muss ich ändern, damit es funktioniert.
Ich habe die Funktion vor längerer Zeit in einem C++ Programm genutzt, mit der gleichen Parametrierung. Das Programm funktioniert noch heute.
Hier der Code, ich habe ihn von pinvoke.net zum größten Teil übernommen.
class netConnection
{
[DllImport("mpr.dll")]
public static extern int WNetAddConnection2(ref NETRESOURCE netResource,
string password, string username, int flags);
private const Int32 CONNECT_INTERACTIVE = 0x00000008;
public enum ResourceScope
{
RESOURCE_CONNECTED = 1,
RESOURCE_GLOBALNET,
RESOURCE_REMEMBERED,
RESOURCE_RECENT,
RESOURCE_CONTEXT
};
public enum ResourceType
{
RESOURCETYPE_ANY = 0,
RESOURCETYPE_DISK = 1,
RESOURCETYPE_PRINT = 2,
RESOURCETYPE_RESERVED = 8,
RESOURCETYPE_UNKNOWN = -1,
};
public enum ResourceUsage
{
RESOURCEUSAGE_CONNECTABLE = 0x00000001,
RESOURCEUSAGE_CONTAINER = 0x00000002,
RESOURCEUSAGE_NOLOCALDEVICE = 0x00000004,
RESOURCEUSAGE_SIBLING = 0x00000008,
RESOURCEUSAGE_ATTACHED = 0x00000010,
RESOURCEUSAGE_ALL = (RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_ATTACHED),
};
public enum ResourceDisplayType
{
RESOURCEDISPLAYTYPE_GENERIC,
RESOURCEDISPLAYTYPE_DOMAIN,
RESOURCEDISPLAYTYPE_SERVER,
RESOURCEDISPLAYTYPE_SHARE,
RESOURCEDISPLAYTYPE_FILE,
RESOURCEDISPLAYTYPE_GROUP,
RESOURCEDISPLAYTYPE_NETWORK,
RESOURCEDISPLAYTYPE_ROOT,
RESOURCEDISPLAYTYPE_SHAREADMIN,
RESOURCEDISPLAYTYPE_DIRECTORY,
RESOURCEDISPLAYTYPE_TREE,
RESOURCEDISPLAYTYPE_NDSCONTAINER
};
[StructLayout(LayoutKind.Sequential)]
public class NETRESOURCE
{
public ResourceScope dwScope = 0;
public ResourceType dwType = 0;
public ResourceDisplayType dwDisplayType = 0;
public ResourceUsage dwUsage = 0;
public string lpLocalName = null;
public string lpRemoteName = null;
public string lpComment = null;
public string lpProvider = null;
};
public static int verbinden(int myflag)
{
NETRESOURCE nr = new NETRESOURCE();
nr.dwScope = ResourceScope.RESOURCE_GLOBALNET;
nr.dwType = ResourceType.RESOURCETYPE_DISK;
nr.dwDisplayType = ResourceDisplayType.RESOURCEDISPLAYTYPE_GENERIC;
nr.dwUsage = ResourceUsage.RESOURCEUSAGE_CONNECTABLE;
nr.lpLocalName = "Y:";
nr.lpRemoteName = "\\\\10.180.1.20\\d$";
nr.lpComment = null;
nr.lpProvider = null;
return WNetAddConnection2(ref nr, "passwort", "benutzer", CONNECT_INTERACTIVE);
}
}
Vielen Dank im voraus!
Deine Parameter sind Falsch. Möglicherweise das "ref". Muss das nicht ein INTPTR oder so sein? Kanns grade nicht nachprüfen.
Hallo Alf Ator,
vielen Dank für die schnelle Antwort und den Link mit den Error-Codes!
Ich bin in C# leider nur Anfänger, aber das "ref" kann eigentlich gar nicht so falsch sein. Es muss in der Methodendefinition und Methodenaufruf angegeben werden. Fehlt eine, bekommnt man eine Fehlermeldung, das habe ich schon erfahren müssen.
Mit dem "INTPTR" muss ich mich erst einmal einlesen, den kenne ich gar nicht.
MfG
hobbysucher
Im Beispiel auf PInvoke steht doch
[DllImport("mpr.dll")]
public static extern int WNetAddConnection2( [In] NETRESOURCE netResource, string password, string username, int flags);
bzw.
[DllImport("Mpr.dll", EntryPoint="WNetAddConnection2", CallingConvention=CallingConvention.Winapi)]
private static extern ErrorCodes WNetAddConnection2(NETRESOURCE lpNetResource,ref string lpPassword,ref string lpUsername, System.UInt32 dwFlags );
je nachdem. Keins davon kann ich bei Dir erkennen.
Selbst in den anderen Beispielen sehen alle Imports anders aus als bei Dir; ich sehe nirgends ein ref.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hallo Abt,
das war es auch.
Ich hatte Vergleiche mit meinem alten C++ Programm gemacht. Dort wird der erste Parameter als Referenz übergeben, weil er dort eine Struktur ist. Da war für mich klar, es muss hier genaus sein, das war aber ein Fehler.
Nochmals vielen Dank!
MfG
hobbysucher