delphi

네트워크 연결하기 / 연결끊기

knoen 2013. 12. 28. 22:41


네트워크 연결하기 / 연결끊기  델파이 

2011/07/28 10:49

복사http://blog.naver.com/cysnim12/130114379804

전용뷰어 보기

Network Connection Enable / Disable 제어 관련 내용입니다. 


인터넷을 구글해보니, 아래의 3가지 경우로 압축이 됩니다. 


Win32_NetworkAdapter Disable   Class 



1. WMI 기능 사용 

   - WMI 에서 Win32_NetworkAdapter Class를 사용하는 방법입니다. 
      해당 클래스에 Enable / Disable 멤버 함수가 존재합니다. 

      장점 : WMI, C++ 사용 가능 

      단점 : C++로 해도 구현 코드가 길고, C# 으로 사용하기 어려움. (사용방법이 떠오르지 않네요.) 

      참조 : http://msdn2.microsoft.com/en-us/library/aa394216(VS.85).aspx 


2. INetConnectionManager 인터페이스 사용 

  - Platform SDK에 있는 NetCon.h에 정의되어 있는 인터페이스를 사용해서 제어를 합니다. 

    해당 인터페이스를 이용해서 INetConnection 인터페이스를 구합니다. 

    INetConnection 인터페이스에 connect / disconnect 멤버 함수가 존재합니다. 

    장점 : C++ 사용 가능, 1번 항목보다 직관적이며 코딩량이 적음. 

    단점 : unmanaged C++에서만 사용가능. 심지어 managed C++에서조차 사용할 수 없음. 

    참조 : http://www.codeguru.com/forum/showthread.php?t=419909 작성자 ess1_il 


3. Shell Automation 이용 

  - Microsoft Shell and Automation을 참조하여 오토메이션 기능 사용 

    사용자가 "내 컴퓨터">"제어판">"네트워크 폴더" 로 이동하여 제어하고자 하는 네트워크 커넥션, 

    가령 이름이 "로컬 영역 연결" 인 네트워크 커넥션을 선택해서 오른쪽 마우스 클릭하여 컨텍스트 메뉴 중에서 

    "사용" / "사용 안 함"을 선택하는 과정을 자동화시켜 해당 기능을 구현함. 

    장점 : .NET 사용 가능. XP에서 테스트 완료함. 예제가 필요하시면 연락을... 

    단점 : 실행 환경이 어드민 권한을 요구함. 

             Vista 에서 테스트 해보지 않았으나 안될 가능성 90% 

             Windows XP 한글판 / 영어판 / 기타 언어판 에서 네트워크 폴더 명 및 사용 verb 다름. 

             가령 한글판 : "네트워크 연결" / "사용(&A) / "사용 안 함(&B", 

                    영어판 : "Network Connections" / "En&able" / "Disa&ble" 문자열을 사용해야 함. 

             C++로 구현 시 Shell Automation 관련 코딩량이 길어짐.

 

 

 

 

 

; Windows VISTA (BORLAND DELPHI)
; ==================================

function EnabelNetworkCard(cardName : String) : integer;
    var Retvar : integer;
        oBindObj : IDispatch;
        onetAdapters,oNetAdapter,
        oIpAddress,oGateWay,
        oWMIService,oSubnetMask : OleVariant;
        i,iValue : longword;
        oEnum : IEnumvariant;
        oCtx : IBindCtx;
        oMk : IMoniker;
        sFileObj : widestring;
    begin
        Retvar := 0;
        sFileObj := 'winmgmts:\\.\root\cimv2';

        // Connect to WMI - Emulate API GetObject()
        OleCheck(CreateBindCtx(0,oCtx));
        OleCheck(MkParseDisplayNameEx(oCtx,PWideChar(sFileObj),i,oMk));
        OleCheck(oMk.BindToObject(oCtx,nil,IUnknown,oBindObj));
        oWMIService := oBindObj;

        onetAdapters := oWMIService.ExecQuery('Select * from ' +
                                        'Win32_NetworkAdapter ' +
                                        'where Description = ' + '''' +
        CardName + '''');
        oEnum := IUnknown(oNetAdapters._NewEnum) as IEnumVariant;

    while oEnum.Next(1,oNetAdapter,iValue) = 0 do begin         try             ShowMessage(oNetAdapter.Description);
            Retvar := oNetAdapter.Enable;
        except
            Retvar := -1;
        end;
    onetAdapter := Unassigned;
    end;

    oGateWay := Unassigned;
    oSubnetMask := Unassigned;
    oIpAddress := Unassigned;
    onetAdapters := Unassigned;
    oWMIService := Unassigned;
    Result := Retvar;
end;

; Windows XP (BORLAND DELPHI)
; ==================================
; here you need to add 'Microsoft Shell Controls and Automation' go
; to Project|Import Type Library, uncheck 'Generate Component Wrapper', 
; Mselect 'Microsoft Shell Controls and Automation', and click Create 
; Unit; then, add Shell32_tlb to your unit's uses clause.

function ToggleLAN(const ConnectionName: string): Boolean;
    const
        EnableVerb = 'En&able'; //'사용(&A)'
        DisableVerb = 'Disa&ble'; //'사용 안 함(&B)'
        LANEnable: Boolean = True;
    var
        ShellApp: Shell32_tlb.Shell;
        ControlPanel: Shell32_tlb.Folder;
        FolderItem: Shell32_tlb.FolderItem;
        NetworkFolder: Shell32_tlb.Folder;
        LANConnection: Shell32_tlb.FolderItem;
        EnableVerbItem, DisableVerbItem, Verb : Shell32_tlb.FolderItemVerb;
        I,K: Integer;
begin
    Result := False;
    ShellApp := CoShell.Create;
    ControlPanel := ShellApp.NameSpace(ssfCONTROLS);
    //  test := ConnectionName;
    for I := 0 to ControlPanel.Items.Count - 1 do
    begin
        FolderItem := ControlPanel.Items.Item(I);
        //    ShowMessage(FolderItem.Name);
        if (FolderItem.Name = 'Network Connections') or
            (FolderItem.Name = 'Network and Dial-up Connections') or
            (FolderItem.Name = 'Network and Sharing Center') then
        begin
            NetworkFolder := FolderItem.GetFolder as Folder;
            Break;
        end;
    end;
    if NetworkFolder = nil then
        begin
        Result := False;
        Exit;
    end;
    for I := 0 to NetworkFolder.Items.Count - 1 do
    begin
        FolderItem := NetworkFolder.Items.Item(I);
        //    ShowMessage(FolderItem.Name);
        if FolderItem.Name = ConnectionName then
        begin
            LANConnection := FolderItem;
            Break;
        end;
    end;

    if LANConnection = nil then
    begin
        Result := False;
        Exit;
    end;

    for I := 0 to LANConnection.Verbs.Count - 1 do
        begin
            if LANConnection.Verbs.Item(I).Name = EnableVerb then
            begin
                EnableVerbItem := LANConnection.Verbs.Item(I);
                LANEnable := True;
                Break;
            end
            else if LANConnection.Verbs.Item(I).Name = DisableVerb then
            begin
                DisableVerbItem := LANConnection.Verbs.Item(I);
                LANEnable := False;
                Break;
            end;
        end;
        if LANEnable then
            EnableVerbItem.DoIt
        else
            DisableVerbItem.DoIt;
            Result := True

end;
 
 
메뉴에서 Component->Import ActiveX Control에서

Microsoft Shell Controls And Automation 선택

Create Unit 클릭

Delphi 설치된곳 아래 Imports 디렉토리에 Shell32_TLB.pas 파일 생성 됩니다.


'delphi' 카테고리의 다른 글

HTML 태그 접근법   (0) 2013.12.28
TWebBrowser에 직접 HTML 소스코드 넣기  (0) 2013.12.28
델파이 기초 - WebBrowser 기능 정리  (0) 2013.12.28
암호화  (0) 2013.12.28
WebBrowser에서 window.open 구별방법  (0) 2013.12.28