Laden...

[gelöst] WNetAddConnection2 bringt Rückgabewerrt 87

Erstellt von hobbysucher vor 12 Jahren Letzter Beitrag vor 12 Jahren 4.567 Views
H
hobbysucher Themenstarter:in
12 Beiträge seit 2011
vor 12 Jahren
[gelöst] WNetAddConnection2 bringt Rückgabewerrt 87

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!

A
764 Beiträge seit 2007
vor 12 Jahren

System Error Codes (0-499)

Deine Parameter sind Falsch. Möglicherweise das "ref". Muss das nicht ein INTPTR oder so sein? Kanns grade nicht nachprüfen.

H
hobbysucher Themenstarter:in
12 Beiträge seit 2011
vor 12 Jahren

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

16.842 Beiträge seit 2008
vor 12 Jahren

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.

H
hobbysucher Themenstarter:in
12 Beiträge seit 2011
vor 12 Jahren

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