DLL을 사용하여 네트워크 드라이브 매핑<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />안녕하십니까,
DLL을 사용하여 JSL 파일의 일부로 특정 네트워크 드라이브에 매핑(및 매핑 해제)할 수 있기를 원합니다. 일부 내부 IT 담당자와 대화를 통해 mpr.dll과 WNetAddConnection2 및 WNetCancelConnection2 기능을 알려 주었습니다. 그러나 저는 전문 프로그래머가 아니므로 Scripting Guide의 예제와 이 토론 게시판의 예제(놀라운 일을 함)를 살펴보았지만 제 작업을 수행할 수 없습니다. 또한, 내가 한 프로그래밍에서 전에 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:";
lpRemoteName = " \\10.254.1.1\!드라이브\ ";
lpComment = "";
lpProvider = "";
lpPassword = "비밀번호"; // 네트워크 비밀번호
lpUserName = "도메인\사용자 이름";
//내보낸 함수 선언 및 별칭 설정
dll_obj << DeclareFunction(
"WNetAddConnection2",
별칭("MapNetworkDrive"),
구조체 인수(
인수(Int32, "dwScope"),
인수(Int32, "dwType"),
인수(Int32, "dwDisplayType"),
인수(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,
DWFlagsArg
);
*/
결과 = dll_obj << 맵네트워크드라이브(
dw스코프,
dw 유형,
dw디스플레이 유형,
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를 사용하여 약간의 성공을 거두었습니다. 변경 사항은 다음과 같습니다.
* WNetAddConnection2A를 사용하도록 변경 'A'는 Ansi를 의미하므로 이 버전을 호출해야 합니다. Args에 UnicodeString을 지정한 경우 WNetAddConnection2W를 사용할 수 있습니다.
* 공급자에 대해 0(NULL)을 전달할 수 있도록 lpProvider를 Int64로 변경했습니다.
//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가 공급자를 선택할 수 있도록 공급자에 대해 0으로 호출합니다.
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: \\내 서버\공유 " 명령 프롬프트에서.
남자