使用 DLL 映射網路驅動器<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />你好,
我希望能夠使用 DLL 作為 JSL 檔案的一部分來映射(然後取消映射)到特定網路磁碟機。 透過與一些內部 IT 人員交談,他們向我指出了 mpr.dll 以及 WNetAddConnection2 和 WNetCancelConnection2 函數。 但是,我不是專家程式設計師,因此即使我查看了腳本指南中的範例以及此討論板上的範例(它們做了令人驚奇的事情),我也無法讓我的範例工作。 另外,我以前從未在我做過的任何編程中調用過 DLL... 有人可以幫我嗎?
到目前為止,我拼湊在一起的程式碼(來自一位閱讀幫助文件但不了解 JMP 的 IT 同事)如下。 任何人都可以看到明顯的錯誤嗎? 我真的很感激你的幫忙...
謝謝
柯林
(抱歉,格式不太好。 我嘗試了一些選項,但它們看起來很奇怪)
// 使用者名稱、密碼、網路地圖位置均已更改,以便貼到此處
//載入需要的DLL
dll_obj = 載入Dll("mpr.dll");
//將常數分配給結構成員 - 請參閱下面的常數清單以供參考
// 這些在 dll 中定義為 DWORD(無符號正整數)
dwScope = HexToNumber("00000002"); //&H2;
dwType = HexToNumber("00000001"); //&H1;
dwDisplayType = HexToNumber("00000003"); //&H3;
dwUsage = HexToNumber("00000001"); //&H1;
dwFlags = HexToNumber("00000004"); //&H4;
lpLocalName = "Z:";
lp遠端名稱 = " \\10.254.1.1\!驅動器\ ”;
lpComment = "";
lpProvider =“”;
lpPassword = "密碼"; // 網路密碼
lpUserName = "網域\使用者名稱";
//宣告匯出函數並設定別名
dll_obj << 宣告函數(
“WNetAddConnection2”,
別名(“MapNetworkDrive”),
結構參數(
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(AnsiString, "lpPassword", 輸入),
Arg(AnsiString, "lpUserName", 輸入),
Arg(Int32,“dwFlags”,輸入),
傳回值(Int32)
);
//函數處理-映射驅動
/* DLL 函數呼叫語法
dll_obj << 別名(
結構(每個Arg),
密碼參數,
使用者名稱Arg,
DWFlagsArg
);
*/
結果 = dll_obj << MapNetworkDrive(
dw範圍,
dw類型,
dw顯示類型,
dw用法,
lp本地名稱,
lp遠端名稱,
lp評論,
lpProvider,
lp密碼,
lp用戶名,
dw標誌
);
// 成功連線應傳回 0 (NO_ERROR)
// 卸載DLL
dll_obj << 卸載DLL
回覆:使用 DLL 來映射網路磁碟機要取消映射驅動器,這對我有用:
dll_obj << DeclareFunction(
"WNetCancelConnection2A",
Alias("UnmapNetworkDrive"),
Arg(AnsiString, "lpName", input),
Arg(Int32, "dwFlags", input),
Arg(Int32, "fForce", input),
Returns(Int32)
);
叫它:
result = dll_obj << UnmapNetworkDrive(
lpLocalName,
0,
0, // 1=force connection closed even if files are opened
);
回覆:使用 DLL 來映射網路磁碟機我使用您提到的 API 並進行了一些更改,取得了一些成功。 這是我的改變:
* 變更為使用 WNetAddConnection2A,「A」表示 Ansi,因此您需要呼叫此版本。 如果您在 Args 中指定了 UnicodeString,則可以使用 WNetAddConnection2W。
* 將 lpProvider 變更為 Int64,以便能夠為提供者傳遞 0 (NULL)。
//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)
);
用零呼叫提供者,讓作業系統選擇提供者。
result = dll_obj << MapNetworkDrive(
dwScope,
dwType,
dwDisplayType,
dwUsage,
lpLocalName,
lpRemoteName,
lpComment,
0, // lpProvider = NULL
lpPassword,
lpUserName,
dwFlags
);
我發現的一個警告是,如果我已經有一個映射到指定伺服器的驅動器,它會傳回 1219 (ERROR_SESSION_CREDENTIAL_CONFLICT)。 不確定需要什麼來避免這種情況,但如果我連接到沒有現有連接的伺服器,它會正常工作。
希望這可以幫助,
約翰
回覆:使用 DLL 來映射網路磁碟機您沒有說明您正在使用哪個版本的 JMP,但如果您能夠使用剛發布的 JMP 11,則可以使用新的「執行程式」命令來執行此操作。
Run Program( Executable("net.exe"), Options("use z: \\myserver\share") );並取消映射驅動器
Run Program( Executable("net.exe"), Options("use z: /del") );這相當於運行“net use z: \\我的伺服器\共享“從命令提示字元中。
約翰