Zuordnen eines Netzlaufwerks zu einer DLL<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Hallo,
Ich möchte in der Lage sein, einem bestimmten Netzlaufwerk als Teil einer JSL-Datei mithilfe einer DLL eine Zuordnung zuzuordnen (und die Zuordnung dann aufzuheben). Durch Gespräche mit einigen internen IT-Mitarbeitern haben sie mich auf mpr.dll und die Funktionen WNetAddConnection2 und WNetCancelConnection2 aufmerksam gemacht. Allerdings bin ich kein erfahrener Programmierer, und obwohl ich mir die Beispiele im Scripting Guide und die Beispiele in diesem Diskussionsforum angesehen habe (die erstaunliche Dinge bewirken), kann ich meine nicht zum Laufen bringen. Außerdem habe ich noch nie zuvor in irgendeiner Programmierung, die ich durchgeführt habe, eine DLL aufgerufen ... Gibt es jemanden, der mir helfen kann?
Der Code, den ich bisher zusammengeschustert habe (von einem IT-Kollegen, der die Hilfedatei gelesen hat, aber JMP nicht kennt), ist unten. Kann jemand offensichtliche Fehler erkennen? Ich würde mich wirklich über die Hilfe freuen...
Danke
Colin
(Es tut mir leid, dass es nicht richtig formatiert wurde. Ich habe einige Optionen ausprobiert, aber sie sahen seltsam aus)
// Benutzername, Passwort, Netzwerkkartenspeicherort wurden alle zum Einfügen hier geändert
//Laden Sie die erforderliche DLL
dll_obj = Dll("mpr.dll" laden);
//Strukturmitgliedern Konstanten zuweisen – siehe Konstantenliste unten als Referenz
// Diese sind in der DLL als DWORD (vorzeichenlose positive Ganzzahlen) definiert.
dwScope = HexToNumber("00000002"); //&H2;
dwType = HexToNumber("00000001"); //&H1;
dwDisplayType = HexToNumber("00000003"); //&H3;
dwUsage = HexToNumber("00000001"); //&H1;
dwFlags = HexToNumber("00000004"); //&H4;
lpLocalName = "Z:";
lpRemoteName = " \\10.254.1.1\!Laufwerk\ ";
lpComment = "";
lpProvider = "";
lpPassword = "Passwort"; // Netzwerkpasswort
lpUserName = "Domäne\Benutzername";
//Exportierte Funktion deklarieren und Alias festlegen
dll_obj << DeclareFunction(
„WNetAddConnection2“,
Alias("MapNetworkDrive"),
StructArg(
Arg(Int32, „dwScope“),
Arg(Int32, „dwType“),
Arg(Int32, „dwDisplayType“),
Arg(Int32, „dwUsage“),
Arg(AnsiString, "lpLocalName"),
Arg(AnsiString, „lpRemoteName“),
Arg(AnsiString, „lpComment“),
Arg(AnsiString, „lpProvider“),
„NETRESSOURCE“,
Eingang
),
Arg(AnsiString, „lpPassword“, Eingabe),
Arg(AnsiString, „lpUserName“, Eingabe),
Arg(Int32, „dwFlags“, Eingabe),
Rückgabe(Int32)
);
//Funktionsverarbeitung - Laufwerk zuordnen
/* DLL-Funktionsaufrufsyntax
dll_obj << Alias(
Struktur (jedes Argument),
PasswortArg,
BenutzernameArg,
DWFlagsArg
);
*/
result = dll_obj << MapNetworkDrive(
dwScope,
dwType,
dwDisplayType,
dwUsage,
lpLocalName,
lpRemoteName,
lpComment,
lpProvider,
lpPassword,
lpBenutzername,
dwFlags
);
// Erfolgreiche Verbindung sollte 0 zurückgeben (NO_ERROR)
// DLL entladen
dll_obj << UnloadDll
Betreff: Ein Netzlaufwerk mit einer DLL zuordnenUm die Zuordnung des Laufwerks aufzuheben, funktioniert Folgendes für mich:
dll_obj << DeclareFunction(
"WNetCancelConnection2A",
Alias("UnmapNetworkDrive"),
Arg(AnsiString, "lpName", input),
Arg(Int32, "dwFlags", input),
Arg(Int32, "fForce", input),
Returns(Int32)
);
Nennen:
result = dll_obj << UnmapNetworkDrive(
lpLocalName,
0,
0, // 1=force connection closed even if files are opened
);
Betreff: Ein Netzlaufwerk mit einer DLL zuordnenMit der von Ihnen erwähnten API hatte ich mit ein paar Änderungen einige Erfolge. Hier sind meine Änderungen:
* Geändert, um WNetAddConnection2A zu verwenden. Das „A“ bedeutet Ansi, daher müssen Sie diese Version aufrufen. Sie könnten WNetAddConnection2W verwenden, wenn Sie UnicodeString in Ihren Argumenten angegeben hätten.
* lpProvider wurde in Int64 geändert, um 0 (NULL) für den Anbieter übergeben zu können.
//Declare exported function and set alias
dll_obj << DeclareFunction(
"WNetAddConnection2A",
Alias("MapNetworkDrive"),
StructArg(
Arg(Int32, "dwScope"),
Arg(Int32, "dwType"),
Arg(Int32, "dwDisplayType"),
Arg(Int32, "dwUsage"),
Arg(AnsiString, "lpLocalName"),
Arg(AnsiString, "lpRemoteName"),
Arg(AnsiString, "lpComment"),
// Arg(AnsiString, "lpProvider"),
Arg(Int64, "lpProvider"),
"NETRESOURCE",
input
),
Arg(AnsiString, "lpPassword", input),
Arg(AnsiString, "lpUserName", input),
Arg(Int32, "dwFlags", input),
Returns(Int32)
);
Rufen Sie den Anbieter mit Null auf, damit das Betriebssystem den Anbieter auswählen kann.
result = dll_obj << MapNetworkDrive(
dwScope,
dwType,
dwDisplayType,
dwUsage,
lpLocalName,
lpRemoteName,
lpComment,
0, // lpProvider = NULL
lpPassword,
lpUserName,
dwFlags
);
Eine Einschränkung, die ich gefunden habe, ist, dass 1219 (ERROR_SESSION_CREDENTIAL_CONFLICT) zurückgegeben wird, wenn dem angegebenen Server bereits ein Laufwerk zugeordnet ist. Ich bin mir nicht sicher, was es dort braucht, um das zu vermeiden, aber es funktioniert gut, wenn ich eine Verbindung zu einem Server verbinde, zu dem ich keine bestehende Verbindung habe.
Hoffe das hilft,
John
Betreff: Ein Netzlaufwerk mit einer DLL zuordnenSie sagen nicht, welche Version von JMP Sie verwenden, aber wenn Sie das gerade veröffentlichte JMP 11 verwenden können, können Sie dies mit dem neuen Befehl „Programm ausführen“ tun.
Run Program( Executable("net.exe"), Options("use z: \\myserver\share") );und um die Zuordnung des Laufwerks aufzuheben
Run Program( Executable("net.exe"), Options("use z: /del") );Dies entspricht dem Ausführen von „net use z: \\meinserver\freigabe " an einer Eingabeaufforderung.
John