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 = Load 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:";
lpRemoteName = " \\10.254.1.1\!ドライブ\ ";
lpComment = "";
lpProvider = "";
lpPassword = "パスワード"; // ネットワークパスワード
lpUserName = "ドメイン\ユーザー名";
//エクスポートされた関数を宣言し、エイリアスを設定します
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"),
"ネットリソース",
入力
)、
Arg(AnsiString, "lpPassword", 入力),
Arg(AnsiString, "lpUserName", 入力),
Arg(Int32, "dwFlags", 入力),
戻り値(Int32)
);
//関数処理 - ドライブのマップ
/* DLL 関数呼び出し構文
dll_obj << エイリアス(
構造体(すべての引数)、
PasswordArg、
ユーザー名Arg、
DWFlagsArg
);
*/
結果 = dll_obj << MapNetworkDrive(
dwスコープ、
dwType、
dwDisplayType、
dw使用法、
lpLocalName、
lpRemoteName、
lpコメント、
lpプロバイダー、
lpパスワード、
lpユーザー名、
dwFlags
);
// 接続が成功すると 0 (NO_ERROR) が返されます
// DLL をアンロード
dll_obj << UnloadDll
Re: 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
);
Re: DLL を使用してネットワーク ドライブをマッピングするいくつかの変更を加えて、あなたが言及した API を使用してある程度成功しました。 ここに私の変更があります:
* 「A」は Ansi を意味する WNetAddConnection2A を使用するように変更されたため、このバージョンを呼び出す必要があります。 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)
);
OS がプロバイダーを選択できるようにするには、プロバイダーをゼロで呼び出します。
result = dll_obj << MapNetworkDrive(
dwScope,
dwType,
dwDisplayType,
dwUsage,
lpLocalName,
lpRemoteName,
lpComment,
0, // lpProvider = NULL
lpPassword,
lpUserName,
dwFlags
);
私が見つけた警告は、指定されたサーバーにマップされたドライブが既にある場合、1219 (ERROR_SESSION_CREDENTIAL_CONFLICT) を返すことです。 それを回避するために何が必要かはわかりませんが、既存の接続がないサーバーに接続すると正常に動作します。
お役に立てれば、
ジョン
Re: DLL を使用してネットワーク ドライブをマッピングする使用している JMP のバージョンはわかりませんが、リリースされたばかりの JMP 11 を使用できる場合は、新しい Run Program コマンドを使用してこれを行うことができます。
Run Program( Executable("net.exe"), Options("use z: \\myserver\share") );ドライブのマッピングを解除します
Run Program( Executable("net.exe"), Options("use z: /del") );これは、"net use z: \\myserver\share " コマンドプロンプトから。
ジョン